この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
はじめに
こんにちは。
くコ:彡がトレードマークの阿部です。
先日、セキュリティ製品の評価にあたり脆弱性を持つ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サイトを作ってみました。
今後作成したサイトを使って、セキュリティ製品の紹介をしていく予定です。
では、また。