天天看点

CTF.show: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);
?>
           

看题目是构造一个反序列化逃逸。

因为

str_replace('Firebasky','Firebaskyup',$string);

的存在,传入

Firebasky

后会多两个字符。

CTF.show:web1_此夜圆

因为我们要逃逸的是这串字符

s:8:"password";s:5:"yu22x";}

因为我们只能读入一个

uname

,而原来的

password

默认为1,试着构造

CTF.show:web1_此夜圆

我们这句话里,要覆盖掉原来的password,需要

";s:8:"password";s:5:"yu22x";}

利用这句话,一共有30位,而每个

str_replace

多两位,所以一共需要用15个Firebasky来构造逃逸。因此,构造payload

得到flag

CTF.show:web1_此夜圆