忍者ブログ
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

脆弱性のあるログインフォーム の解説です。ソースコードをまだ見られていない方は、まず、脆弱性のあるログインフォーム をご覧ください。


この脆弱性を取り除くには、

<form method="POST" action="<?php echo $_SERVER['PHP_SELF']; ?>">

の部分は、以下のようにするのがよいと思います。

<form method="POST" action="">

あるいは、$_SERVER['PHP_SELF'] を htmlspecialchars() でエスケープ処理する方法もあるかと思います。

<form method="POST" action="<?php echo htmlspecialchars($_SERVER['PHP_SELF'], ENT_QUOTES, 'UTF-8'); ?>">


また、以下のユーザ名の入力値を表示する部分は、

<input type="text" name="username" value="<?php echo $_POST['username']; ?>

以下のように、htmlspecialchars() でエスケープ処理します。

<input type="text" name="username" value="<?php echo htmlspecialchars($_POST['username'], ENT_QUOTES, 'UTF-8'); ?>

htmlspecialchars() でエスケープ処理する場合は、必ず、第2引数に ENT_QUOTES を指定しましょう。デフォルトでは、シングルクオート(')がエスケープされませんので、シングルクオートでインジェクションできるケースでは脆弱性が残る可能性があります。
PR
脆弱性のあるログインフォーム の解説です。ソースコードをまだ見られていない方は、まず、脆弱性のあるログインフォーム をご覧ください。


補足ですが、コメントにあったように URL を

http://localhost/this.php?username=%22%3E%3Cscript%20type=
%22text/javascript%22%3Ealert('xss')%3C/script%3E%3Ca%20name=%22a


のように入力したとしても、このログインフォームでは、クロスサイトスクリプティングはできません。実際にそのように入力しても警告は表示されません。

これは、username の表示に、

$_POST['username']


と $_POST を使っているために、GETリクエストで値を送信しても無視されるためです。これを上記のように GET でも攻撃可能にするには、$_POST を $_REQUEST に変更すれば ok です。具体的には、

ユーザ名: <input type="text" name="username" value="<?php echo $_REQUEST['username']; ?>"><br>


です。

こうすれば、inputタグは、以下のようになり、スクリプトが実行可能になります。

<input type="text" name="username" value=""><script type="text/javascript">alert('xss')</script><a name="a">

ログインフォームの脆弱性(4) へ続く。
脆弱性のあるログインフォーム の解説です。ソースコードをまだ見られていない方は、まず、脆弱性のあるログインフォーム をご覧ください。



すでにコメントでほぼ明らかになっていますが、このコードの二つ目の脆弱性は、


<form method="POST" action="<?php echo $_SERVER['PHP_SELF']; ?>">


の $_SERVER['PHP_SELF'] をそのまま表示していることです。$_SERVER['PHP_SELF'] は 現在実行しているスクリプトのファイル名ですが、この値には PATH_INFO も含まれます。

例えば、URL に「http://localhost/this.php/%22%3E%3Cscript%3Ealert('xss')%3C/script%3E%3Ca%20name=%22a」と入力すると、この form タグは、


<form method="POST" action="/this.php/"><script>alert('xss')</script><a name="a">


となります。

実際にやってみるとすぐにわかりますが、この時、警告ダイアログがブラウザの画面に表示されます。入力した JavaScript のコードがブラウザで実行されていることがわかります。

これで、ユーザが自由に JavaScript コードをページに埋め込むことができることがわかります。これも、クロスサイトスクリプティング(XSS)脆弱性です。

ログインフォームの脆弱性(3) へ続く。

脆弱性のあるログインフォーム の解説です。ソースコードをまだ見られていない方は、まず、脆弱性のあるログインフォーム をご覧ください。



すでにコメントでほぼ明らかになっていますが、このコードの脆弱性のひとつは、

ユーザ名: <input type="text" name="username" value="<?php echo $_POST['username']; ?>"><br>


の $_POST['username'] をそのまま表示していることです。$_POST['username'] はユーザが POSTメソッドで送信した usernameフィールドの値ですね。

例えば、ユーザ名に「"><script>alert('xss')</script><a name="a」と入力すると、この inputタグは、

<input type="text" name="username" value=""><script>alert('xss')</script><a name="a">


となります。

実際にやってみるとすぐにわかりますが、この時、警告ダイアログがブラウザの画面に表示されます。入力した JavaScript のコードがブラウザで実行されていることがわかります。

これで、ユーザが自由に JavaScript コードをページに埋め込むことができることがわかります。これは、典型的なクロスサイトスクリプティング(XSS)脆弱性です。

これが何故、危険かわからない人がいましたら、コメントにその旨ご記入ください。

続きは、ログインフォームの脆弱性(2)


忍者ブログ [PR]
カレンダー
03 2024/04 05
S M T W T F S
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
最新コメント
[02/18 ryu]
[11/21 ぴろ]
[11/07 NONAME]
[11/02 NONAME]
[11/02 NONAME]
最新トラックバック
プロフィール
HN:
Kenji
性別:
非公開
ブログ内検索