PHP弱类型记录

175 阅读2分钟

本文已参与 「新人创作礼」 活动,一起开启掘金创作之路。

记录

PHP弱类型 md5为0e开头的字符串

QNKCDZO
0e830400451993494058024219903391

s878926199a
0e545993274517709034328855841020
  
s155964671a
0e342768416822451524974117254469
  
s214587387a
0e848240448830537924465865611904
  
s214587387a
0e848240448830537924465865611904
  
s878926199a
0e545993274517709034328855841020
  
s1091221200a
0e940624217856561557816327384675
  
s1885207154a
0e509367213418206700842008763514

strcmp漏洞绕过 php -v <5.3

<?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必需相等,strcmp传入的期望类型是字符串类型,如果传入的是个数组会怎么样呢 我们传入 password[]=xxx 可以绕过 是因为函数接受到了不符合的类型,将发生错误,但是还是判断其相等 payload: password[]=xxx

json绕过

<?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函数解密成一个数组,判断数组中key的值是否等于 key的值,但是key的值,但是key的值我们不知道,但是可以利用0=="admin"这种形式绕过

最终payload message={"key":0}

array_search is_array绕过

<?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可以绕过

下面是官方手册对array_search的介绍

mixed array_search ( mixed needle,arrayneedle , array haystack [, bool strict=false])strict = false ] ) needle,haystack必需,haystack必需,strict可选 函数判断haystack中的值是存在haystack中的值是存在needle,存在则返回该值的键值 第三个参数默认为false,如果设置为true则会进行严格过滤

 <?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=="admin" 当然是a=0 当然如果第三个参数为true则就不能绕过