SQLインジェクション脆弱性を持つサイトを作ってみた
はじめに
こんにちは。
くコ:彡がトレードマークの阿部です。
先日、セキュリティ製品の評価にあたり脆弱性を持つWEBサイトを用意する必要がありました。
SQLインジェクション脆弱性を持つ簡易的なWEBサイトを作ってみたので、手順をご紹介します。
Amazon EC2でAmazon Linuxを使用しました。
作ってみたWEBサイト
正しい動き その1
早速ですが、作ってみたサイトのご紹介をします。
ユーザIDとパスワードを指定の上、送信ボタンを選択すると、指定したユーザのメールアドレスが表示されます。
正しい動き その2
存在しないユーザや誤ったパスワードを指定した場合、エラーメッセージを表示します。
SQLインジェクション時の動き
SQLインジェクション攻撃を試してみます。
パスワード欄に'OR 'A' = 'A
を指定すると、全てのユーザのメールアドレスが表示されます。
ユーザ情報が漏れてしまった状況を再現出来ました。
LAMP環境の作成
作成手順の紹介に移ります。
チュートリアル: Amazon Linux への LAMP ウェブサーバーのインストール を元に、LAMP環境を構築しました。
チュートリアルを実行するとAmazon Linuxインスタンスに、Apacheウェブサーバ、PHP、MySQLがインストールされます。
Webコンテンツの配置
/var/www/html/
以下にWEBコンテンツを配置します。
index.html
ログイン画面となるページです。
フォームを用意し、db.phpに遷移するようにしました。
<html> <meta charset="UTF-8"> <head> <title>ログイン画面</title> </head> <body> <form action="db.php" method="post"> <table> <tr> <td>ユーザID</td> <td><input type="text" name="uid"></td> </tr> <tr> <td>パスワード</td> <td><input type="text" name="password"></td> </tr> </table> <input type="submit" value="ログイン"> </form> </body> </html>
db.php
DB接続を行い、SELECT文を実行するページです。
入力をSELECT文に埋め込んでいます。rootユーザのパスワードは適宜、書き換えて下さい。
<html> <meta charset="UTF-8"> <head> <title>ログイン処理</title> </head> <body> <?php $conn = mysql_connect('localhost', 'root', '*******'); $db = mysql_select_db('system', $conn); $uid = $_POST['uid']; $pass = $_POST['password']; $result = mysql_query("SELECT email FROM users where uid='$uid' AND passwd='{$pass}'"); if (mysql_num_rows($result) == 0) { echo "ユーザ名または、パスワードに誤りがあります。"; exit; } while ($row = mysql_fetch_assoc($result)) { print('email addressはこちらです '.$row['email']); print('<br>'); } mysql_close($conn); ?> <a href="index.html">ログイン画面に戻る</a> </body> </html>
データベース設定
ユーザID、パスワード、Emailアドレスを格納するテーブルを用意します。
データベースの作成
チュートリアル中のphpMyAdminを使うと、GUIでテーブルの作成とデータ挿入を行う事が出来ます。
「system」という名前のデータベースを作成します。
テーブルの作成
usersテーブルを作成します。
uid | varchar(20) |
passwd | varchar(20) |
varchar(20) |
データの挿入
サンプルデータを挿入します。
テストの都合上、2レコード以上挿入します。
他のユーザの情報を閲覧出来てしまう状況を再現出来ます。
ここまでの手順で脆弱性のあるWEBサイトが出来上がったはずです。
WEBブラウザでアクセスしてみて下さい。
注意
侵入テストにはAWSへの申請が必要です。実施の際はご留意下さい。
また、インスタンスタイプによってはテストは許可されません。
詳細はこちらをご確認ください。
おわりに
SQLインジェクションの脆弱性を持つWEBサイトを作ってみました。
今後作成したサイトを使って、セキュリティ製品の紹介をしていく予定です。
では、また。