提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
[极客大挑战 2019]BuyFlag 1
点开MEN,点开源码,发现有一个关键代码,但是又因为它说你如果想要买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>";
}
}
-->
尝试bp抓包,试一下,一看cookie下user为0,尝试更改一下为1改了过后可以发现页面发生了改变,you are a Cuiter说明已经绕过上面所猜测的身份验证了
is_numberic函数绕过
1.数组加16进制绕过
num=a[]=4e2
2.
is_numeric(0判断变量是否为数字或数字字符串,不仅检查10进制,16进制是可以。 is
numericl函数对于空字符%00,无论是%00放在前后都可以判断为非数值,而%20空格字符只能放在数值后。所
以,查看函数发现该函数对对于第一个空格字符会跳过空格字符判断,接着后面的判断!j=1250%20 j=1250%00
3.php中当一个其他数据类型和数值类型的数据比较大小时,会先将其他数据类型转换成数值类型,这里输入类似1250a数据也可绕过
num=1250a
故用password=404%20成功绕过,现在继续传入money即可
因为这里说长度太长了,我们尝试用科学计数法来绕过(在之前md5绕过中学过科学计数法绕过)
后面关于长度绕过不同的方法
1.用科学计数法直接绕过
2.利用版本strcmp函数绕过
有关于strcmp函数绕过的讲解
总结:
1.这题比较难想的是前面的学生验证
2.后面的绕过要明白php解析
3.后面长度过长绕过的不同方法学习到了