相关过程:
上面说只有成信大的学生才可以购买这个flag,老样子,还是先查看一下源代码
在末尾处发现了被注释掉的PHP代码,这段这段代码的主要实现的功能如下:传参名为password,传参方式为post,password不能传入数字或数字字符串,当password为404时则密码正确,此时结合前面的信息可能才能pay money来获得flag,那么这里password里其实就是一个php弱相等。
这里想到前面的只有成信大的学生才可以购买flag,所以应该是要我们先获得一个学生的身份,那么这最有可能获得学生身份的可能就是通过更改cookie来越权。
可以看到在此网站的cookie里确实有一个user字段,接下来就是尝试修改它的值。
这里没有提示传参名和传参方式,但结合前面的来看,应该传参名是money传参方式是post,然后需要支付的金额为100000000(一亿)
结合回显来看,后端应该是使用了字符串比较的函数,而比较字符串大小的函数最可能的就是strcmp(),当然这里我也是后面看了别人的WP才学到的。总之,现在就有两种处理方式:
- 利用PHP5.3版本以前的strcmp()函数漏洞
- 科学计数法
方法一:
方法二:
相关知识点:
1.strcmp()函数缺陷
-影响版本:
- PHP < 5.3
-漏洞表现:
- strcmp()期望接收的两个参数的数据类型都是字符串类型,当接受到了其它数据类型的数据时就会报错并返回0使判断成立
-漏洞利用示例:
- 当通过POST或GET进行传参时,PHP为了可以上传数组,会将变量名末尾以[]结尾的变量,例如abc[]=xxx,当作成一个以abc为名称的数组。所以对于 $_POST['password'] 当我提交的是 password[]=aaa 时,PHP就会接收到一个以password为名字,其中包含一个值aaa的数组。从而引发 PHP5.3 以前的 strcmp() 函数报错并返回0。
-PHP允许上传数组验证示例:
//服务端代码
$a = $_GET['cmd'];
var_dump($a);
2.科学计数法:
对于1000,科学计数法可以写成1x10^3,可以用e来代替10,即写成1e3