HTTP提供了许多方法,可用于在Web服务器上执行操作。这些方法中的许多方法旨在帮助开发人员部署和测试HTTP应用程序。如果Web服务器配置错误,则这些HTTP方法可用于恶意目的。此外,还检查了跨站点跟踪(XST)(一种使用服务器的HTTP TRACE方法的跨站点脚本编写形式)。
尽管GET和POST是迄今为止用于访问Web服务器提供的信息的最常用方法,但是超文本传输协议(HTTP)允许其他几种(且鲜为人知)方法。RFC 2616(描述了当今的HTTP版本1.1)定义了以下8种方法:
这些方法中的某些可能会给Web应用程序带来安全风险,因为它们使攻击者能够修改存储在Web服务器上的文件,并且在某些情况下会窃取合法用户的凭据。更具体地说,应禁用的方法如下:
如果应用程序需要这些方法中的一种或多种,例如REST Web服务(可能需要PUT或DELETE),则重要的是检查其使用是否适当地限制在受信任的用户和安全的条件下。
Arshan Dabirsiaghi(请参阅链接)发现,许多Web应用程序框架允许精心选择的或任意HTTP方法绕过环境级别的访问控制检查:
在许多情况下,显式检查“ 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方法与另一个漏洞相结合才能发起攻击。
攻击者可以通过两种方式成功发起跨站点跟踪攻击:
更详细的信息以及代码示例,可以在耶利米·格罗斯曼(Jeremiah Grossman)撰写的原始白皮书中找到。
查找要访问的页面,该页面具有安全限制,因此通常会强制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的攻击以更充分地利用此问题:
幸运的是,使用上述三个命令(已修改以适合测试中的应用程序和测试要求)将创建一个新用户,分配一个密码,并成为管理员。
查找要访问的页面,该页面具有安全限制,因此通常会强制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的攻击以更充分地利用此问题:
幸运的是,使用上述三个命令(已修改以适合被测应用程序和测试要求)将创建一个新用户,分配一个密码,并让一个管理员使用全部盲请求提交。