攻撃方法を知っておかないとセキュリティは保てないということで、自分でシステムを作り自分で攻撃してみます。 悪用は厳禁です。攻撃方法は各自学習してみてください。12月7日記事

目次





テーブル作成

DDL

CREATE TABLE Vul_account(
id INT NOT NULL AUTO_INCREMENT,
email VARCHAR(255) NOT NULL,
passwd VARCHAR(255) NOT NULL,
name VARCHAR(255) NOT NULL,
PRIMARY KEY(id),
INDEX multi(email,passwd)
)

DML

INSERT INTO Vul_account(email,passwd,name) VALUES('hoge@hoge.com','password','taro');
INSERT INTO Vul_account(email,passwd,name) VALUES('fuga@hoge.com','password','hanako');
INSERT INTO Vul_account(email,passwd,name) VALUES('piyo@hoge.com','password','jiro');
INSERT INTO Vul_account(email,passwd,name) VALUES('foo@hoge.com','password','saburo');

mysql_queryという昔のクエリ方法を使う

今では 非推奨 となっており、PDOを使う方法が推奨されています。

コード

ログインフォームを作り、IDとPASSWORDが一致していれば、ログインする仕組みを作る。
index.php

<?php
require ('config.php');
$link = mysql_connect($db_host, $db_user, $db_password);
mysql_select_db($db_name) or die(mysql_error());
$result = mysql_query('set character set utf8') or die(mysql_error());
$message = NULL;
if (isset($_POST['submit'])) {
    $sql = "SELECT * FROM Vul_account WHERE email = '" . $_POST['id'] . "' AND passwd = '" . $_POST['pass'] . "'"; //パスワード認証のクエリ
    print $sql; //どんなクエリが投げられているかを見るために残しておきます。
    $result = mysql_query($sql); //クエリ投げる
    $user = mysql_fetch_array($result); //認証できた場合受け取る
    //print_r($user);
    if ($user == NULL) {
        $message = 'IDまたはパスワードが違います。';
    } else {
        session_set_cookie_params(60 * 1); //1分間のlifetime
        session_start();
        $_SESSION["name"] = $user["name"];
        header("Location: home.php"); //ホーム画面へリダイレクト
        
    }
}
?>
<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8">
<link rel="stylesheet" type="text/css" href="../reset.css">
<link rel="stylesheet" type="text/css" href="style.css">
<title>SQLインジェクションしてみる</title>
</head>
<body>
<form action="index.php" method="post">
	<ul>
    <li>email<input type="text" name="id"></li>
    <li>PASSWORD<input type="password" name="pass"></li>
    <li><input type="submit" name="submit" value="ログイン"></li>
    </ul>
</form>
<?php echo $message; ?>
</body>
</html>

home.php

<?php
session_start();
?>
<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8">
<link rel="stylesheet" type="text/css" href="../reset.css">
<link rel="stylesheet" type="text/css" href="style.css">
<title>ホーム画面</title>
</head>
<body>
<p><?php echo $_SESSION["name"] ?>さんこんにちは。</p>
</body>
</html>



攻撃方法

メールアドレスやpasswordというパスワードを知らなくてもログインすることができます。各自調べてみてください。

色々なセキュリティ対策

  1. PDOを使う
  2. 生パスワードは格納しない。何かでハッシュ化する
  3. saltを設ける
最終更新:2015年12月07日 19:08