知识点
php内置函数的参数的松散性:
- is_numeric()函数漏洞
- strcmp()函数漏洞
strcmp()漏洞绕过 php -v < 5.3
```php <?php $password=”*“ if(isset($_POST[‘password’])){
if (strcmp($_POST[‘password’], $password) == 0) { echo “Right!!!login success”;n exit(); } else { echo “Wrong password..”; } ?>
> 说明:int strcmp ( string $str1 , string $str2 )
strcmp是比较两个字符串,如果str1< str2 则返回< 0,如果str1大于str2返回>0, 如果两者相等返回0。strcmp函数比较字符串的本质是将两个变量转换为ascii,然后进行减法运算,然后根据运算结果来决定返回值。<br />我们是不知道$password的值的,题目要求strcmp判断的接受的值和$password必需相等,strcmp传入的期望类型是字符串类型,如果传入的是个数组会怎么样呢?
```php
$array=[1,2,3];
var_dump(strcmp($array,'123')); //null,在某种意义上null也就是相当于false。
所以我们传入 password[]=xxx 可以绕过,是因为函数接受到了不符合的类型,将发生错误,但是还是判断其相等。
payload: password[]=xxx(eg:password[]=admin)
启动靶机
进去之后是这样的:
点击右上角MENU,进入pay.php页面:
说是flag要100000000这些钱。
除此之外再无线索,查看源码,发现:
让我们post过去一个money和一个password,password要等于404,并且password不能为数字,那好办我们可以用弱类型,即让password=404a。
我在firefox的hackbar上post之后没有任何回显,只能抓包:
发现有个cookie值,且等于0,CTF直觉这肯定要改成1的 因为正常情况下这里是cookie的值
得到回显:“Nember lenth is too long”:
说数字太长了,那我们我们就可以用科学计数法:
得到flag:
当然也可以这样,既然说了长度太长,合理猜测一下用的是strcmp,那么直接money[]=1就可以了。