[极客大挑战 2019]BuyFlag 1

知识点

  1. is_numberic()函数漏洞:is_numeric函数对于空字符%00,无论是%00放在前后都可以判断为非数值,而%20空格字符只能放在数值后。
  2. strcmp()函数漏洞:
    在这里插入图片描述
    如果传入的值,不是字符串的话,会报错,同时使得两个字符串直接相等,返回为零。 一般传入数组或者对象。
  3. PHP弱类型比较:404==‘404xxxxx’

WP

这题主要内容在pay.php。首先You must be a student from CUIT。
通过bp抓包,将cookie改成user=1,完成这个点。

还有password的验证:

~~~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>";

这里有两种绕过方法,一种是弱类型比较,输入一个404开头的字符串就可以了,但是不能是纯数字字符串。
第二种方法是利用is_numberic函数的漏洞,让password为404%20或者404%00都可以绕过。
但是这样会提示你是黑客。我想了一会,才发现让post money和password,还有money没有post。
但是我们传入money会报太长。这时候猜测后端的比较函数还有正则表达式相关的函数都有一个传入数组的漏洞。这里尝试这样Post:

password=404%00&money[]=1

成功得到flag。
之后看了一下WP,原来这题money这里用的是strcmp(),这个函数的漏洞就是传入数组会直接返回0。但是0是判断相等的,因此成功绕过。

猜你喜欢

转载自blog.csdn.net/rfrder/article/details/109233346