CSS Injection
Last updated
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
CSS selectors को input
तत्व के name
और value
गुणों के मानों से मेल खाने के लिए तैयार किया गया है। यदि इनपुट तत्व का मान गुण एक विशिष्ट वर्ण से शुरू होता है, तो एक पूर्वनिर्धारित बाहरी संसाधन लोड किया जाता है:
हालांकि, इस दृष्टिकोण को छिपे हुए इनपुट तत्वों (type="hidden"
) के साथ काम करते समय एक सीमा का सामना करना पड़ता है क्योंकि छिपे हुए तत्व पृष्ठभूमियों को लोड नहीं करते हैं।
इस सीमा को पार करने के लिए, आप ~
सामान्य भाई संयोजक का उपयोग करके एक बाद के भाई तत्व को लक्षित कर सकते हैं। CSS नियम तब सभी भाई तत्वों पर लागू होता है जो छिपे हुए इनपुट तत्व के बाद आते हैं, जिससे पृष्ठभूमि छवि लोड होती है:
A practical example of exploiting this technique is detailed in the provided code snippet. You can view it here.
CSS Injection तकनीक के प्रभावी होने के लिए, कुछ शर्तें पूरी होनी चाहिए:
पेलोड लंबाई: CSS injection वेक्टर को पर्याप्त लंबे पेलोड का समर्थन करना चाहिए ताकि तैयार किए गए सेलेक्टर्स को समायोजित किया जा सके।
CSS पुनर्मूल्यांकन: आपके पास पृष्ठ को फ्रेम करने की क्षमता होनी चाहिए, जो नए उत्पन्न पेलोड के साथ CSS के पुनर्मूल्यांकन को ट्रिगर करने के लिए आवश्यक है।
बाहरी संसाधन: यह तकनीक बाहरी होस्टेड छवियों का उपयोग करने की क्षमता मानती है। यह साइट की सामग्री सुरक्षा नीति (CSP) द्वारा प्रतिबंधित हो सकता है।
जैसा कि इस पोस्ट में समझाया गया है, यह संभव है कि :has
और :not
सेलेक्टर्स को मिलाकर सामग्री की पहचान की जा सके, यहां तक कि ब्लाइंड तत्वों से भी। यह तब बहुत उपयोगी होता है जब आपको यह नहीं पता होता कि CSS injection लोड करने वाले वेब पृष्ठ के अंदर क्या है।
यह सेलेक्टर्स का उपयोग करके समान प्रकार के कई ब्लॉकों से जानकारी निकालना भी संभव है जैसे कि:
Combining this with the following @import technique, it's possible to exfiltrate a lot of info using CSS injection from blind pages with blind-css-exfiltration.
The previous technique has some drawbacks, check the prerequisites. You either need to be able to send multiple links to the victim, or you need to be able to iframe the CSS injection vulnerable page.
हालांकि, एक और चतुर तकनीक है जो CSS @import
का उपयोग करके तकनीक की गुणवत्ता में सुधार करती है।
यह पहली बार Pepe Vila द्वारा दिखाया गया था और यह इस तरह काम करता है:
इसके बजाय कि हर बार अलग-अलग पेलोड के साथ एक ही पृष्ठ को बार-बार लोड किया जाए (जैसे पिछले में), हम पृष्ठ को केवल एक बार और केवल हमलावर के सर्वर के लिए एक आयात के साथ लोड करने जा रहे हैं (यह पीड़ित को भेजने के लिए पेलोड है):
आयात हमलावरों से कुछ CSS स्क्रिप्ट प्राप्त करने जा रहा है और ब्राउज़र इसे लोड करेगा।
CSS स्क्रिप्ट का पहला भाग जो हमलावर भेजेगा वह है फिर से हमलावर के सर्वर के लिए एक और @import
।
हमलावर का सर्वर अभी इस अनुरोध का उत्तर नहीं देगा, क्योंकि हम कुछ वर्ण लीक करना चाहते हैं और फिर इस आयात का उत्तर लीक करने के लिए पेलोड के साथ देना चाहते हैं।
पेलोड का दूसरा और बड़ा भाग एक एट्रिब्यूट सेलेक्टर लीक पेलोड होगा।
यह हमलावर के सर्वर को गुप्त का पहला और अंतिम वर्ण भेजेगा।
एक बार जब हमलावर के सर्वर ने गुप्त का पहला और अंतिम वर्ण प्राप्त कर लिया, तो यह चरण 2 में अनुरोधित आयात का उत्तर देगा।
उत्तर चरण 2, 3 और 4 के समान होगा, लेकिन इस बार यह गुप्त का दूसरा वर्ण और फिर अंतिम से पहले खोजने की कोशिश करेगा।
हमलावर इस लूप का पालन करेगा जब तक कि वह गुप्त को पूरी तरह से लीक करने में सफल नहीं हो जाता।
आप मूल पेपे विला का कोड इस परिष्कृत करने के लिए यहाँ पा सकते हैं या आप लगभग समान कोड लेकिन टिप्पणी के साथ यहाँ पा सकते हैं।
स्क्रिप्ट हर बार 2 वर्ण खोजने की कोशिश करेगी (शुरुआत से और अंत से) क्योंकि एट्रिब्यूट सेलेक्टर चीजें करने की अनुमति देता है:
यह स्क्रिप्ट को रहस्य को तेजी से लीक करने की अनुमति देता है।
कभी-कभी स्क्रिप्ट सही तरीके से पहचान नहीं पाती है कि खोजा गया प्रीफिक्स + सफिक्स पहले से ही पूरा ध्वज है और यह आगे (प्रीफिक्स में) और पीछे (सफिक्स में) जारी रखेगी और किसी बिंदु पर यह लटक जाएगी। कोई चिंता नहीं, बस आउटपुट की जांच करें क्योंकि आप वहां ध्वज देख सकते हैं।
CSS चयनकर्ताओं के साथ DOM भागों तक पहुँचने के अन्य तरीके:
.class-to-search:nth-child(2)
: यह DOM में "class-to-search" के साथ दूसरे आइटम को खोजेगा।
:empty
चयनकर्ता: उदाहरण के लिए इस लेख** में उपयोग किया गया है:**
संदर्भ: CSS आधारित हमला: @font-face के unicode-range का दुरुपयोग, त्रुटि-आधारित XS-Search PoC @terjanq द्वारा
कुल मिलाकर इरादा है कि एक नियंत्रित एंडपॉइंट से एक कस्टम फ़ॉन्ट का उपयोग करें और सुनिश्चित करें कि पाठ (इस मामले में, 'A') केवल तभी इस फ़ॉन्ट के साथ प्रदर्शित होता है जब निर्दिष्ट संसाधन (favicon.ico
) लोड नहीं किया जा सकता।
कस्टम फ़ॉन्ट का उपयोग:
एक कस्टम फ़ॉन्ट को <head>
अनुभाग में <style>
टैग के भीतर @font-face
नियम का उपयोग करके परिभाषित किया गया है।
फ़ॉन्ट का नाम poc
है और इसे एक बाहरी एंडपॉइंट (http://attacker.com/?leak
) से लाया गया है।
unicode-range
प्रॉपर्टी को U+0041
पर सेट किया गया है, जो विशेष यूनिकोड कैरेक्टर 'A' को लक्षित करता है।
फॉलबैक टेक्स्ट के साथ ऑब्जेक्ट तत्व:
<body>
अनुभाग में id="poc0"
के साथ एक <object>
तत्व बनाया गया है। यह तत्व http://192.168.0.1/favicon.ico
से एक संसाधन लोड करने की कोशिश करता है।
इस तत्व के लिए font-family
को <style>
अनुभाग में परिभाषित 'poc'
पर सेट किया गया है।
यदि संसाधन (favicon.ico
) लोड करने में विफल रहता है, तो <object>
टैग के भीतर फॉलबैक सामग्री (अक्षर 'A') प्रदर्शित होती है।
यदि बाहरी संसाधन लोड नहीं किया जा सकता है, तो फॉलबैक सामग्री ('A') को कस्टम फ़ॉन्ट poc
का उपयोग करके प्रदर्शित किया जाएगा।
:target
प्सेउडो-क्लास का उपयोग एक तत्व का चयन करने के लिए किया जाता है जिसे URL फ़्रैगमेंट द्वारा लक्षित किया गया है, जैसा कि CSS सेलेक्टर्स लेवल 4 स्पेसिफिकेशन में निर्दिष्ट किया गया है। यह समझना महत्वपूर्ण है कि ::target-text
किसी भी तत्व से मेल नहीं खाता जब तक कि टेक्स्ट को स्पष्ट रूप से फ़्रैगमेंट द्वारा लक्षित नहीं किया गया हो।
एक सुरक्षा चिंता तब उत्पन्न होती है जब हमलावर स्क्रॉल-टू-टेक्स्ट फ़्रैगमेंट फ़ीचर का लाभ उठाते हैं, जिससे उन्हें HTML इंजेक्शन के माध्यम से अपने सर्वर से संसाधन लोड करके किसी वेबपेज पर विशिष्ट टेक्स्ट की उपस्थिति की पुष्टि करने की अनुमति मिलती है। यह विधि एक CSS नियम को इस तरह इंजेक्ट करने में शामिल है:
इन परिदृश्यों में, यदि पृष्ठ पर "Administrator" पाठ मौजूद है, तो संसाधन target.png
सर्वर से अनुरोध किया जाता है, जो पाठ की उपस्थिति को इंगित करता है। इस हमले का एक उदाहरण एक विशेष रूप से तैयार किए गए URL के माध्यम से निष्पादित किया जा सकता है जो इंजेक्टेड CSS को Scroll-to-text फ़्रैगमेंट के साथ एम्बेड करता है:
यहाँ, हमला HTML इंजेक्शन का उपयोग करके CSS कोड को संचारित करने के लिए "Administrator" विशेष पाठ को लक्षित करता है, Scroll-to-text fragment (#:~:text=Administrator
) के माध्यम से। यदि पाठ पाया जाता है, तो निर्दिष्ट संसाधन लोड होता है, अनजाने में हमलावर को इसकी उपस्थिति का संकेत देता है।
निवारण के लिए, निम्नलिखित बिंदुओं पर ध्यान दिया जाना चाहिए:
संकीर्ण STTF मिलान: Scroll-to-text Fragment (STTF) केवल शब्दों या वाक्यों से मेल खाने के लिए डिज़ाइन किया गया है, जिससे यह मनमाने रहस्यों या टोकनों को लीक करने की क्षमता को सीमित करता है।
शीर्ष-स्तरीय ब्राउज़िंग संदर्भों तक सीमित: STTF केवल शीर्ष-स्तरीय ब्राउज़िंग संदर्भों में कार्य करता है और iframes के भीतर कार्य नहीं करता, जिससे किसी भी शोषण के प्रयास को उपयोगकर्ता के लिए अधिक ध्यान देने योग्य बना देता है।
उपयोगकर्ता सक्रियण की आवश्यकता: STTF को कार्य करने के लिए एक उपयोगकर्ता-क्रियान्वयन इशारा की आवश्यकता होती है, जिसका अर्थ है कि शोषण केवल उपयोगकर्ता-प्रेरित नेविगेशन के माध्यम से संभव है। यह आवश्यकता हमलों के स्वचालित होने के जोखिम को काफी कम करती है बिना उपयोगकर्ता की बातचीत के। फिर भी, ब्लॉग पोस्ट के लेखक ने कुछ विशिष्ट स्थितियों और बायपास (जैसे, सामाजिक इंजीनियरिंग, प्रचलित ब्राउज़र एक्सटेंशन के साथ बातचीत) का उल्लेख किया है जो हमले के स्वचालन को आसान बना सकते हैं।
इन तंत्रों और संभावित कमजोरियों के प्रति जागरूकता वेब सुरक्षा बनाए रखने और ऐसे शोषणकारी तकनीकों के खिलाफ सुरक्षा के लिए कुंजी है।
अधिक जानकारी के लिए मूल रिपोर्ट देखें: https://www.secforce.com/blog/new-technique-of-stealing-data-using-css-and-scroll-to-text-fragment-feature/
आप यहाँ CTF के लिए इस तकनीक का उपयोग करते हुए एक शोषण देख सकते हैं।
आप विशिष्ट unicode मानों के लिए बाहरी फ़ॉन्ट निर्दिष्ट कर सकते हैं जो केवल तब इकट्ठा किए जाएंगे जब वे unicode मान पृष्ठ में मौजूद हों। उदाहरण के लिए:
When you access this page, Chrome और Firefox "?A" और "?B" लाते हैं क्योंकि sensitive-information के text node में "A" और "B" अक्षर होते हैं। लेकिन Chrome और Firefox "?C" नहीं लाते क्योंकि इसमें "C" नहीं है। इसका मतलब है कि हम "A" और "B" को पढ़ने में सक्षम रहे हैं।
Reference: Wykradanie danych w świetnym stylu – czyli jak wykorzystać CSS-y do ataków na webaplikację
विवरणित तकनीक में एक नोड से टेक्स्ट निकालने के लिए फ़ॉन्ट लिगेचर्स का उपयोग करना और चौड़ाई में परिवर्तनों की निगरानी करना शामिल है। प्रक्रिया में कई चरण शामिल हैं:
Custom Fonts का निर्माण:
SVG फ़ॉन्ट्स को glyphs के साथ तैयार किया जाता है जिनमें horiz-adv-x
विशेषता होती है, जो दो-अक्षर अनुक्रम का प्रतिनिधित्व करने वाले glyph के लिए बड़ी चौड़ाई सेट करती है।
उदाहरण SVG glyph: <glyph unicode="XY" horiz-adv-x="8000" d="M1 0z"/>
, जहाँ "XY" एक दो-अक्षर अनुक्रम को दर्शाता है।
इन फ़ॉन्ट्स को फिर fontforge का उपयोग करके woff प्रारूप में परिवर्तित किया जाता है।
चौड़ाई परिवर्तनों का पता लगाना:
CSS का उपयोग यह सुनिश्चित करने के लिए किया जाता है कि टेक्स्ट लपेटा न जाए (white-space: nowrap
) और स्क्रॉलबार शैली को अनुकूलित किया जाए।
एक विशिष्ट लिगेचर, और इसलिए एक विशिष्ट अक्षर अनुक्रम, टेक्स्ट में मौजूद होने का संकेत देने के लिए एक अलग रूप से स्टाइल किया गया क्षैतिज स्क्रॉलबार दिखाई देता है।
शामिल CSS:
शोषण प्रक्रिया:
चरण 1: बड़े चौड़ाई वाले अक्षरों के जोड़ों के लिए फ़ॉन्ट बनाए जाते हैं।
चरण 2: यह पता लगाने के लिए स्क्रॉलबार-आधारित चाल का उपयोग किया जाता है कि कब बड़ा चौड़ाई वाला glyph (एक अक्षर जोड़ी के लिए लिगेचर) प्रस्तुत किया जाता है, जो अक्षर अनुक्रम की उपस्थिति को इंगित करता है।
चरण 3: एक लिगेचर का पता लगाने पर, तीन-अक्षर अनुक्रम का प्रतिनिधित्व करने वाले नए glyph बनाए जाते हैं, जिसमें पता लगाया गया जोड़ा शामिल होता है और एक पूर्ववर्ती या उत्तरवर्ती अक्षर जोड़ा जाता है।
चरण 4: तीन-अक्षर लिगेचर का पता लगाया जाता है।
चरण 5: प्रक्रिया दोहराई जाती है, धीरे-धीरे पूरे टेक्स्ट को प्रकट करती है।
अनुकूलन:
वर्तमान प्रारंभिककरण विधि <meta refresh=...
का उपयोग करना अनुकूल नहीं है।
एक अधिक कुशल दृष्टिकोण CSS @import
चाल को शामिल कर सकता है, जो शोषण के प्रदर्शन को बढ़ाता है।
Reference: PoC using Comic Sans by @Cgvwzq & @Terjanq
यह चाल इस Slackers thread में जारी की गई थी। टेक्स्ट नोड में उपयोग किया गया charset ब्राउज़र में स्थापित डिफ़ॉल्ट फ़ॉन्ट्स का उपयोग करके लीक किया जा सकता है: कोई बाहरी -या कस्टम- फ़ॉन्ट की आवश्यकता नहीं है।
यह अवधारणा एक एनीमेशन का उपयोग करके एक div
की चौड़ाई को क्रमिक रूप से बढ़ाने के चारों ओर घूमती है, जिससे एक समय में एक अक्षर टेक्स्ट के 'suffix' भाग से 'prefix' भाग में संक्रमण कर सकता है। यह प्रक्रिया टेक्स्ट को दो भागों में विभाजित करती है:
Prefix: प्रारंभिक पंक्ति।
Suffix: अगली पंक्ति(याँ)।
अक्षरों के संक्रमण चरण इस प्रकार दिखाई देंगे:
C ADB
CA DB
CAD B
CADB
इस संक्रमण के दौरान, unicode-range trick का उपयोग प्रत्येक नए अक्षर की पहचान करने के लिए किया जाता है जब यह prefix में शामिल होता है। यह Comic Sans फ़ॉन्ट में स्विच करके प्राप्त किया जाता है, जो डिफ़ॉल्ट फ़ॉन्ट की तुलना में उल्लेखनीय रूप से लंबा होता है, जिससे एक ऊर्ध्वाधर स्क्रॉलबार सक्रिय होता है। इस स्क्रॉलबार की उपस्थिति अप्रत्यक्ष रूप से prefix में एक नए अक्षर की उपस्थिति को प्रकट करती है।
हालांकि यह विधि अद्वितीय अक्षरों का पता लगाने की अनुमति देती है जब वे प्रकट होते हैं, यह यह निर्दिष्ट नहीं करती है कि कौन सा अक्षर दोहराया गया है, केवल यह कि एक पुनरावृत्ति हुई है।
बुनियादी रूप से, unicode-range का उपयोग एक char का पता लगाने के लिए किया जाता है, लेकिन चूंकि हम एक बाहरी फ़ॉन्ट लोड नहीं करना चाहते, हमें एक और तरीका खोजना होगा। जब char पाया जाता है, तो इसे पूर्व-स्थापित Comic Sans फ़ॉन्ट दिया जाता है, जो char को बड़ा बनाता है और स्क्रॉल बार को सक्रिय करता है जो पाए गए char को लीक करेगा।
PoC से निकाला गया कोड जांचें:
Reference: इसे इस लेख में एक असफल समाधान के रूप में उल्लेखित किया गया है
यह मामला पिछले मामले के बहुत समान है, हालाँकि, इस मामले में विशेष chars को अन्य की तुलना में बड़ा बनाना कुछ छिपाने के लिए है जैसे कि बटन जिसे बॉट द्वारा दबाया नहीं जाना चाहिए या एक छवि जो लोड नहीं होगी। इसलिए हम क्रिया (या क्रिया की कमी) को माप सकते हैं और जान सकते हैं कि क्या पाठ के अंदर एक विशेष char मौजूद है।
Reference: इसे इस लेख में एक असफल समाधान के रूप में उल्लेखित किया गया है
इस मामले में, हम यह लीक करने की कोशिश कर सकते हैं कि क्या एक char पाठ में है, एक ही मूल से एक नकली फ़ॉन्ट लोड करके:
यदि मेल होता है, तो फॉन्ट /static/bootstrap.min.css?q=1
से लोड होगा। हालांकि यह सफलतापूर्वक लोड नहीं होगा, ब्राउज़र इसे कैश करेगा, और यदि कैश नहीं है, तो 304 नॉट मॉडिफाइड तंत्र है, इसलिए प्रतिक्रिया अन्य चीजों की तुलना में तेज़ होनी चाहिए।
हालांकि, यदि कैश की गई प्रतिक्रिया और गैर-कैश की गई प्रतिक्रिया के बीच का समय अंतर पर्याप्त बड़ा नहीं है, तो यह उपयोगी नहीं होगा। उदाहरण के लिए, लेखक ने उल्लेख किया: हालांकि, परीक्षण के बाद, मैंने पाया कि पहली समस्या यह है कि गति में ज्यादा अंतर नहीं है, और दूसरी समस्या यह है कि बॉट disk-cache-size=1
ध्वज का उपयोग करता है, जो वास्तव में विचारशील है।
संदर्भ: इसे इस लेख में एक असफल समाधान के रूप में उल्लेख किया गया है
इस मामले में आप संकेत दे सकते हैं CSS को एक ही मूल से सैकड़ों नकली फॉन्ट लोड करने के लिए जब मेल होता है। इस तरह आप समय माप सकते हैं जो लगता है और पता लगा सकते हैं कि कोई वर्ण प्रकट होता है या नहीं कुछ इस तरह:
और बॉट का कोड इस तरह दिखता है:
तो, यदि फ़ॉन्ट मेल नहीं खाता है, तो बॉट पर जाने पर प्रतिक्रिया समय लगभग 30 सेकंड होने की उम्मीद है। हालाँकि, यदि फ़ॉन्ट मेल खाता है, तो फ़ॉन्ट को पुनः प्राप्त करने के लिए कई अनुरोध भेजे जाएंगे, जिससे नेटवर्क में निरंतर गतिविधि होगी। परिणामस्वरूप, रोकने की स्थिति को संतुष्ट करने और प्रतिक्रिया प्राप्त करने में अधिक समय लगेगा। इसलिए, प्रतिक्रिया समय का उपयोग यह निर्धारित करने के लिए एक संकेतक के रूप में किया जा सकता है कि क्या फ़ॉन्ट मेल खाता है।
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)