web-dev-qa-db-ja.com

PHP_SELFおよびXSS

と主張する記事を見つけました$_SERVER['PHP_SELF']はXSSに対して脆弱です。

正しく理解できたかどうかはわかりませんが、間違いだと思います。

これはどのようにXSS攻撃に対して脆弱である可能性がありますか?

<form method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>">
  <!-- form contents -->
</form>
32
McRonald

安全に使用するには htmlspecialchars() を使用する必要があります。

<?php echo htmlspecialchars($_SERVER["PHP_SELF"], ENT_QUOTES, "utf-8"); ?>

方法については ほぼすべてのXSS脆弱性PHP私が書いたフォーム を参照してください$_SERVER["PHP_SELF"]が攻撃される可能性があります。

32
John Conde

これは確かにXSSの脆弱性です。それがあなたのウェブサイトに害を及ぼさないかもしれないとあなたが信じていることを私は理解していますが、これはそれが本物ではないという意味ではありません。

信じられない場合は、以下を試してください。

「registration.php」などのページがあると想定しています。アクションが次のフォームであると想定します。

<?php echo $_SERVER['PHP_SELF']; ?>

あなたが実際にそれを置いたとき:

<form method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>">
  <!-- form contents -->
</form>

以下の文字列を追加するだけです

%27%22/%3E%3Cscript%3Ealert(1)%3C/script%3E

PHP_SELFはURLを反映しているため、実際に理解するのは難しくありません。アプリケーションは、URLに入力したものをすべて読み取り、それをエコーし​​ます。それは簡単です。

htmlspecialcharsが問題に対処する必要があります。証拠に異議を唱える理由はありません。

<form method="post" action="<?php echo htmlspecialchars($_SERVER['PHP_SELF']); ?>">
   <!-- form contents -->
</form>

ただし、これはCookieを盗むための最初のステップですが、自動的に行われるわけではありません。 (攻撃者がサイトに登録してCookieがどのように表示されるかを確認するなどして)攻撃を作成するのが非常に簡単な場合でも、Cookieを盗むには、他の一連の要因が当てはまる必要があります。状況。たとえば、Cookieの有効期限が切れてはいけません。 Cookieの複雑さによって異なります。サーバーに配置する他の予防策があるかもしれませんが、Cookieの存在に基づくすべての認証である必要はありません。

私は、すべての条件を満たすためのプログラミングはかなり難しく、本当に悪いと信じています(たとえば、yahoo.mailにそのような脆弱性があったとしても、インターネットを見ると、エクスプロイトとCookieデコーダさえ見つかります)、XSSはあなたのサイトがそれに苦しんでいる場合、狡猾な攻撃者が何をする可能性があるかを知っています。治療法は簡単です...

26
Florin Sima

あなたがリンクしたまさにその記事はあなたに与える:

http://www.example.com/form.php/%22%3E%3Cscript%3Ealert(‘xss attack’)%3C/script%3E%3Cbr%20class=%22irrelevant

何がわからないの?

編集:これはXSS攻撃です。これは、私のサイトからあなたへのリンクを非表示にできるためです。URLにJSを追加してCookieを送信すると、そのリンクをクリックするとすぐに、あなたはpwndになります。

17
chx

PHPでスーパーグローバルにアクセスするには、 filter_input() を使用する必要があります。フィルターを FILTER_SANITIZE_FULL_SPECIAL_CHARS に設定すると、XSSで通常使用される安全でない文字が削除されます。あなたの例を考えると:

<form method="post" 
    action="<?php filter_input(INPUT_SERVER, 'PHP_SELF', FILTER_SANITIZE_FULL_SPECIAL_CHARS); ?>">
<!-- form contents -->
</form>
5
Adam Bowen