WAF的基础绕过
方法分类:
1、HTTP参数污染绕过
2、HTTP Header头部欺骗绕过
3、HTTP参数溢出绕过
4、HTTP分块传输绕过
5、HTTP数据编码绕过
6、HTTP Pipline绕过(Keep-alive)
7、HTTP协议未覆盖绕过
8、HTTP畸形包绕过
9、HTTP组合绕过
0x01 HTTP参数污染绕过
HTTP参数污染简称HPP
由于http协议允许同名参数的存在,同时waf的处理机制对同名参数的处理方式不同,造成“参数污染”。
假设一个url的原有参数为?id=1
那么提交的参数为:?id=1&id=2&id=3
不同的服务器搭配解析出不同的值
asp.net+iis:id=1,2,3 asp+iis:id=1,2,3 php+apache:id=3
那么如果waf检测的是url里面的第一个id值,那么在php+apache中是不是可以让第一个id值等于符合条件不触碰waf的字符,第三个id写我们自己的恶意代码,即可绕过执行。
0x02HTTP Header头部欺骗绕过
可以修改头部的各个参数,比如说:
waf可能会根据头部某个参数的值来进行是否拦截,有可能不是那个值就会拦截。
在一个请求包中我们可以加入一个缓存字段控制指令:Cache-control:no-transform
比如这样的结构,如果某个服务器站点,它与客户端通信的中间加了代理服务器,如果waf在代理服务器里面,那么客户端请求包中加入缓存字段控制指令就可以直接向源服务器请求。
0x03HTTP参数溢出绕过
有些waf要检测多个参数,比如说能检测100个请求参数,像之前的参数污染就没法绕过了,但是我们把该参数增加到101个,都是同名,那么第101个参数就可绕过waf了;
这是由于waf根本没有考虑参数溢出的情况,构造超过限制的参数即可绕过安全防护。
基于OpenResty构造的WAF:ngx_lua_waf、X-WAF、Openstar等,均受参数溢出的影响(CVE-2018-9230)
0x04HTTP分块传输绕过
分块传输即分块传输编码,把报文分割成若干个大小已知的块进行传输
长度标识处加上分号‘;’作为注释变形请求包加强绕过能力。
0x05HTTP数据编码绕过
编码绕过在绕waf中也是经常遇到的,通常waf只坚持他所识别的编码,比如说它只识别utf-8的字符,但是服务器可以识别比utf-8更多的编码。
那么我们只需要将payload按照waf识别不了但是服务器可以解析识别的编码格式即可绕过。
比如请求包中我们可以更改Content-Type中的charse的参数值,我们改为ibm037这个协议编码,有些服务器是支持的。payload改成这个协议格式就行了。
0x06HTTP Pipline绕过(keep-alive)
HTTP管道化允许多个http请求通过一个套接字同时被输出,而不用等待相应的响应。然后请求者就会等待各自的响应,这些响应是按照之前请求的顺序依次到达。因为多个请求可被同时传送,如果waf只检测第一个请求,而忽略后面的请求,便可被攻击者绕过。
我们把请求头中的Connection的参数值更改为keep-alive,然后向服务器同时发这样的三个请求过去,waf可能只检测第一个请求,后面请求就不检测了。那么我们将恶意代码放在后面两个请求中,即可达到绕过waf的目的。
0x07HTTP协议未覆盖绕过
HTTP头中Content-Type字段一般可以设置比较常见的四种参数提交方式:
1、application/x-www-form-urlencoded (默认编码方式)
2、multipart/form-data (文件上传方式指定传输数据为二进制数据,例如图片、视频、文件)
3、text/plain (纯文本的传输;空格转换为“+”,但不支持特殊字符编码。)
4、application/json (json报文格式传输)
就比如waf只检测普通的get和post,但是我们将请求包改为了上传(就是改content-type),那么即可绕过waf。
0x08HTTP畸形包绕过
当前的HTTP服务依据的是RFC2616标准(通常有以下8种方法:GET、POST、PUT、OPTION、HEAD、DELETE、TRACE、CONNECT)的HTTP请求,但是当我们向web服务器发送畸形请求时,也就是并非这个标准的HTTP数据包的时候,由于web服务器的一些兼容性的特性,会尽力解析这些畸形的数据包。
正常的含有恶意代码的数据包,比如说插入有sql语句的包:
那么正常的post包waf将会检测到恶意代码,就会拦截。
那么我们将请求方法改为一个不存在的http请求方法,构造成畸形包
那么waf可能说这不是post包,就不会拦截,况且这还不是其他方法的包,服务器会尽力去解这个包,可以解析那么运气好,可以绕过超过,不能解析那么再更改一些请求头中的参数;
例如:
head头的conten-type:TAB Host添加空格 Host域名后面添加“.” Cookie中垃圾数据填充 filename在content-type下面 Content-Type:multipart/form-data ;boundart=0000 大小写:Content-Type:mUltiPart/ForM-dATa; boundart=0000 Content-Type:multipart/form-dataX;boundart=0000 Content-Type:multipart/form-data,boundart=0000 Content-Type:multipart/form-data boundart=0000 Content-Type:multipart/whatever;boundart=0000 Content-Type:multipart/;boundart=0000 等...
这些也可以造成http请求包畸形。
0x09HTTP组合绕过
对于一些严格的waf需要配合更多绕过方法来搭配使用绕过:
1.HTTP参数溢出绕过+HTTP协议未覆盖绕过
2.HTTP分块传输绕过+HTTP数据编码绕过
3.HTTP分块传输绕过+HTTP协议未覆盖绕过
4.HTTP协议未覆盖绕过+HTTP畸形包绕过+HTTP数据编码绕过
5.HTTP畸形包+HTTP协议未覆盖绕过
等等还有更多的姿势