[极客大挑战 2019]BuyFlag

0x01

进入页面如下

结合题目buyflag的提示,我们点击payflag看看

查看一下源码

发现端倪

0x02

if (isset($_POST['password'])) {
	$password = $_POST['password'];
	if (is_numeric($password)) {
		echo "password can't be number</br>";
	}elseif ($password == 404) {
		echo "Password Right!</br>";
	}
}

这里跟以前做过的一个“矛盾”的ctf题目很相似,首先它判断你是不是数字,如果是,就错误,如果不是数字再判断你是不是等于404,如果等于404,则密码正确。很显然,这里的考点就是is_numeric这个函数,那么我们来看看这个函数有什么特别

PHP is_numeric() 函数

is_numeric() 函数用于检测变量是否为数字或数字字符串。

语法:

bool is_numeric ( mixed $var )

$var:要检测的变量。

返回值:

  如果指定的变量是数字和数字字符串则返回 TRUE,否则返回 FALSE。

is_numeric函数对于空字符%00,无论是%00放在前后都可以判断为非数值,而%20空格字符只能放在数值后。所以,查看函数发现该函数对对于第一个空格字符会跳过空格字符判断,接着后面的判断!

那知道这个就好说了,我们直接404%20,就可以同时过第一个判断和第二个判断,下面尝试

0x03

但我们把密码改了之后,发现提示我们数字长度太大,但是要让我们买flag还必须有这么多的钱,那我们就需要对money这个参数动点脑筋了,有什么办法让它不需要输入那么多数字,还能满足它对money的判断

PHP strcmp() 函数

要求的是传入两个字符串,那如果我们传入一个非字符串会出现什么结果呢?当我们传入一个非字符串的时候,函数会报错,但同时会返回结果0,也就是说虽然报错,但返回的结果0意味着相等,那么如何可以传入一个非字符串呢?用数组。

所以这里我们将money这个变量改成数字形式

再这里同样还有一个点需要注意,平时的时候我们的cookie一般是PHPSESSID,但是这里却不是,这里的user,本来这里的值是user=0,那么我们将其改为1,其可能是判断用户的一个方式

下面是返回结果

拿到flag

总结

主要是考察php中某些函数的用法和漏洞利用

原文地址:https://www.cnblogs.com/Jleixin/p/13297548.html