[极客大挑战 2019]BuyFlag

[极客大挑战 2019]BuyFlag

这题是要求buy flag,同时在首页面也显示要是student,而且要输入correct password

F12查看源代码

1
2
3
4
5
6
7
8
9
10
11
12
<!--
~~~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>";
}
}
-->
意思是psot上传参数money和password参数,同时password要是404,还不能为数字

is_numeric()函数:

1
2
3
4
5
所以可以利用弱类型,即让password=404a,
或者404%0a
is_numeric() 判断变量是否为数字或数字字符串,不仅检查10进制,16进制也可以。
is_numeric函数对于空字符%00,无论是%00放在前后都可以判断为非数值,而%20空格字符只能放在数值后。所以,查看函数发现该函数对于第一个空格字符会跳过空格字符判断,接着后面的判断!
该函数还可能造成sql注入,例如将‘1 or 1’转换为16进制形式,再传参,就可以造成sql注入

利用burp抓包

向下翻看,可以注意到一条明显的语句

这时就能联想到对user有一定的要求,可以看到cookie中user为0,改成1后看到变化

这题有点问题,按理说应该post上传参数,但是可以看出从抓包一开始的就是get方式,不知道是怎么回事,所以只能网上盗图了

上传password参数:

上传money参数:

显示长度太长了,

方法一:

strcmp()绕过,直接money[]=1就可以了

strcmp()绕过原理:

1
2
3
4
5
int strcmp ( string $str1 , string $str2 )
参数 str1第一个字符串。str2第二个字符串。如果str1 小于 str2 返回 < 0; 如果 str1 大于 str2 返回 > 0;如果两者相等,返回 0。

可知,传入的期望类型是字符串类型的数据,但是如果我们传入非字符串类型的数据的时候,这个函数将会有怎么样的行为呢?实际上,当这个函数接受到了不符合的类型,这个函数将发生错误,但是在5.3之前的php中,显示了报错的警告信息后,将return 0 。
也就是虽然报了错,但却判定其相等

方法二:

利用科学计数法:money=1e10