SQLインジェクション脆弱性を持つサイトを作ってみた

2016.05.12

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

こんにちは。
くコ:彡がトレードマークの阿部です。

先日、セキュリティ製品の評価にあたり脆弱性を持つWEBサイトを用意する必要がありました。
SQLインジェクション脆弱性を持つ簡易的なWEBサイトを作ってみたので、手順をご紹介します。
Amazon EC2でAmazon Linuxを使用しました。

作ってみたWEBサイト

正しい動き その1

早速ですが、作ってみたサイトのご紹介をします。
ユーザIDとパスワードを指定の上、送信ボタンを選択すると、指定したユーザのメールアドレスが表示されます。

9

10

正しい動き その2

存在しないユーザや誤ったパスワードを指定した場合、エラーメッセージを表示します。

10-1

SQLインジェクション時の動き

SQLインジェクション攻撃を試してみます。
パスワード欄に'OR 'A' = 'Aを指定すると、全てのユーザのメールアドレスが表示されます。
ユーザ情報が漏れてしまった状況を再現出来ました。

11

12

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」という名前のデータベースを作成します。

1

テーブルの作成

usersテーブルを作成します。

uid varchar(20)
passwd varchar(20)
email varchar(20)

2

データの挿入

サンプルデータを挿入します。
テストの都合上、2レコード以上挿入します。
他のユーザの情報を閲覧出来てしまう状況を再現出来ます。

3

ここまでの手順で脆弱性のあるWEBサイトが出来上がったはずです。
WEBブラウザでアクセスしてみて下さい。

注意

侵入テストにはAWSへの申請が必要です。実施の際はご留意下さい。
また、インスタンスタイプによってはテストは許可されません。
詳細はこちらをご確認ください。

おわりに

SQLインジェクションの脆弱性を持つWEBサイトを作ってみました。
今後作成したサイトを使って、セキュリティ製品の紹介をしていく予定です。
では、また。