[极客大挑战 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中某些函数的用法和漏洞利用