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は自分のサイトのトップページにリンクを貼っておきました。
トップページへ
コメント
[…] SQLインジェクションが簡単に試せるプログラム(PHP×sqlite)を作ってみた。 […]