json绕过
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| <?php if (isset($_POST['message'])) { $message = json_decode($_POST['message']); $key ="*********"; if ($message->key == $key) { echo "flag"; } else { echo "fail"; } } else{ echo "~~~~"; } ?>
|
输入一个json类型的字符串,json_decode函数会json解码成一个数组,判断数组中key的值是否等于$key的值,但是这里我们并不知道$key的值,可以利用”admin”==0这种形式绕过
最终payload:
message={“key”:0}
array_search绕过
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| <?php if(!is_array($_GET['test'])){exit();} $test=$_GET['test']; for($i=0;$i<count($test);$i++){ if($test[$i]==="admin"){ echo "error"; exit(); } $test[$i]=intval($test[$i]); } if(array_search("admin",$test)===0){ echo "flag"; } else{ echo "false"; } ?>
|
先判断是不是数组,然后遍历每一个值,查询每个值是否等于admin,再把每个值转换为int类型,最后判断传入的数组是否有admin,有就返回flag
payload:
test[]=0可以绕过
官方手册:
1
| mixed array_search ( mixed $needle , array $haystack [, bool $strict = false ] )
|
$needle,$haystack必需,$strict可选 函数判断$haystack中的值是存在$needle,存在则返回该值的键值 第三个参数默认为false,如果设置为true则会进行严格过滤
1 2 3 4 5
| <?php $a=array(0,1); var_dump(array_search("admin",$a)); // int(0) => 返回键值0 var_dump(array_seach("1admin",$a)); // int(1) ==>返回键值1 ?>
|
array_search函数 类似于== 也就是$a==”admin” 当然是$a=0 当然如果第三个参数为true则就不能绕过
strcmp漏洞绕过 php -v <5.3
1 2 3 4 5 6 7 8 9 10 11
| <?php $password="***************" if(isset($_POST['password'])){
if (strcmp($_POST['password'], $password) == 0) { echo "Right!!!login success";n exit(); } else { echo "Wrong password.."; } ?>
|
strcmp是比较两个字符串,如果str1<str2 则返回<0 如果str1大于str2返回>0 如果两者相等 返回0
我们是不知道$password的值的,题目要求strcmp判断的接受的值和$password必需相等,strcmp传入的期望类型是字符串类型,如果传入的是个数组会怎么样呢
我们传入 password[]=xxx 可以绕过 是因为函数接受到了不符合的类型,将发生错误,但是还是判断其相等
payload: password[]=xxx
switch绕过
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| <?php $a="4admin"; switch ($a) { case 1: echo "fail1"; break; case 2: echo "fail2"; break; case 3: echo "fail3"; break; case 4: echo "sucess"; //结果输出success; break; default: echo "failall"; break; } ?>
|