今回で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接続とかは全く触らない素人でも何とかなるので、是非ともチャレンジしてみてください!
質問や不明点、要望等あれば、コメントやツイッター等で連絡をお願いします。
コメント
デモ環境作ってみました。
SQLインジェクション対策はどうやるんでしょうか?
ココナツさん
コメントありがとうございます。検証環境はちゃんと動きましたでしょうか?
そういえばSQLインジェクションの対策やってませんでしたね。申し訳ありません。。。
基本的にはプレースホルダを使用すればOKです。何かしらの理由があって使えなければ値のチェックを厳密にする等があります。
週末に記事を準備させていただきます。
検証環境もしっかり動きました!
お忙しい中ありがとうございます!
よろしくお願いいたします。
ココナツさん
つたない内容ですが、記事にしてみましたのでお時間があるときにでも見てみてください。
https://nekotosec.com/measures-for-sqlinjection/
よろしくお願いします。