CSS Injection
Last updated
Last updated
Jifunze & fanya mazoezi ya AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Jifunze & fanya mazoezi ya GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
CSS selectors zimeundwa ili kufanana na thamani za input
kipengele cha name
na value
attributes. Ikiwa thamani ya kipengele cha input inaanza na herufi maalum, rasilimali ya nje iliyowekwa tayari inaloadiwa:
Hata hivyo, njia hii ina kikomo wakati wa kushughulikia vipengele vya input vilivyojificha (type="hidden"
) kwa sababu vipengele vilivyojificha havipakui mandharinyuma.
Ili kuepuka kikomo hiki, unaweza kulenga kipengele cha ndugu kinachofuata kwa kutumia mchanganyiko wa ndugu wa jumla ~
. Sheria ya CSS kisha inatumika kwa ndugu wote wanaofuatia kipengele cha input kilichojificha, na kusababisha picha ya mandharinyuma kupakuliwa:
A practical example of exploiting this technique is detailed in the provided code snippet. You can view it here.
For the CSS Injection technique to be effective, certain conditions must be met:
Payload Length: Upeo wa CSS injection lazima uunge mkono urefu wa kutosha wa payloads ili kuweza kubeba selectors zilizoundwa.
CSS Re-evaluation: Unapaswa kuwa na uwezo wa kuunda sura ya ukurasa, ambayo ni muhimu kuanzisha upya tathmini ya CSS na payloads mpya zilizoundwa.
External Resources: Mbinu hii inadhani uwezo wa kutumia picha zinazohifadhiwa nje. Hii inaweza kuwa na vizuizi na Sera ya Usalama wa Maudhui (CSP) ya tovuti.
As explained in this post, 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:
Kuchanganya hii na mbinu ifuatayo ya @import, inawezekana kutoa taarifa nyingi kwa kutumia CSS injection kutoka kwa kurasa za kipofu na blind-css-exfiltration.
Mbinu ya awali ina mapungufu, angalia mahitaji. Unahitaji kuwa na uwezo wa kutuma viungo vingi kwa mwathirika, au unahitaji kuwa na uwezo wa iframe kurasa zilizo hatarini za CSS injection.
Hata hivyo, kuna mbinu nyingine ya busara inayotumia CSS @import
kuboresha ubora wa mbinu hiyo.
Hii ilionyeshwa kwanza na Pepe Vila na inafanya kazi kama ifuatavyo:
Badala ya kupakia ukurasa huo huo mara kwa mara na payload tofauti kumi kila wakati (kama ilivyo katika ile ya awali), tutakuwa tukipakia ukurasa mara moja tu na kwa kuagiza tu kwenye seva ya washambuliaji (hii ndiyo payload ya kutuma kwa mwathirika):
Uagizaji utaenda kupokea baadhi ya script za CSS kutoka kwa washambuliaji na kivinjari kitaipakia.
Sehemu ya kwanza ya script ya CSS ambayo mshambuliaji atatuma ni @import nyingine kwa seva ya washambuliaji tena.
Seva ya washambuliaji haitajibu ombi hili bado, kwani tunataka kuvuja baadhi ya herufi na kisha kujibu uagizaji huu na payload ili kuvuja zile nyingine.
Sehemu ya pili na kubwa zaidi ya payload itakuwa payload ya kuvuja chaguo la sifa
Hii itatuma kwa seva ya washambuliaji herufi ya kwanza ya siri na ya mwisho
Mara baada ya seva ya washambuliaji kupokea herufi ya kwanza na ya mwisho ya siri, itajibu uagizaji ulioombwa katika hatua ya 2.
Jibu litakuwa sawa kabisa na hatua za 2, 3 na 4, lakini wakati huu litajaribu kupata herufi ya pili ya siri na kisha ya kabla ya mwisho.
Mshambuliaji atafuatilia mzunguko huo hadi apate kabisa siri.
Unaweza kupata kanuni ya asili ya Pepe Vila ya kutumia hii hapa au unaweza kupata karibu kanuni sawa lakini iliyoelezewa hapa.
Script itajaribu kugundua herufi 2 kila wakati (kutoka mwanzo na kutoka mwisho) kwa sababu chaguo la sifa linaruhusu kufanya mambo kama:
Hii inaruhusu script kuvuja siri haraka.
Wakati mwingine script haiwezi kugundua kwa usahihi kwamba prefix + suffix iliyogunduliwa tayari ni bendera kamili na itaendelea mbele (katika prefix) na nyuma (katika suffix) na wakati fulani itakwama. Usijali, angalia tu matokeo kwa sababu unaweza kuona bendera hapo.
Njia nyingine za kufikia sehemu za DOM kwa kutumia CSS selectors:
.class-to-search:nth-child(2)
: Hii itatafuta kipengee cha pili chenye darasa "class-to-search" katika DOM.
:empty
selector: Inatumika kwa mfano katika hii andiko:
Marejeo: CSS based Attack: Abusing unicode-range of @font-face , Error-Based XS-Search PoC by @terjanq
Nia kuu ni kutumia font maalum kutoka mwisho ulio na udhibiti na kuhakikisha kwamba maandishi (katika kesi hii, 'A') yanaonyeshwa kwa font hii tu ikiwa rasilimali iliyoainishwa (favicon.ico
) haiwezi kupakuliwa.
Matumizi ya Fonti Maalum:
Fonti maalum inafafanuliwa kwa kutumia sheria ya @font-face
ndani ya tag <style>
katika sehemu ya <head>
.
Fonti inaitwa poc
na inachukuliwa kutoka kwa kiungo cha nje (http://attacker.com/?leak
).
Mali ya unicode-range
imewekwa kuwa U+0041
, ikilenga herufi maalum ya Unicode 'A'.
Element ya Kitu na Maandishi ya Kurejelea:
Element ya <object>
yenye id="poc0"
imeundwa katika sehemu ya <body>
. Element hii inajaribu kupakia rasilimali kutoka http://192.168.0.1/favicon.ico
.
Familia ya fonti kwa element hii imewekwa kuwa 'poc'
, kama ilivyoainishwa katika sehemu ya <style>
.
Ikiwa rasilimali (favicon.ico
) itashindwa kupakia, maudhui ya kurejelea (herufi 'A') ndani ya tag <object>
yanaonyeshwa.
Maudhui ya kurejelea ('A') yataonyeshwa kwa kutumia fonti maalum poc
ikiwa rasilimali ya nje haiwezi kupakiwa.
Pseudo-class :target
inatumika kuchagua element inayolengwa na URL fragment, kama ilivyoainishwa katika CSS Selectors Level 4 specification. Ni muhimu kuelewa kwamba ::target-text
haiwezi kulinganisha na element yoyote isipokuwa maandiko yalengwa waziwazi na fragment.
Kuna wasiwasi wa usalama unapojitokeza wakati washambuliaji wanatumia kipengele cha Scroll-to-text, wakiruhusu kuthibitisha uwepo wa maandiko maalum kwenye ukurasa wa wavuti kwa kupakia rasilimali kutoka kwa seva yao kupitia HTML injection. Njia hii inahusisha kuingiza sheria ya CSS kama hii:
Katika hali kama hizi, ikiwa maandiko "Administrator" yapo kwenye ukurasa, rasilimali target.png
inahitajiwa kutoka kwa seva, ikionyesha uwepo wa maandiko hayo. Mfano wa shambulio hili unaweza kutekelezwa kupitia URL iliyoundwa kwa njia maalum ambayo inaingiza CSS iliyowekwa pamoja na kipande cha Scroll-to-text:
Hapa, shambulio linatumia HTML injection kuhamasisha CSS code, likilenga maandiko maalum "Administrator" kupitia Scroll-to-text fragment (#:~:text=Administrator
). Ikiwa maandiko yanapatikana, rasilimali iliyoonyeshwa inachukuliwa, bila kukusudia kuashiria uwepo wake kwa mshambuliaji.
Ili kupunguza, mambo yafuatayo yanapaswa kuzingatiwa:
Ulinganifu wa STTF ulio na mipaka: Scroll-to-text Fragment (STTF) imeundwa kulinganisha maneno au sentensi pekee, hivyo kupunguza uwezo wake wa kuvuja siri au token zisizo za kawaida.
Kikomo kwa Muktadha wa Kivinjari wa Juu: STTF inafanya kazi tu katika muktadha wa kivinjari wa juu na haifanyi kazi ndani ya iframes, hivyo kufanya jaribio lolote la unyakuzi kuwa rahisi kuonekana kwa mtumiaji.
Mahitaji ya Kuanzishwa na Mtumiaji: STTF inahitaji ishara ya kuanzishwa na mtumiaji ili kufanya kazi, ikimaanisha unyakuzi unaweza kufanyika tu kupitia navigations zilizoanzishwa na mtumiaji. Mahitaji haya yanapunguza hatari ya mashambulizi kufanywa kiotomatiki bila mwingiliano wa mtumiaji. Hata hivyo, mwandishi wa blogu anabainisha hali maalum na njia za kupita (k.m. uhandisi wa kijamii, mwingiliano na nyongeza maarufu za kivinjari) ambazo zinaweza kurahisisha kiotomatiki cha shambulio.
Uelewa wa mifumo hii na udhaifu wa uwezekano ni muhimu kwa kudumisha usalama wa wavuti na kulinda dhidi ya mbinu kama hizi za unyakuzi.
Kwa maelezo zaidi angalia ripoti asili: https://www.secforce.com/blog/new-technique-of-stealing-data-using-css-and-scroll-to-text-fragment-feature/
Unaweza kuangalia unyakuzi ukitumia mbinu hii kwa CTF hapa.
Unaweza kubainisha fonti za nje kwa thamani maalum za unicode ambazo zitakusanywa tu ikiwa hizo thamani za unicode zipo kwenye ukurasa. Kwa mfano:
When you access this page, Chrome and Firefox fetch "?A" and "?B" because text node of sensitive-information contains "A" and "B" characters. But Chrome and Firefox do not fetch "?C" because it does not contain "C". This means that we have been able to read "A" and "B".
Reference: Wykradanie danych w świetnym stylu – czyli jak wykorzystać CSS-y do ataków na webaplikację
The technique described involves extracting text from a node by exploiting font ligatures and monitoring changes in width. The process involves several steps:
Creation of Custom Fonts:
SVG fonts are crafted with glyphs having a horiz-adv-x
attribute, which sets a large width for a glyph representing a two-character sequence.
Example SVG glyph: <glyph unicode="XY" horiz-adv-x="8000" d="M1 0z"/>
, where "XY" denotes a two-character sequence.
These fonts are then converted to woff format using fontforge.
Detection of Width Changes:
CSS is used to ensure that text does not wrap (white-space: nowrap
) and to customize the scrollbar style.
The appearance of a horizontal scrollbar, styled distinctly, acts as an indicator (oracle) that a specific ligature, and hence a specific character sequence, is present in the text.
The CSS involved:
Exploit Process:
Step 1: Fonts are created for pairs of characters with substantial width.
Step 2: A scrollbar-based trick is employed to detect when the large width glyph (ligature for a character pair) is rendered, indicating the presence of the character sequence.
Step 3: Upon detecting a ligature, new glyphs representing three-character sequences are generated, incorporating the detected pair and adding a preceding or succeeding character.
Step 4: Detection of the three-character ligature is carried out.
Step 5: The process repeats, progressively revealing the entire text.
Optimization:
The current initialization method using <meta refresh=...
is not optimal.
A more efficient approach could involve the CSS @import
trick, enhancing the exploit's performance.
Reference: PoC using Comic Sans by @Cgvwzq & @Terjanq
This trick was released in this Slackers thread. The charset used in a text node can be leaked using the default fonts installed in the browser: no external -or custom- fonts are needed.
The concept revolves around utilizing an animation to incrementally expand a div
's width, allowing one character at a time to transition from the 'suffix' part of the text to the 'prefix' part. This process effectively splits the text into two sections:
Prefix: The initial line.
Suffix: The subsequent line(s).
The transition stages of the characters would appear as follows:
C ADB
CA DB
CAD B
CADB
During this transition, the unicode-range trick is employed to identify each new character as it joins the prefix. This is achieved by switching the font to Comic Sans, which is notably taller than the default font, consequently triggering a vertical scrollbar. This scrollbar's appearance indirectly reveals the presence of a new character in the prefix.
Although this method allows the detection of unique characters as they appear, it does not specify which character is repeated, only that a repetition has occurred.
Basically, the unicode-range is used to detect a char, but as we don't want to load an external font, we need to find another way. When the char is found, it's given the pre-installed Comic Sans font, which makes the char bigger and triggers a scroll bar which will leak the found char.
Check the code extracted from the PoC:
Reference: Hii inatajwa kama suluhisho lisilofanikiwa katika andiko hili
Kesi hii ni sawa na ile ya awali, hata hivyo, katika kesi hii lengo la kufanya chars fulani kuwa kubwa kuliko zingine ni kuficha kitu kama kitufe kisichopaswa kubonyezwa na bot au picha ambayo haitapakiwa. Hivyo tunaweza kupima kitendo (au ukosefu wa kitendo) na kujua kama char fulani ipo ndani ya maandiko.
Reference: Hii inatajwa kama suluhisho lisilofanikiwa katika andiko hili
Katika kesi hii, tunaweza kujaribu kuvuja kama char ipo katika maandiko kwa kupakia fonti ya uwongo kutoka chanzo kimoja:
Ikiwa kuna mechi, font itapakiwa kutoka /static/bootstrap.min.css?q=1
. Ingawa haitapakia kwa mafanikio, ** kivinjari kinapaswa kukiweka**, na hata kama hakuna cache, kuna mekanism ya 304 not modified, hivyo jibu linapaswa kuwa haraka kuliko mambo mengine.
Hata hivyo, ikiwa tofauti ya muda ya jibu lililohifadhiwa kutoka kwa lile lisilohifadhiwa si kubwa vya kutosha, hii haitakuwa na manufaa. Kwa mfano, mwandishi alitaja: Hata hivyo, baada ya kupima, niligundua kuwa tatizo la kwanza ni kwamba kasi si tofauti sana, na tatizo la pili ni kwamba bot inatumia lippu ya disk-cache-size=1
, ambayo ni ya kufikiria sana.
Marejeleo: Hii inatajwa kama suluhisho lisilofanikiwa katika andiko hili
Katika kesi hii unaweza kuonyesha CSS kupakia mamia ya fonts za uongo kutoka chanzo kimoja wakati mechi inatokea. Kwa njia hii unaweza kupima muda inachukua na kugundua ikiwa herufi inaonekana au la kwa kitu kama:
Na msimbo wa bot unaonekana kama hii:
Hivyo, ikiwa fonti haifananishi, muda wa majibu unapofika kwenye bot unatarajiwa kuwa takriban sekunde 30. Hata hivyo, ikiwa kuna ulinganifu wa fonti, maombi mengi yatatumwa ili kupata fonti, na kusababisha mtandao kuwa na shughuli zisizo na kikomo. Kama matokeo, itachukua muda mrefu kutimiza hali ya kusitisha na kupokea majibu. Kwa hivyo, muda wa majibu unaweza kutumika kama kiashiria kubaini ikiwa kuna ulinganifu wa fonti.
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)