先看一下源码
<?php
error_reporting(0);
class a
{
public $uname;
public $password;
public function __construct($uname,$password)
{
$this->uname=$uname;
$this->password=$password;
}
public function __wakeup()
{
if($this->password==='yu22x')
{
include('flag.php');
echo $flag;
}
else
{
echo 'wrong password';
}
}
}
function filter($string){
return str_replace('Firebasky','Firebaskyup',$string);
}
$uname=$_GET[1];
$password=1;
$ser=filter(serialize(new a($uname,$password)));
$test=unserialize($ser);
?>
看题目是构造一个反序列化逃逸。
因为
str_replace('Firebasky','Firebaskyup',$string);
的存在,传入
Firebasky
后会多两个字符。
因为我们要逃逸的是这串字符
s:8:"password";s:5:"yu22x";}
因为我们只能读入一个
uname
,而原来的
password
默认为1,试着构造
我们这句话里,要覆盖掉原来的password,需要
";s:8:"password";s:5:"yu22x";}
利用这句话,一共有30位,而每个
str_replace
多两位,所以一共需要用15个Firebasky来构造逃逸。因此,构造payload
得到flag