HTTP Methods 测试

翻译


摘要

HTTP提供了许多方法,可用于在Web服务器上执行操作。这些方法中的许多方法旨在帮助开发人员部署和测试HTTP应用程序。如果Web服务器配置错误,则这些HTTP方法可用于恶意目的。此外,还检查了跨站点跟踪(XST)(一种使用服务器的HTTP TRACE方法的跨站点脚本编写形式)。

尽管GET和POST是迄今为止用于访问Web服务器提供的信息的最常用方法,但是超文本传输​​协议(HTTP)允许其他几种(且鲜为人知)方法。RFC 2616(描述了当今的HTTP版本1.1)定义了以下8种方法:

 

  • HEAD
  • GET
  • POST
  • PUT
  • DELETE
  • TRACE
  • OPTIONS
  • CONNECT

这些方法中的某些可能会给Web应用程序带来安全风险,因为它们使攻击者能够修改存储在Web服务器上的文件,并且在某些情况下会窃取合法用户的凭据。更具体地说,应禁用的方法如下:

  • PUT:此方法允许客户端在Web服务器上上传新文件。攻击者可以通过上传恶意文件(例如,通过调用cmd.exe来执行命令的asp文件)或仅通过使用受害者的服务器作为文件存储库来利用它。
  • 删除:此方法允许客户端删除Web服务器上的文件。攻击者可以利用它作为破坏网站或发起DoS攻击的非常简单直接的方法。
  • CONNECT:此方法可以允许客户端将Web服务器用作代理。
  • 跟踪:此方法仅将已发送到服务器的任何字符串回显到客户端,并且主要用于调试目的。此方法最初被认为是无害的,可用于发起称为“跨站点跟踪”的攻击,该攻击已由耶利米·格罗斯曼(Jeremiah Grossman)发现(请参阅页面底部的链接)。


如果应用程序需要这些方法中的一种或多种,​​例如REST Web服务(可能需要PUT或DELETE),则重要的是检查其使用是否适当地限制在受信任的用户和安全的条件下。

 

任意HTTP方法

Arshan Dabirsiaghi(请参阅链接)发现,许多Web应用程序框架允许精心选择的或任意HTTP方法绕过环境级别的访问控制检查:

  • 许多框架和语言都将“ HEAD”视为“ GET”请求,尽管响应中没有任何主体。如果在“ GET”请求上设置了安全性约束,以使只有“ authenticatedUsers”可以访问针对特定servlet或资源的GET请求,则将绕过“ HEAD”版本。这允许未经授权的盲目提交任何特权GET请求。
  • 一些框架允许不受限制地使用任意HTTP方法,例如“ JEFF”或“ CATS”。这些被视为发出了“ GET”方法,并且发现它们不受多种语言和框架的基于方法角色的访问控制检查的约束,再次允许对特权GET请求进行未经授权的盲目提交。


在许多情况下,显式检查“ GET”或“ POST”方法的代码将是安全的。

测试方法

发现支持的方法
要执行此测试,测试人员需要某种方法来确定所检查的Web服务器支持哪些HTTP方法。OPTIONS HTTP方法为测试人员提供了最直接,最有效的方法。RFC 2616声明:“ OPTIONS方法表示对有关由Request-URI标识的请求/响应链上可用的通信选项的信息的请求”。


测试方法非常简单,我们只需要启动netcat(或telnet):

$ nc www.victim.com 80 
OPTIONS / HTTP/1.1
Host: www.victim.com

HTTP/1.1 200 OK
Server: Microsoft-IIS/5.0
Date: Tue, 31 Oct 2006 08:00:29 GMT
Connection: close
Allow: GET, HEAD, POST, TRACE, OPTIONS
Content-Length: 0

在示例中可以看到,OPTIONS提供了Web服务器支持的方法列表,在这种情况下,我们可以看到启用了TRACE方法。下一节说明了此方法带来的危险

也可以使用nmap和http-methods NSE脚本执行相同的测试:

C:\Tools\nmap-6.40>nmap -p 443 --script http-methods localhost

Starting Nmap 6.40 ( http://nmap.org ) at 2015-11-04 11:52 Romance Standard Time

Nmap scan report for localhost (127.0.0.1)
Host is up (0.0094s latency).
PORT    STATE SERVICE
443/tcp open  https
| http-methods: OPTIONS TRACE GET HEAD POST
| Potentially risky methods: TRACE
|_See http://nmap.org/nsedoc/scripts/http-methods.html

Nmap done: 1 IP address (1 host up) scanned in 20.48 seconds

 

测试XST潜在的
注意事项:为了了解这种攻击的逻辑和目标,必须熟悉跨站点脚本攻击。


TRACE方法虽然看似无害,但在某些情况下可以成功地利用它来窃取合法用户的凭据。杰里米·格罗斯曼(Jeremiah Grossman)于2003年发现了这种攻击技术,试图绕过Microsoft在Internet Explorer 6 SP1中引入的HTTPOnly标签,以保护cookie不受JavaScript的访问。实际上,跨站点脚本中最经常发生的攻击模式之一是访问document.cookie对象,并将其发送到由攻击者控制的Web服务器,以便他或她可以劫持受害者的​​会话。将cookie标记为httpOnly会禁止JavaScript访问它,从而防止将cookie发送给第三方。但是,即使在这种情况下,也可以使用TRACE方法绕过此保护并访问cookie。


如前所述,TRACE只是返回发送到Web服务器的任何字符串。为了验证其存在(或再次检查上面显示的OPTIONS请求的结果),测试人员可以按照以下示例所示进行操作:

$ nc www.victim.com 80
TRACE / HTTP/1.1
Host: www.victim.com

HTTP/1.1 200 OK
Server: Microsoft-IIS/5.0
Date: Tue, 31 Oct 2006 08:01:48 GMT
Connection: close
Content-Type: message/http
Content-Length: 39

TRACE / HTTP/1.1
Host: www.victim.com

响应主体恰好是我们原始请求的副本,这意味着目标对象允许此方法。现在,潜伏的危险在哪里?如果测试人员指示浏览器向Web服务器发出TRACE请求,并且该浏览器具有该域的cookie,则该cookie将自动包含在请求标头中,并因此在结果响应中回显。届时,JavaScript可以访问cookie字符串,即使将cookie标记为httpOnly,也最终可以将其发送给第三方。


有多种方法可以使浏览器发出TRACE请求,例如Internet Explorer中的XMLHTTP ActiveX控件以及Mozilla和Netscape中的XMLDOM。但是,出于安全原因,允许浏览器仅开始与该敌对脚本所在的域建立连接。这是一个缓解因素,因为攻击者需要将TRACE方法与另一个漏洞相结合才能发起攻击。


攻击者可以通过两种方式成功发起跨站点跟踪攻击:

  • 利用另一个服务器端漏洞:攻击者像正常的跨站点脚本攻击一样,在易受攻击的应用程序中注入包含TRACE请求的恶意JavaScript代码段。
  • 利用客户端漏洞:攻击者创建了一个包含恶意JavaScript代码段的恶意网站,并利用了受害者浏览器的某些跨域漏洞,以使JavaScript代码成功执行与支持该漏洞的网站的连接TRACE方法,它是攻击者试图窃取的Cookie。


更详细的信息以及代码示例,可以在耶利米·格罗斯曼(Jeremiah Grossman)撰写的原始白皮书中找到。

 

测试任意HTTP方法

查找要访问的页面,该页面具有安全限制,因此通常会强制302重定向到登录页面或直接强制登录。与许多Web应用程序一样,此示例中的测试URL也是这样工作的。但是,如果测试人员获得的“ 200”响应不是登录页面,则有可能绕过身份验证并因此绕过授权。

$ nc www.example.com 80
JEFF / HTTP/1.1
Host: www.example.com

HTTP/1.1 200 OK
Date: Mon, 18 Aug 2008 22:38:40 GMT
Server: Apache
Set-Cookie: PHPSESSID=K53QW...

如果框架,防火墙或应用程序不支持“ JEFF”方法,则应发出错误页面(或最好是405不允许或501未实现错误页面)。如果它为请求提供服务,则容易受到此问题的影响。


如果测试人员认为系统容易受到此问题的影响,则应发出类似于CSRF的攻击以更充分地利用此问题:

  • FOOBAR /admin/createUser.php?member=myAdmin
  • JEFF /admin/changePw.php?member=myAdmin&passwd=foo123&confirm=foo123
  • CATS /admin/groupEdit.php?group=Admins&member=myAdmin&action=add


幸运的是,使用上述三个命令(已修改以适合测试中的应用程序和测试要求)将创建一个新用户,分配一个密码,并成为管理员。

 

测试HEAD访问控制旁路

查找要访问的页面,该页面具有安全限制,因此通常会强制302重定向到登录页面或直接强制登录。与许多Web应用程序一样,此示例中的测试URL也是这样工作的。但是,如果测试人员获得的不是登录页面的“ 200”响应,则可以绕过身份验证并因此绕过授权。

$ nc www.example.com 80
HEAD /admin HTTP/1.1
Host: www.example.com

HTTP/1.1 200 OK
Date: Mon, 18 Aug 2008 22:44:11 GMT
Server: Apache
Set-Cookie: PHPSESSID=pKi...; path=/; HttpOnly
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Set-Cookie: adminOnlyCookie1=...; expires=Tue, 18-Aug-2009 22:44:31 GMT; domain=www.example.com
Set-Cookie: adminOnlyCookie2=...; expires=Mon, 18-Aug-2008 22:54:31 GMT; domain=www.example.com
Set-Cookie: adminOnlyCookie3=...; expires=Sun, 19-Aug-2007 22:44:30 GMT; domain=www.example.com
Content-Language: EN
Connection: close
Content-Type: text/html; charset=ISO-8859-1

如果测试人员得到“ 405方法不允许”或“ 501方法未实现”,则目标(应用程序/框架/语言/系统/防火墙)正常工作。如果返回“ 200”响应代码,并且响应中不包含任何正文,则很可能是该应用程序在未经身份验证或授权的情况下处理了请求,因此需要进行进一步的测试。

如果测试人员认为系统容易受到此问题的影响,则应发出类似于CSRF的攻击以更充分地利用此问题:

  • HEAD /admin/createUser.php?member=myAdmin
  • HEAD /admin/changePw.php?member=myAdmin&passwd=foo123&confirm=foo123
  • HEAD /admin/groupEdit.php?group=Admins&member=myAdmin&action=add

幸运的是,使用上述三个命令(已修改以适合被测应用程序和测试要求)将创建一个新用户,分配一个密码,并让一个管理员使用全部盲请求提交。

 

 

 

 

 

 

 

 

你可能感兴趣的:(HTTP)