buuctf [极客大挑战 2019]BuyFlag
打开网页,看到可以购买flag,条件是:
1,must be a student from CUIT
2,Flag need your 100000000 money
源码提示:
<!--
~~~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:money and password
is_numeric()
函数
检测字符串是否只由数字组成,如果字符串中只包括数字,就返回Ture,否则返回False。举几个例子: 123 ,12.3 ,+123这些都能返回true,但是如果字符串中含有别的符号或者字母则返回false。
PHP弱类型
PHP中有== 和 ===两种比较方法,前者比较之前会把等号两边的数据类型转换成相同的,后者在比较之前要先判断数据类型是否相同,我们称前者为PHP的弱类型,因为很容易发生“意外情况”。
var_dump("a"==0); //true;
var_dump("1a"==1); //true;
var_dump("a1"==1) //false;
var_dump("a1"==0) //true;
还有个特殊点的:
var_dump("0e123456"=="0e4456789"); //true
因为科学计数法0的任意次方都等于0,所以这种类型也相等。
所以
post:money=100000000&password=404+
参数money的Nember lenth is too long
科学计数法绕过
money=1e7
大意了钱少了,那就奢侈一把
money=1e20 (1e20=100,000,000,000,000,000,000)