前言
今天和大家分享一个国外白帽子在一个私有赏金项目上有趣发现的故事。
发现
通过 Subfinder白帽小哥发现一项服务只提供了一个注册表单和一个个人资料页面,此外,还可以注册参加不定期的特定调查。
总的来说,该页面没有任何可供探索的其它功能(只有一小部分注册用户,因此导致赏金最终被降级处理)
通过检查个人资料字段中的一些 XSS,发现名字容易受到存储型Self XSS 攻击,使用如下Paylaod:
"onfocus="alert(1)" autofocus="
那么一个Self XSS 危害并不大,能否升级该漏洞呢?
白帽小哥决定先休息一下,换个其它子域再挖挖看。
重拾信心
几天后,白帽小哥决定来用 ffuf 进行一些基本的模糊测试:
通过在 URL 末尾添加 .pdf 后,页面返回了大量响应。
页面网址为 https://subdomain.redacted.com/.pdf ,令人惊讶的是,登录页面的内容以 PDF 文档的形式返回。
测试其它路径显示出相同的行为,并且服务器将请求的页面作为 PDF 文档返回……
PDF 文档
使用 FileAlayzer 分析 PDF 后发现,该文档由 wkhtmltopdf 创建:
还记得之前的存储型 Self XSS 吗?不妨尝试将其转换为服务器端 XSS,然后读取本地文件,这样就可以进一步升级该漏洞,说干就干!
请求 https://subdomain.redacted.com/start/profile.pdf 以 PDF 格式呈现个人资料数据页面 — 成功😍
Self XSS 漏洞已在 PDF 文档中呈现……🎉
漏洞利用
参考:https://medium.com/r3d-buck3t/xss-to-exfiltrate-data-from-pdfs-f5bbb35eaba7 文章中的一些技术手段,白帽小哥开始尝试以下方式读取本地文件:
"><iframe src="file:///etc/passwd"></iframe>
没能成功,而且每次 iframe 都是空的,看来是因为没有设置 --enable-local-file-access
标志,所以阻止了对本地文件的访问。
另外,尝试在本地主机上请求服务也没能成功,因为服务器每次都会崩溃,不得不等待服务器的重新启动。
白帽小哥尝试获取有关渲染器运行环境的更多信息:
"onfocus="document.write(JSON.stringify(window.location));"autofocus="
这会返回一个包含以下内容的 PDF 文档:
{"origin":"file://","hash":"","href":"file:////tmp/wicked_pdf20250319-23102-
1jmrqgy.html","pathname":"//tmp/wicked_pdf20250319-23102-
1jmrqgy.html","hostname":"","protocol":"file:","port":"","host":"","search":""}
临时文件名前缀 wicked_pdf 引起了白帽小哥的注意,经过快速搜索,白帽小哥找到了 Ruby on Rails 的 wkhtmltopdf 封装器的 github repo: https://github.com/mileszs/wicked_pdf
通过阅读文档,发现了一个有趣的部分:
https://github.com/mileszs/wicked_pdf?tab=readme-ov-file#wicked_pdf-helpers
看起来好像可以在 html 模板文件中使用内联 ruby 代码来包含自定义函数。
因此引出了关于如何处理内容的一些想法:
- 页面渲染完成(我们的存储型 XSS 触发)
- html 页面内容传递给 wicked_pdf,后者也在 html 文件中执行内联 ruby,然后调用 wkhtmltopdf
- pdf 文档成功送达
那么当 XSS 执行时,白帽小哥考虑尝试注入内联 ruby 标签是否会发生什么呢?
"><?= Time.now ?>
结果非常令人兴奋!每次请求 PDF 时,都会打印当前服务器时间 🙈
将 Self-XSS 变成了 RCE 只需要:
"><%=
uname -a %>
深入探索
白帽小哥决定进一步挖掘以获得更多发现和更多影响:
<%=
ls -lsa /home/ %>
通过浏览了一些目录,白帽小哥发现了很多有价值的东西,比如 git 仓库、配置文件以及托管在同一服务器上的其它项目的数据库转储。
该公司没有将这些项目彼此隔离,从而使这些项目面临被入侵的严重风险。
很快厂商在一天之内便做出了回应,同时为该漏洞提供了一笔赏金奖励。
你学到了么?
原文:https://handball10.medium.com/from-self-xss-to-rce-in-ruby-on-rails-1f9f2d33c1cb