1.4.3 HTTP代理

HTTP代理是拦截HTTP/S通信,使用户能够在提交之前分析或者篡改数据的独立程序,它们通过运行一个本地的HTTP服务并重定向本地Web客户端来实现这一功能(通常是将客户端的代理配置设置为本地TCP端口,如8888)。本地HTTP服务(代理)作为“中间人”,并且允许对经过它的HTTP会话进行分析和篡改。

HTTP代理使用起来比浏览器扩展更笨重些,因为它们必须打断HTTP的自然流向。对于HTTPS(特别是具有客户端证书的)来说这个问题更明显,有些代理本身无法处理。前面我们已经了解到,浏览器扩展不需要担心这一点。

从正面看,HTTP代理能够分析和篡改非浏览器的HTTP客户端,这显然是基于浏览器扩展的工具做不到的。

总体上看,我们更喜欢基于浏览器的工具,因为它们通常更易用,并且让你更接近于应用的自然流向。但是,接下来将精选当前可用的HTTP代理,也是按照我们的偏好排列,最受推荐的列在最前面。

提示  试试Bayden Systems的IEToys,它包含了一个Proxy Toggle附加软件,对于使用HTTP代理时简单地切换配置很有价值。

Paros Proxy

Paros Proxy是一个免费的工具套件,包含了HTTP代理、Web漏洞扫描程序和网站爬虫(也称蜘蛛)模块。这个套件用Java编写,所以为了运行,必须安装http://java.sun.com的Java运行时引擎(JRE)。(Sun还提供了许多包含JRE的开发人员工具箱,不过它们还包含运行类似Paros Proxy的Java程序所不需要的附加组件)。Paros已经存在了一段时间,理所当然地成为最流行的Web应用安全评估工具之一。

我们现在主要关心的是Paros的HTTP代理,这是一个令人满意的分析工具,透明地处理HTTPS并且提供简单的“安全专家”使用模式,带有一个简单的请求及响应“陷阱”,能够很容易地篡改任一方向的HTTP事务。图1-7显示Paros篡改Bayden System示例购物应用中的“Cost”(价格)域(这个域非常诱人)。

图1-7 Paros Proxy捕捉一个HTTP POST请求,允许篡改隐含的“Cost”域

在HTTP代理中,我们认为Paros达到或者接近最高的水平,这是因为它有一系列简洁和健壮的功能,包括支持客户端证书的HTTPS拦截功能。当然,这种HTTP拦截由于注入了代理的“中间人”证书,必然会弹出恼人的“验证这个证书”窗口,但是在当前的HTTP代理技术下,这是意料之中的事情。

OWASP WebScarab

可能没有一种工具能够像OWASP的WebScarab这样具有多样化的功能,它包含了HTTP代理、爬虫、会话ID分析、自动化脚本接口、Fuzzer、用于所有流行Web格式(Base64、MD5等)的编码器/解码器工具,以及Web服务描述语言(WSDL)和SOAP解析程序等。它得到GNU通用公共许可协议第2版的授权。和Paros类似,WebScarab用Java编写,需要安装JRE。

WebScarab的HTTP代理具有一般的功能(包括HTTPS拦截,但是也有类似Paros的证书警告),还提供了多种附加的功能,例如SSL客户端证书支持、16进制或者URL编码参数的实时解码、内建会话ID分析、一次点击的“结束会话”等改进功能。图1-8显示了WebScarab篡改本章中一再提到的隐含的“Cost”域。

WebScarab在基本代理功能上可以与Paros相提并论,而且还为技术型用户提供了更多特性以便深入探索。但我们建议初级用户使用Paros,因为它更简洁。

ProxMon: 对于那些寻求WebScarab的红色“简易”按钮的人们来说,可以考虑ProxMon,这是一个iSEC Partners在2006年发行的免费工具,预编译的二进制代码可以用于基于Unix的和Windows平台。它分析WebScarab的Temporary或者Save目录,检查所有事务日志,报告安全相关事件,包括设置cookie的重要变量、发送cookie、查询串以及在不同网站上传递参数,还能根据自身包含的库进行漏洞检查。有一些可选的主动测试(-o)能够连接到目标主机,并且执行诸如上传文件等操作。ProxMon的主要目的是自动化完成Web应用渗透测试中乏味的部分,减少工作量、改进一致性,并且减少错误。如果你已经使用了类似WebScarab的工具,那么可以试试ProxMon或许对你的工作有所帮助。

图1-8 OWASP WebScarab的HTTP代理提供了参数的实时解码/编码,图中的例子使用隐含的“Cost”域

Fiddler

这个方便的工具是Eric Lawrence和Microsoft发行的免费软件,是我们见过的最好的非Java免费HTTP代理。对于操纵HTTP和HTTPS请求它非常在行。Fiddler只能运行在Windows上,并且要求安装Microsoft的.NET Framework 2.0或者更高版本。

Fiddler的界面分为三个子窗口:左边是Fiddler拦截的会话列表,右上方的窗口包含请求的详细信息,下面的窗口跟踪响应数据。在外部浏览器中像往常一样浏览Web时,Fiddler在左边的窗口记录每个请求和响应(两种数据都作为一个会话包含在同一行里)。点击一个会话时,右边的窗口显示请求和响应细节。

注意  Fiddler自动配置IE使用它的本地代理,其他浏览器如Firefox必须手工配置为localhost:8888。

为了篡改请求和响应,需要启用Fiddler的“断点”功能,这个功能可以用Rules(规则)菜单下的Automatic Breakpoints(自动断点)项访问。断点大致类似于Paros的“陷阱”和WebScarab的“拦截”功能。断点在默认情况下是禁用的,可以设置为在每个请求之前或者每个响应之后自动出现。我们一般设置为“请求之前”,这将导致浏览器在每次请求之前暂停,这时Fiddler会话中的最后一项将被加亮为红色。选择这个会话,右边的请求和响应窗口之间出现一个鲜红的工具栏。这个工具栏上有两个按钮,控制会话的后续流向:“break after response”(响应后中断)或者“run to completion”(运行到结束)。

现在你可以篡改请求中的任何数据,然后再按下这些按钮提交操纵过的请求。图1-9显示Fiddler篡改了老地方——Bayden Systems的“沙箱”在线购物应用中的“Cost”域。我们再次得到了订购产品的“特别优惠”。

总地来说,我们也喜欢Fiddler功能具有智能性,比如限制本地代理仅为出站通信(默认情况下)。Fiddler还包含对自动标志和编辑HTTP请求和响应的脚本支持;可以编写.NET代码在HTTP管道中调整请求和响应,可以编写和装入自己的定制检查器对象(使用任何.NET语言),只需要简单地将编译好的程序集.DLL放到\Fiddler\Inspectors文件夹并重启Fiddler就可以了。如果你想要一个无Java的HTTP/S代理,Fiddler应该是一流的选择。

图1-9 Fiddler通过篡改HTTP POST数据削减了价格。我们再次将价格从1995美元降到95美元

Burp Intruder

Burp Intruder是基于Java的HTTP代理,具有许多Web应用安全测试功能。一个较慢、功能较少的演示版本可以作为Burp Suite的一部分免费得到。单独的专业版价格为99英镑。

Burp Intruder的概念性模型对于初级用户来说不是很直观,但是如果你愿意花点精力去领会,它确实提供了一些有趣的功能。它的主要功能是根据给定的请求结构重复多种攻击。请求结构实际上必须通过应用的人工分析来收集。一旦在Burp Intruder中配置了请求结构,可以在Positions(位置)选项卡中确定各种攻击载荷的插入点,然后必须转到Payloads(载荷)选项卡配置载荷的内容。Burp Intruder提供各种打包的载荷,包括溢出测试载荷、它能重复地增加字符块和非法的Unicode编码输入。

设置好了位置和载荷,就可以启动Burp Intruder,它就会猛烈地开始重复每个攻击,在每个配置好的位置插入载荷并且记录响应。图1-10显示了Burp Intruder溢出测试的结果。

Burp Intruder的Ignore Response(忽略响应)模式对于模糊测试(Fuzz-testing)和拒绝服务测试很有帮助,但是它不是很适合于更加精确的、自定义的插入载荷工作。

图1-10 使用Burp Intruder进行溢出测试的结果。注意,响应从HTTP 404转变为HTTP 414,“Too Long”暗示着应用中存在某些内部限制

Google Ratproxy

Google于2008年7月宣布发行第一个Web安全工具,在安全社区掀起了巨浪。这个工具据说在发行之前在Google内部使用,很多人预期它将提供高级的Web安全审计功能,与Google公司的地位相当。之后,Ratproxy成为了前面提到的工具的固定附加程序。和目前讨论到的大部分其他代理工具类似,它是为有经验的安全专家设计的,需要对Web应用安全问题有着充分的理解,能有效地使用它并且理解其输出。

Ratproxy是一个命令行工具,可以在Unix/Linux环境下运行,包括较新的基于Unix的Mac OS。要在Windows下运行Ratproxy,必须从Unix/Linux模拟环境(如Cygwin)中运行(Ratproxy的在线文档中有一个链接,指向在Cygwin下运行该工具的指南)。

部署完毕后,Ratproxy像之前讨论过的其他代理一样运行:启动(选择合适的冗长模式并选择入侵级别)、配置浏览器指向Ratproxy监听端口(默认是localhost:8080),并通过浏览器使用目标网站试验所有可能的功能。Ratproxy将执行测试并且将结果记录到用户定义的日志文件。此后,可以使用内含的ratproxy-report.sh脚本从结果日志文件中生成一个HTML报告。图1-11中显示了Ratproxy正在检查一个网站。

注意  Ratproxy的作者不建议通过Ratproxy使用Web爬虫或者相似的工具,因此Ratproxy只限于手工测试。

提示  将Windows防火墙设置为允许Ratproxy正确运行(默认情况下,在较新的Windows版本中访问会被阻止)。还有,可能需要经常清除浏览器缓存,确保浏览器通过Ratproxy路由请求,而不是简单地从本地缓存中取出。

图1-11 在Windows 7上用Cygwin运行的Google ratproxy检查一个网站