Insecure PHP Programming
× [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= のように入力したとしても、このログインフォームでは、クロスサイトスクリプティングはできません。実際にそのように入力しても警告は表示されません。 これは、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) へ続く。
脆弱性のあるログインフォーム の解説です。ソースコードをまだ見られていない方は、まず、脆弱性のあるログインフォーム をご覧ください。
すでにコメントでほぼ明らかになっていますが、このコードの二つ目の脆弱性は、
の $_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 タグは、
となります。 実際にやってみるとすぐにわかりますが、この時、警告ダイアログがブラウザの画面に表示されます。入力した 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) |
カレンダー
カテゴリー
最新記事
(11/21)
(11/13)
(11/13)
(11/09)
(11/06)
最新トラックバック
プロフィール
HN:
Kenji
性別:
非公開
ブログ内検索
|