DVWAにSQLインジェクションを仕掛けてパスワードを抜いてみる!

前回インストールしたDVWAでSQL Injection を試してみる。

SQLインジェクションとは?

Wikiによると

SQLインジェクション(英: SQL Injection)とは、アプリケーションのセキュリティ上の不備を意図的に利用し、アプリケーションが想定しないSQL文を実行させることにより、データベースシステムを不正に操作する攻撃方法のこと。 また、その攻撃を可能とする脆弱性のことである。

だそうです。

実際に攻撃してみた方が分かりやすいと思うので、なんとなく不正攻撃だと思っておけばOKです(笑)

どんなWEBアプリケーションなのか?

このような画面でUser IDを入力しSubmitを押すとFirst namとSurnameを返してくるプログラムのようです。

SnapCrab_NoName_2016-5-13_15-37-32_No-00

試しに3をでも。

SnapCrab_NoName_2016-5-13_15-37-43_No-00

まずは、PHPのソースコードを見てみます。

入力フォームからidを取得してSQLコマンドへ渡してデータベースから検索するというPHPコードになっています。このPHPにはフォームにSQL文を入力して他の情報を抜き取るSQLインジェクションという攻撃をされる可能性があります。

この脆弱性を突いてデータベースから情報を抜き取ります。

SQLインジェクションを仕掛ける

全てのフィールドを取得

これがSQL文

idの部分にSQL文を書いて別の結果を受け取るということをします。

実際に実行される命令は以下の通り

SQLのSELECTは結果がTRUEになれば実行される命令です。

今回の場合1行目のid = なし OR 空が空の時TRUEになれば実行されるという意味です。そもそも空=空の時点で100%TRUEになるので全てのフィールドが表示されるという仕組みです。ですから空の部分を1=1としてもTRUEになるので、1でも可能です。

存在するすべてのフィールドが表示されました。

SnapCrab_NoName_2016-5-12_23-56-53_No-00

SQLでは union を使用するとSELECT文を統合する事が可能です。この仕組みを利用して新たなSELECT文を書いてみます。

SQLバージョンを取得

SQLでデータベースバージョンを取得するにはversion()か@@viersionを使用します。

@@viesionを使用してデータベースのバージョンを取得してみる。

エラーが返ってきた。。。

調べてみると、unionはフィールド数が揃っていないとエラーになるらしい。

ということで select文にnullを追加してフィールド数を合わせる事に。

成功した!

使用しているMariaDB、バージョン10.1.13と出てきました。

SnapCrab_NoName_2016-5-12_23-55-50_No-00

ホスト名取得

ついでに@@hostnameでホストネームも表示してみる。

現在のホストネームが返ってきた。

SnapCrab_NoName_2016-5-13_0-0-8_No-00

スポンサードリンク

データベース名/ホスト名取得

database(),user()を実行してデータベース名とユーザ名を取得します。

SnapCrab_NoName_2016-5-13_12-45-32_No-00

データベースから全てのテーブルを取得

SQLではinformation_schemaを利用してテーブルの取得が可能です。これを利用して全てのテーブルを取得します。

全てのテーブルが取得できました。ただし、これは今回必要の無いデータベースまで取得しています。

SnapCrab_NoName_2016-5-13_12-57-59_No-00

DVWAのデータベースからパスワードを取得

クラッキングっぽくなってきましたね。上ではinformation_schemaから全てのテーブルを取得していましたが、今度は攻撃したいスキーマのテーブルを取得します。

database()でデータベース名「dvwa」を取得しているので、これを利用します。

意味としては

select table_name,table_schema    → テーブル名とスキーマ名を取得

from information_schema.table → information_schemaから

where table_schema=’dvwa’ → 条件はtabel_schema=’dvwa’の時

という意味になります。

該当するテーブルは「guestbook」「users」という結果が返ってきました。

SnapCrab_NoName_2016-5-13_13-39-10_No-00

次はカラムを取得します。MySQLのメニューから取得できる情報が分かりますのでこちらからどうぞ。

information_schema.columnsはtable_name,とcolumn_nameが取得できるので「dvwa」のカラム(フィールド)を取得します。

SnapCrab_NoName_2016-5-13_15-3-26_No-00

取得した結果

「dvwa」のテーブルフィールド  
gestbookcomments_idcommentname
usersuser_idfirst_namelast_name
userpasswordavatar
last_loginfailed_login

今回の攻撃ではユーザIDと名前とパスワードを抜き取るのでテーブル「users」からpasswordとuser_idを閲覧します。

これで、IDとパスワードを抜き出す事に成功しました。

SnapCrab_NoName_2016-5-13_15-19-54_No-00

SQLインジェクションを使用してパスワードとIDの抜き出しに成功しました。

User nameUser IDUser Password
admin admin15f4dcc3b5aa765d61d8327deb882cf99
Gordon Brown2e99a18c428cb38d5f260853678922e03
Hack Me38d3533d75ae2c3966d7e0d4fcc69216b
Pablo Picasso40d107d09f5bbe40cade3de5c71e9e9b7
Bob smith55f4dcc3b5aa765d61d8327deb882cf99

最後に

SQLインジェクションという方法で実際にWEBアプリケーションに攻撃してみました。

ここまで、脆弱性のあるサーバはあまり無いかもしれませんがSQLインジェクションは今でも現役バリバリのクラッキング行為です。海外ではSQLインジェクションをメインとしたクラッカー集団がたくさんいます。

自分のサーバが攻撃されない為にもSQLインジェクションの仕組みを知ることはいいことだと思うのでぜひ実験してみてください!

もちろん今回行った実験を他のサーバに仕掛けることは違法であり、逮捕される可能性があるので実験以外では行わないでください。

私は今後もセキュリティの勉強に様々なサイバー攻撃を学んでいこうと思っています。

スポンサードリンク