极客大挑战 2019BuyFlag

打开题目


显示需要折磨多钱才可以购买。下面还有两个条件,一个是需要student身份,另一个是需要正确密码。

页面也没有密码输入框啊····
查看网页源代码,发现有密码验证。

抓包查看。

这有一个coockie默认值user=0改为user=1试试。
在这里user的值是一种判别方式。

发现修改之后,就是学生身份,差一个密码,应该是在下面加上password。

让我们post过去一个money和一个password,password要等于404,并且password不能为数字,那好办我们可以用弱类型,使用字母绕过is_num,即让password=404a。

直接输入钱数会显示过长。

说数字太长了,那我们我们就可以用科学计数法:
采用科学计数法1e10,表示1乘以10的十次方。

当然也可以这样,既然说了长度太长,合理猜测一下用的是strcmp比较长度,那么直接money[]=1就可以了。
password=404%00直接截断,money定义为数组形式money[]=1

GET flag

flag{4c7ea2c3-bd25-427b-86dc-8a87af7ac62d}

附录:

1
2
3
4
5
6
7
8
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>";
}
}

首先它判断你是不是数字,如果是,就错误,如果不是数字再判断你是不是等于404,如果等于404,则密码正确。很显然,这里的考点就是is_numeric这个函数,那么我们来看看这个函数有什么特别。

PHP is_numeric() 函数

is_numeric() 函数用于检测变量是否为数字或数字字符串。
语法:
bool is_numeric ( mixed $var )
$var:要检测的变量。

返回值:
  如果指定的变量是数字和数字字符串则返回 TRUE,否则返回 FALSE。
is_numeric函数对于空字符%00,无论是%00放在前后都可以判断为非数值,而%20空格字符只能放在数值后。所以,查看函数发现该函数对对于第一个空格字符会跳过空格字符判断,接着后面的判断!
那知道这个就好说了,我们直接404%20,就可以同时过第一个判断和第二个判断。

PHP strcmp() 函数


要求的是传入两个字符串,那如果我们传入一个非字符串会出现什么结果呢?当我们传入一个非字符串的时候,函数会报错,但同时会返回结果0,也就是说虽然报错,但返回的结果0意味着相等,那么如何可以传入一个非字符串呢?用数组。
传入数组(非法字符),得到结果为0,与相等时结果一样,从而判定为钱数一样多。


本文作者: Alone
本文链接: https://blog.nosecurity.cn/posts/24484.html
版权声明: 本博客所有文章除特别声明外,均为原创,采用 CC BY-SA 4.0 协议 ,转载请注明出处!