CSS Injection
CSS Injection
Attribute Selector
CSS selectors zimeandaliwa ili kuendana na thamani za input
kipengele cha name
na value
attributes. Ikiwa kipengele cha input kina thamani ya attribute inayoanza na herufi maalum, rasilimali ya nje iliyowekwa awali inachukuliwa:
Hata hivyo, mbinu hii inakabiliwa na kikomo wakati wa kushughulikia vipengele vya ingizo vilivyofichwa (type="hidden"
) kwa sababu vipengele vilivyofichwa havipakui mandharinyuma.
Kupita kwa Vipengele Vilivyofichwa
Ili kuzunguka 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 ingizo kilichofichwa, 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.
Prerequisites for CSS Injection
For the CSS Injection technique to be effective, certain conditions must be met:
Payload Length: Upeo wa CSS lazima uunge mkono urefu wa kutosha wa payloads ili kuzingatia wachaguzi walioundwa.
CSS Re-evaluation: Unapaswa kuwa na uwezo wa kuunda 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.
Blind Attribute Selector
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.
@import
Mbinu ya awali ina mapungufu fulani, angalia mahitaji. Unahitaji kuwa na uwezo wa kutuma viungo vingi kwa mwathirika, au unahitaji kuwa na uwezo wa iframe kurasa zilizo na 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 mzigo 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 mzigo wa 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 mzigo wa kuvuja waifuatayo.
Sehemu ya pili na kubwa ya mzigo itakuwa mzigo wa kuvuja wa 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 2, 3 na 4, lakini wakati huu litajaribu kupata herufi ya pili ya siri na kisha ya pili 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 zaidi.
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.
Wateule wengine
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:
XS-Search inayotegemea makosa
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 iliyotajwa (favicon.ico
) haiwezi kupakuliwa.
Matumizi ya Fonti ya Kijadi:
Fonti ya kijadi inafafanuliwa kwa kutumia sheria ya
@font-face
ndani ya tag<style>
katika sehemu ya<head>
.Fonti inaitwa
poc
na inapatikana kutoka kwa kiungo cha nje (http://attacker.com/?leak
).Mali ya
unicode-range
imewekwa kuwaU+0041
, ikilenga herufi maalum ya Unicode 'A'.
Element ya Kitu na Maandishi ya Kurejelea:
Element ya
<object>
yenyeid="poc0"
imeundwa katika sehemu ya<body>
. Element hii inajaribu kupakia rasilimali kutokahttp://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 ya kijadi
poc
ikiwa rasilimali ya nje haiwezi kupakiwa.
Mtindo wa Scroll-to-Text Fragment
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 yalengewe wazi na fragment.
Kuna wasiwasi wa usalama unapojitokeza wakati washambuliaji wanatumia kipengele cha Scroll-to-text fragment, 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 inaloadiwa, bila kukusudia kuashiria uwepo wake kwa mshambuliaji.
Ili kupunguza hatari, 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 tokens 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 Uanzishaji wa Mtumiaji: STTF inahitaji ishara ya uanzishaji wa mtumiaji ili kufanya kazi, ikimaanisha unyakuzi unaweza kufanyika tu kupitia navigations zilizoanzishwa na mtumiaji. Mahitaji haya yanapunguza sana 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 asilia: 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.
@font-face / unicode-range
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".
Text node exfiltration (I): ligatures
Reference: Wykradanie danych w świetnym stylu – czyli jak wykorzystać CSS-y do ataków na webaplikację
Teknik inayozungumziwa inahusisha kutoa maandiko kutoka kwa node kwa kutumia ligatures za fonti na kufuatilia mabadiliko katika upana. Mchakato unajumuisha hatua kadhaa:
Uundaji wa Fonti za Kijadi:
Fonti za SVG zinatengenezwa na glyphs zikiwa na sifa ya
horiz-adv-x
, ambayo inaweka upana mkubwa kwa glyph inayowakilisha mfuatano wa herufi mbili.Mfano wa glyph ya SVG:
<glyph unicode="XY" horiz-adv-x="8000" d="M1 0z"/>
, ambapo "XY" inamaanisha mfuatano wa herufi mbili.Fonti hizi kisha zinabadilishwa kuwa muundo wa woff kwa kutumia fontforge.
Ugunduzi wa Mabadiliko ya Upana:
CSS inatumika kuhakikisha kuwa maandiko hayaandikiki (
white-space: nowrap
) na kubadilisha mtindo wa scrollbar.Kuonekana kwa scrollbar ya usawa, iliyopangwa tofauti, inafanya kazi kama kiashiria (oracle) kwamba ligature maalum, na hivyo mfuatano maalum wa herufi, upo katika maandiko.
CSS inayohusika:
Mchakato wa Kutumia:
Hatua ya 1: Fonti zinaundwa kwa ajili ya jozi za herufi zikiwa na upana mkubwa.
Hatua ya 2: Hila inayotegemea scrollbar inatumika kugundua wakati glyph yenye upana mkubwa (ligature kwa jozi ya herufi) inapotolewa, ikionyesha uwepo wa mfuatano wa herufi.
Hatua ya 3: Baada ya kugundua ligature, glyph mpya zinazowakilisha mfuatano wa herufi tatu zinaundwa, zikijumuisha jozi iliyogunduliwa na kuongeza herufi inayotangulia au inayofuatia.
Hatua ya 4: Ugunduzi wa ligature ya herufi tatu unafanywa.
Hatua ya 5: Mchakato unarudiwa, ukifunua maandiko yote hatua kwa hatua.
Uboreshaji:
Njia ya sasa ya kuanzisha inayotumia
<meta refresh=...
si bora.Njia bora zaidi inaweza kujumuisha hila ya CSS
@import
, ikiboresha utendaji wa matumizi.
Text node exfiltration (II): leaking the charset with a default font (not requiring external assets)
Reference: PoC using Comic Sans by @Cgvwzq & @Terjanq
Hila hii ilitolewa katika Slackers thread. Charset inayotumika katika node ya maandiko inaweza kuvuja kwa kutumia fonti za kawaida zilizowekwa kwenye kivinjari: hakuna fonti za nje -au za kawaida- zinazohitajika.
Dhana inahusisha kutumia uhuishaji kupanua upana wa div
hatua kwa hatua, ikiruhusu herufi moja kwa wakati mmoja kuhamia kutoka sehemu ya 'suffix' ya maandiko hadi sehemu ya 'prefix'. Mchakato huu unagawanya maandiko katika sehemu mbili:
Prefix: Mstari wa awali.
Suffix: Mstari wa baadaye.
Hatua za mpito za herufi zitaonekana kama ifuatavyo:
C ADB
CA DB
CAD B
CADB
Wakati wa mpito huu, unicode-range trick inatumika kubaini kila herufi mpya inapojiunga na prefix. Hii inafanywa kwa kubadilisha fonti kuwa Comic Sans, ambayo ni ndefu zaidi kuliko fonti ya kawaida, hivyo kusababisha kuonekana kwa scrollbar ya wima. Kuonekana kwa scrollbar hii kunaonyesha kwa njia isiyo ya moja kwa moja uwepo wa herufi mpya katika prefix.
Ingawa njia hii inaruhusu kugundua herufi za kipekee zinapojitokeza, haijabainisha ni herufi ipi inarudiwa, bali tu kwamba kurudiwa kumetokea.
Kimsingi, unicode-range inatumika kugundua char, lakini kwa kuwa hatutaki kupakia fonti za nje, tunahitaji kupata njia nyingine. Wakati char inapatikana, inapewa fonti ya Comic Sans iliyowekwa awali, ambayo inafanya char kuwa kubwa na inasababisha scroll bar ambayo itavuja char iliyopatikana.
Check the code extracted from the PoC:
Text node exfiltration (III): leaking the charset with a default font by hiding elements (not requiring external assets)
Reference: Hii inatajwa kama suluhisho lisilo fanikiwa katika andiko hili
Kesi hii ni sawa sana 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.
Text node exfiltration (III): leaking the charset by cache timing (not requiring external assets)
Reference: Hii inatajwa kama suluhisho lisilo fanikiwa katika andiko hili
Katika kesi hii, tunaweza kujaribu kufichua kama char ipo katika maandiko kwa kupakia fonti bandia 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 isiyo badilishwa, 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 lipo disk-cache-size=1
, ambalo ni la kufikiria sana.
Uhamasishaji wa nodi ya maandiko (III): kuvuja charset kwa kupima kupakia mamia ya "fonts" za ndani (zinazohitaji mali za nje)
Marejeo: Hii inatajwa kama suluhisho lisilo fanikiwa katika andiko hili
Katika kesi hii unaweza kuonyesha CSS kupakia mamia ya fonts za uwongo 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.
Marejeleo
Last updated