极客大挑战2019-BuyFlag

 · 2020-7-7  ·次阅读


地址:buuctf

1

随便翻一翻,右边menu菜单有个PayFlag指向pay.php

2

这里说我们只能用多少钱买flag并且必须是哪里的学生,并且要回答正确的密码

查看源代码发现提示

<!--
    ~~~post money and password~~~
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>";
    }
}
-->

这里的意思是我们需要用post方式提交password,然后password不能是数字,当password等于404的时候返回Password Right!

emm既需要满足password不是数字,又要满足password等于404

这里的password类型判断用的is_numeric()

在PHP手册中了解到

bool is_numeric( mixed $var)

如果 var 是数字和数字字符串则返回 TRUE,否则返回 FALSE。 

那么如果我们赋值中不仅仅是数字或数字字符串,就是false

这里我们让password=404%

在控制台中还能看到一项cookie:user=0

修改为user=1

3

已经提示我们
you are Cuiter
Password Right!
Pay for the flag!!!hacker!!!

但是Pay for the flag一直没找到在哪里,那就也直接传一个money吧

但是在这个题中PHP版本是5.3.5,输入字符不能超过八位,否则会提示我们Nember lenth is too long

关于这个我们可以了解一下strcmp()函数

4

这个函数在PHP5.3版本之前有个漏洞,当我们传入非字符串类型的数据的时候,这个函数将发生错误,在PHP5.3版本之前显示了报错的警告信息后会return 0,也就是虽然报了错,但却判定其相等。

所以我们传money[]=admin

5