决斗场 - 实验吧 WEB Once More

题目链接:http://www.shiyanbar.com/ctf/1805


hint相当良心的一题,hint上直接说明了本体非常重要的两点:

1.ereg函数有漏洞 ---00截断

2.科学计数法

点开题目,观察这段代码:

<?php
if (isset ($_GET['password'])) {
	if (ereg ("^[a-zA-Z0-9]+$", $_GET['password']) === FALSE)
	{
		echo '<p>You password must be alphanumeric</p>';
	}
	else if (strlen($_GET['password']) < 8 && $_GET['password'] > 9999999)
	{
		if (strpos ($_GET['password'], '*-*') !== FALSE)
		{
			die('Flag: ' . $flag);
		}
		else
		{
			echo('<p>*-* have not been found</p>');
		}
	}
	else
	{
		echo '<p>Invalid password</p>';
	}
}
?>

要达到Flag要经历四个判断条件:

1.isset($_GET['password']),这个判断条件也就是说在get请求中存在password这个变量。

2.ereg("^[a-zA-Z0-9]+$", $_GET['password']) === FALSE,首先说下ereg这个函数,ereg()函数用指定的模式搜索一个字符串中指定的字符串,如果匹配成功返回true,否则,则返回false。搜索字母的字符是大小写敏感的。可选的输入参数规则包含一个数组的所有匹配表达式,他们被正则表达式的括号分组。这里的条件为password只能包含数字和大小写字母。

3.strlen($_GET['password']) < 8 && $_GET['password'] > 9999999,在这个判断条件中,意思是说password的字符长度不能超过8,且值要大于9999999(7个9)。

4.strpos($_GET['password'], '*-*') !== FALSE,strpos()函数的作用是查找字符串在另一字符串中第一次出现的位置,也就是说这个判断条件要求在password中必须存在"*-*"这个字符串。

扫描二维码关注公众号,回复: 299359 查看本文章

好,接下来我们来分析如何达到这些条件。首先是第一个条件,随便在对话框中输入一个值,提交会发现,提交的内容会将其作为password的值以get请求的形式传入。当然毕竟是get请求,我们也可以直接在URL中进行传值。我们先跳过第二个条件,第三个条件要如何达成呢,长度不大于8且值大于9999999,hint中给了我们提示,我们如果用科学计数法就能轻松的达到这个条件。再来就是最后一个条件,字符串中必须得有"*-*",乍一看这个条件是很容易达到的,但是我们这里再结合第二条条件,第二个条件要求我们只能包含数字和大小写字母,明显这个条件是达不到的,那么这里我们也需要借助hint中提到的ereg函数的漏洞,00截断。ereg函数在遇到%00会被截断,之后的就不会再判断,也就是说如果我们将"*-*"写在%00后面即可两个条件都达到。

那么终上分析,我们可将字符串的值设定为:1e8%00*-*,%00算为一个字符,刚刚好7个字符。提交,但结果却显示我们没有达到第二个条件,这是为什么呢?这个时候观察URL,发现传过去的值不是我们想的,而是1e8%2500*-*,原来我们再传值的时候,%会被URL编码为%25,也就是说传过去的值在ereg判断时并没有被%00截断,解决方案就是我们直接进行URL传值,在URL后加上?password=1e8%00*-*,即可得到Flag

猜你喜欢

转载自blog.csdn.net/raalghul/article/details/79529575