web-dev-qa-db-ja.com

反映されたXSSスクリプトがURLを通過して動作するようにする方法と動作するための前提条件は何ですか

セキュリティについて学ぶために、Apacheサーバーがサービスを提供する1つのHTMLページで構成される最も単純なWebサイトをローカルホストに設定しました。私は最初に、実行されるJSスクリプトをURLの末尾に追加しようとしました。
/index.html?message=<script>alert('XSS');</script>

ブラウザはそれを次のようにエンコードします。

/index.html?message=%3Cscript%3Ealert(%27XSS%27);%3C/script%3E

この種の攻撃ベクトルが機能する方法についての私の理解は、攻撃者が同様のURLを被害者に送信する->被害者がクリックする->スクリプトが実行される(それが実行される正確なタイミングがわからない?)

質問:

  1. なぜ実行されないのですか?
  2. 実行させる方法は?
  3. このような攻撃の前提条件は何ですか?単純なWebページを用意するだけでは十分ではない可能性がありますか?
  4. このスクリプトはいつ実行する必要がありますか? DOMが読み込まれた後?

これがどのように機能するかについての一般的な説明も大歓迎です。ありがとうございました!

XSS攻撃は、入力がエンドユーザーのブラウザーへの出力になるという事実に基づいています。最も一般的な攻撃は、基本的にPHPを含むサイトです

_<?php
echo $_GET["message"];
?>
_

次に、このURLにJavaScriptコードを含むパラメータを渡します。これを設定する場合は、Webサーバーに_something.php_ファイルを作成し、上記のコードを入力して、ブラウザーでhttp://your-server/something.php?message=<script>alert('XSS');</script>にアクセスします。次に、XSSを含むポップアップが表示されます。

静的HTMLページでは、サーバーの静的HTMLコードに基づいてコンテンツを生成するだけなので、これは不可能です。 XSSには、ユーザー指定のコードを含める必要があります。除外は、htmlが脆弱なJavaScriptコードをロードする場合、ユーザーが入力できるようにします。

XSSの主なポイントは、攻撃者が実際にWebサーバーをハッキングすることなく、自分のWebサイトにHISコードを含めることを望んでいることです。これは、攻撃者が以前にサーバーに入力した何かを出力するサーバー側プログラミング言語でのみ可能です。

基本的にハッカーはHTMLがこのようにブラウザに見えることを望んでいます

_<html><body>Foo<script>alert('XSS');</script></body></html>
_

の代わりに

_<html><body>Foo</body></html>
_

たとえば、フォーラムや記事へのコメントを考えてみてください。ユーザーは発言を残すことを許可する必要があります。サーバーはこれを保存し、同じコメントを他のユーザーに提示する必要があります。コメント自体にJavaScriptコードが含まれていて、サーバープログラムがこれを軽減しない場合、コメントブロックの一部として同じコードが出力されます。

これがブラウザに読み込まれるタイミングについては、簡単に答えることはできません。それは、ハッカーのコードがページ本体のどこに含まれているか、または後でロードされるJavaScriptファイルに依存します。メインのHTMLにJavaScriptタグとして含まれている場合は、DOMの読み込みが完了した後に読み込まれます。特に前述のように、XSSの脆弱性はJavaScriptファイル内でも発生する可能性があります(URLなどのユーザー入力を受け取り、ロードします)。この場合、正確にコードがいつ実行されるかを言うことはできません。このJavaScriptコードをボタン、テキストボックスのonblur()イベント、またはタイマーにバインドできます。

編集:

Javascript攻撃について詳しく説明すると、サーバーファイルに次のように入力します。

_<html><body>
<script type="text/javascript">
    var queryDict = {};
    location.search.substr(1).split("&").forEach(function(item) {queryDict[item.split("=")[0]] = item.split("=")[1]});
    document.write(decodeURIComponent(queryDict["message"]));
</script>
</body></html>
_

最初の2行は、基本的にすべてのGETパラメーターを受け取り、それらを配列に分割します( here から取得)。 3行目は、これをHTMLページに出力します。もちろん、これは、実行されたコードから他のDOM操作によって行うこともできます。

5
Spacy