🍇

【セキュリティ】SQLインジェクションとは(備忘録)

2023/02/19に公開

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 : Titleの内容に関係なく、検索条件を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