深入解析HTTP TRACE方法:WAF绕过与信息泄露

本文详细探讨了HTTP TRACE方法在现代网络安全中的应用,重点分析了如何利用TRACE请求绕过Web应用防火墙(WAF)并获取敏感信息。通过实际代码演示和攻击原理解析,揭示了TRACE方法在渗透测试中的实用价值。

三分钟了解HTTP TRACE方法

所有扫描工具都建议我们禁用HTTP TRACE和TRACK方法。我们通常认为这是因为攻击者可以利用这些方法从合法用户那里窃取机密信息。但TRACE对攻击者还有另一个用途,且与其他用户无关。

OWASP建议禁用HTTP TRACE,因为它可用于跨站追踪(Cross Site Tracing)。
CERT指出该方法"可与跨域浏览器漏洞结合,读取第三方域的敏感头信息"。
《致命Web攻击》一书提到可通过TRACE读取cookie。

这些说法都正确但略显过时。现代浏览器中,XMLHttpRequest不再发送"TRACE"请求,且CORS框架会阻止向未明确允许的外域发送XHR请求。因此这些传统攻击方式已不再有效。

CORS阻止GET请求,浏览器阻止TRACE请求

但TRACE仍是有效的信息获取手段。需要记住的是,TRACE动词由Web服务器处理。请求在到达Web服务器前可能经过其他组件,如果这些组件添加了头部信息,TRACE响应就会包含这些头部,从而泄露额外信息。

哪些位于Web服务器前的组件值得关注?Web应用防火墙(WAF)就是其中之一,它会在请求到达服务器前进行过滤以检测和阻止攻击。

这些不是我发送的头部…

X-Forwarded-For头部是某些WAF添加的头部之一,WAF有时会使用该头部决定是否过滤请求。如果该头部存在且包含WAF的IP地址,则请求必然来自WAF,且肯定不是恶意请求,对吗?

但如果我们在发送的请求中自行添加这个头部呢?

看,我的X-Forwarded-For头部成功传入了

这个WAF不仅会创建X-Forwarded-For头部,还会将请求系统的IP地址(我的公网IP,以103结尾)添加到已有内容中。如果你知道WAF的IP地址(你确实知道,因为正在与之通信),可以尝试告诉WAF你的请求实际上来自WAF本身,应该被忽略。如果WAF相信了这个说法,你就成功绕过了WAF。

这是最直接的WAF绕过方式。虽然这并非新发现,但TRACE方法在此展示了其工作原理。

如果你想亲自实验,以下是用于XHR演示的HTML代码:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
   "http://www.w3.org/TR/html4/loose.dtd">
<head><title>TRACE Form</title><script type="text/javascript">
function sendAny(myMethod) {
var xhr = new XMLHttpRequest();
xhr.open(myMethod, "http://bhis.co",false);
xhr.send();
document.getElementById("demo").innerHTML = xhr.responseText;
}
</script></head>
<body><div id="demo"><h2>Response Goes Here</h2></div>
<form name="weLikeStandards" action="#">
<input type=button OnClick="sendAny('TRACE');" value="Send Trace Request">
<input type=button OnClick="sendAny('GET');" value="Send GET Request">
</form>
<a href="http://validator.w3.org/check?uri=referer"><img
      src="http://www.w3.org/Icons/valid-html401" alt="Valid HTML 4.01 Transitional" height="31" width="88"></a>
</body></html>

读者问答

RjSec提问
你说浏览器会阻止TRACE请求,那我如何通过你提供的代码从浏览器发送TRACE请求?

Brian回复
这就是问题所在——现代浏览器不会帮你完成这个操作。
我使用BurpSuite实现,但你也可以使用ZAP或其他代理工具,甚至命令行。
以下是我刚刚测试的结果(输入第一行和第五行,在输入"TRACE / HTTP/1.0"后按两次回车):

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
$> telnet http://www.example.com 80
Trying 93.184.216.34…
Connected to http://www.example.com.
Escape character is '^]'.
TRACE / HTTP/1.0

HTTP/1.0 405 Method Not Allowed
Content-Length: 0
Connection: close
Date: Thu, 14 Jul 2016 14:46:18 GMT
Server: ECSF (mdw/13EE)
Connection closed by foreign host.
comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计