【セキュリティ】SQLインジェクションとは(備忘録)
1.SQLインジェクションとは
SQLインジェクションとは、第三者がSQLコマンドを悪用してデータベースの情報へ不正にアクセスし、情報を搾取や改ざん・削除する攻撃手法を指します。
2.実際にやってみた
〇検証環境:bWAPP(VirtualBox上に環境構築)
〇使用ブラウザ:FireFox
〇手順1.
「SQL Injection(POST/Search)」を選択します。
〇手順2.
・操作内容
まず、入力フォームに適当な文字列を入力してみます。
ここでは「Man」という文字列を入力してみます。
・実行結果
3件のデータが戻ってきました。
〇手順3.
・操作内容
入力フォームに「'」を入力してみます。
・実行結果
使用しているデータベース(MySQL)が判明しました。
〇手順4.
・操作内容
入力フォームに「Man' or 1=1#」と入力してみます。
・結果
登録されている全データが戻ってきました。
・解説
SELECT Title FROM テーブル名 WHERE Title = 'Man' or 1=1#'
を実行したことになります。
' : 1つ前のシングルクォーテーションと対になり、文字列を終わらせます。
or 1=1 : 1=1は常にTrueの為、WHERE句の条件も常にTrueになります。
# : #以降コメントアウトされます。
〇手順5.
・操作内容
下記のパラメータを入力してみます。
--- INFORMATION_SCHEMA:MySQLサーバーに関する情報が保存されているデータベースです。
' UNION select TABLE_NAME FROM INFORMATION_SCHEMA.TABLES #
・結果
「カラム数が異なる」というエラーメッセージが戻ってきました。
〇手順6.
・操作内容
カラム数が一致するまで、パラメータを入力してみます。
ここでは、下記のパラメータを入力してみます。
/*
数値はカラムを意味します。
UNION句を使用する場合、テーブルのカラム数を一致させる必要があります。
*/
' UNION select 1,2,3,4,5,6,7 FROM INFORMATION_SCHEMA.TABLES #
・結果
エラーメッセージは表示されなくなりました。
ここから、以下のことが判明しました。
・カラム数は7個
・2番目のカラム名:Title
・3番目のカラム名:Release
・4番目のカラム名:Genre
・5番目のカラム名:Character
〇手順7.
・操作内容
以下のパラメータを入力してみます。
--- TABLE_NAMEで、テーブル名を取得することができます。
' UNION select 1,2,TABLE_NAME,4,5,6,7 FROM INFORMATION_SCHEMA.TABLES #
・結果
全てのテーブル名を取得することができました。
(テーブルが多いので、全ては掲載しません。。。)
3.その他
〇参考
・SQLインジェクションとは
・SQL注入: #1 実装における対策
・INFORMATION_SCHEMAとは
・【Oracle】テーブルの情報を取得するSQL文
4.注意
この記事で紹介した内容は、独自に用意した検証用サイトに対して行いました。
企業・団体等のサイトに対し攻撃すると、違法行為として処罰される可能性があります。
Discussion