SQLインジェクションが簡単に試せるプログラム(PHP×sqlite)を作ってみた。

Webエンジニアの雄大です。

人様のサイトを攻撃するのは、犯罪の一種なので、
SQLインジェクションが簡単に試すことができるプログラムを作ってみました。
たしかに、逆に試せるサイトなんてあったら、恐ろしい…。

今回、Mysqlなどの準備は面倒なので、sqliteを今回作っています。

ソースをダウンロードして、適切な場所におけば、そのまま使えます。

自分の環境は
・OS:Window7
・xampp:1.74
・PHP:5.35
です。

learn_sql.php

<?php
  /** *author:Yuta *twitter account:@q2e2d2 @yuta222 **/
?>
<form action="sql.php" method="POST">
username:<input type="text" name="username"><br />
password<input type="text" name="password">
<input type="submit" value ="Login">
</form>
<?php
if(isset($_POST["username"]) and isset($_POST["password"])){
    $username = $_POST["username"];
    $password = $_POST["password"];
    $db = sqlite_open("sample.sqlite");
    $query = sqlite_query($db,"select * from sample where username='$username' and password='$password'");
    $dataset = sqlite_fetch_all($query,SQLITE_ASSOC);
    if(!empty($dataset)){
        foreach($dataset as $record){
            echo "id:".$record["id"]."<br />";
            echo "username:".$record["username"]."<br />";
            echo "password:".$record["password"]."<br /><hr />" ;
        }
    }
    else{
        echo"Login Error";
    }
}
?>

正しい、usernameとpasswordを入力すると、
ログインができ、id,username,passwordが見えるというものです。
passwordが隠れないようにしたのは、sqlインジェクションを試しやすいようにするためです。

sample.sqliteには
テーブル名:sample
カラム:id,username,password

入っているのは
id:1
username:test
password:testpass

id:2
username:test2
password:testpass2

です。

使っているsql文は
select * from sample where username=’$username’ and password=’$password’

当然、
username:test
password:testpassを入力すると

select * from sample where username=’test’ and password=’testpass’
となり、

下記のようになります。

しかし、悪意をもって、usernameにこのような値を入れます。
‘ OR 1=1–
これは

select * from sample where username=” OR 1=1–‘ and password=’$password’
となり、
–以下はコメントとみなされるので
username=” OR 1=1
となり、id:1,id:2のパスワードは簡単に見れてしまいます。

全てのユーザの名前やパスワードが見れてしまいます…。

無知は怖いですね。。。。くれぐれも他のサイトなどでお試ししないようにしてください。

サンプルのソースやsqliteは自分のサイトのトップページにリンクを貼っておきました。
トップページへ

コメント

  1. […] SQLインジェクションが簡単に試せるプログラム(PHP×sqlite)を作ってみた。 […]

タイトルとURLをコピーしました