SQLインジェクションのデモをする環境を構築する③

セキュリティ

今回でSQLiがあるコンテンツを作成したいと思います。

かなり時間がかかってしまって申し訳ございません。

では早速前回動かなかった理由からいきます!

なぜかというと、新しいMysqlでは「mysql_connect()」等はありません。

なので、前回エラーログを見た際に未定義の関数ですと表示されていました。

googleで「mysql_connect php7」とかで検索すると色々出てきます。

mysqlからmysqliに変更しなければなりません。

なので、以下を必死で繰り返します。(勉強会前日はこんな感じでした。)

修正

動かす

エラーになる

エラーログ見る(エラー箇所の行数も確認)

調べる

修正(最初に戻る)

そこで気づいたのですが、以下をインストールして、Apacheを再起動しないと有効になりませんでした。(勉強会のデモの時はmariadbを使ってたから大丈夫だったのかな?)

エラーログを見るのは本当に大事です!

$ sudo apt install php-mysql
$ sudo service apache2 restart

再起動後作成したのが以下のソースです。

<html>
<meta charset="UTF-8">
<head>
<title>ログイン処理</title>
</head>
<body>
<?php
$mysqli = new mysqli('localhost', 'tokoroten', 'assword1111aaaa!A', 'testuser');
$uid = $_POST['uid'];
$pass = $_POST['password'];
$sql= "SELECT * FROM users where uid = '$uid' AND passwd = '$pass'";
$result = $mysqli->query($sql);
if ($result->num_rows == 0) {
echo "ユーザ名または、パスワードに誤りがあります。";
exit;
}
while ($row = mysqli_fetch_assoc($result)) {
print('mail addressはこちらです '.$row['mail']);
print('<br>');
}
$mysqli->close();
?>
<a href="index.html">ログイン画面に戻る</a>
</body>
</html>

手続き型も混じっていてカッコ悪いですが、検証用なので、動けばOKとしましょう!

さてもう一度対象にアクセスします。

ユーザIDとパスワードを前回作成した内容に合わせて、「ログイン」ボタンを押します。

すると・・・

今度はちゃんとDBから情報を取得することができました!

ではSQLiがあるか見てみます。

まずは「’」を入力します。

するとエラーになります。

「’」が有効でエラーになってるんでしょう!(ソース見てるし。)

次によくあるパーンである「’ and ‘a’=’a」を挿入してみましょう!

すると今度はエラーにはならず結果が返ってきました。

これはもうSQLiが有ると判断してもいい状態ですね!(ソース見てるし。)

パスワードの方にもSQLiはあるので、今度はパスワードの後ろに「’ or ‘a’=’a」と入れてみましょう!

すると今度はDBに登録されているメールアドレスが全件表示されてしまいました。

これでSQLiがあるコンテンツは作成完了です!

この後はKali Linuxのsqlmapを使用して、がっつりとDBの情報を取るのですが、それは次回にします。

次回:sqlmapを使ってデータベースの中身をのぞいてみよう!

皆様も手を動かして、作成してみてください。色々発見がありますよ。

私みたいなプログラムを普段やらず、仕事ではスクリプトをちょこっと書くぐらいで、DB接続とかは全く触らない素人でも何とかなるので、是非ともチャレンジしてみてください!

質問や不明点、要望等あれば、コメントやツイッター等で連絡をお願いします。

コメント