SQLインジェクションのテスト手法と実践的な脆弱性診断方法

SQLインジェクションの脆弱性を発見・検証するためのテスト手法について、実践的なコード例を交えながら解説します。あなたのWebアプリケーションは本当に安全ですか?

SQLインジェクションのテスト手法

SQLインジェクションテストの重要ポイント
🔍
脆弱性の影響度

データベース全体への不正アクセスやシステム管理者権限の奪取が可能

⚠️
テストの必要性

入力値の検証やプリペアドステートメントの実装状況を確認

🛡️
対策の重要性

適切な対策により、データベースの安全性を確保

SQLインジェクションの基本的な検証手順

SQLインジェクションの脆弱性を検証するための基本的な手順について説明します。まずは、以下のような単純なログインフォームを例に考えてみましょう。

 


$user_id = $_POST['user_id']
$password = $_POST['password']
$sql = "SELECT * FROM users WHERE user_id='$user_id' AND password='$password'"

 

このコードには明らかな脆弱性が存在します。テストには以下の入力値を使用します:

  • シングルクォートの入力:
    '
  • 論理演算子を含む入力:
    ' OR '1'='1
  • コメントアウト:
    '--

SQLインジェクションテストの実践的な手法

より高度なテスト手法として、以下のような方法があります:

  1. エラーメッセージベースのテスト
    
    ' UNION SELECT null,null,null--
    
  2. ブラインドSQLインジェクションテスト
    
    ' AND (SELECT CASE WHEN (1=1) THEN 1 ELSE 1/0 END)=1--
    
  3. 時間ベースのテスト
    
    ' AND (SELECT CASE WHEN (1=1) THEN pg_sleep(5) ELSE pg_sleep(0) END)--
    

SQLインジェクション対策の実装テスト

対策の実装状況を確認するためのテストコードを示します:

 


$stmt = $pdo->prepare("SELECT * FROM users WHERE user_id = :user_id AND password = :password")
$stmt->bindParam(':user_id', $user_id, PDO::PARAM_STR)
$stmt->bindParam(':password', $password, PDO::PARAM_STR)
$stmt->execute()

 

テスト項目チェックリスト:

  • プリペアドステートメントの使用
  • パラメータのバインド処理
  • エスケープ処理の実装
  • エラーメッセージの適切な制御

自動化ツールを使用したSQLインジェクションテスト

効率的なテストのために、以下のような自動化ツールの活用が有効です:

ツール名 主な機能 特徴
sqlmap 自動検出・攻撃 高機能で詳細な診断が可能
OWASP ZAP 脆弱性スキャン 使いやすいGUIインターフェース
Burp Suite プロキシ解析 高度な手動テストが可能

SQLインジェクションテストの結果分析と報告

テスト結果の分析と報告には以下の項目を含めます:

  1. 発見された脆弱性の詳細
  2. 影響度の評価
  3. 再現手順の文書化
  4. 修正提案の具体例

 


-- 脆弱性のある実装例
SELECT * FROM users WHERE id = '$user_input'
-- 安全な実装例
SELECT * FROM users WHERE id = ?

 

テスト結果のドキュメント化には、以下の情報を含めることが重要です:

  • テスト日時と環境
  • 使用したツールとバージョン
  • 発見された脆弱性の詳細
  • 推奨される対策方法
  • 修正後の検証結果