1、md5绕过(Hash绕过)
    PHP在处理哈希字符串时,会利用“!=”或“==”来对哈希值进行比较,它把每一个以“0E”开头的哈希值都解释为0,所以如果两个不同的密码经过哈希以后,其哈希值都是以“0E”开头的,那么PHP将会认为他们相同,都是0

    1. <?php
    2. if($_GET['username'] == 'admin' && md5($_GET['password']) == '0e456789' ){
    3. echo '正确';
    4. }

    image.png

    2、in_array函数缺陷
    in_array(search,array,type)**:**函数搜索数组中是否存在指定的值,存在返回True,否则返回False

    search 必需。规定要在数组搜索的值。
    array 必需。规定要搜索的数组。
    type 可选。如果设置该参数为 true,则检查搜索的数据与数组的值的类型是否相同
    # in_array 第三个参数默认是False
    
    <?php 
    $id = $_GET['id'];
    if(in_array($id,array(1,2,3))){
        echo "id值:$id <br/>";
    
        $sql = "select * from test where id= $id";
        echo $sql;
    }else{
        echo "不存在注入";
    }
    

    image.png

    3、array_search函数缺陷
    array_search(**value,array,strict**): 函数在数组中搜索某个键值,并返回对应的键名,否则返回False

    value 必需。规定需要搜素的键值。
    array 必需。规定被搜索的数组。
    strict 可选。如果该参数被设置为 TRUE,则函数在数组中搜索数据类型和值都一致的元素。可能的值:
    - true
    - false - 默认

    如果设置为 true,则在数组中检查给定值的类型 |

    # in_array 第三个参数默认是False
    
    <?php 
    $array = array(1,2,3);
    $a = "1a";
    $b = "2a";
    $c = "c";
    
    var_dump(array_search($a,$array));  // 返回int(0)
    var_dump(array_search($b,$array));    // 返回int(1)
    var_dump(array_search($c,$array));    // 返回bool(false)
    

    4、操作符比较
    “==” 在进行比较的时候,会先将字符串类型转化成相同,再比较
    “===” 在进行比较的时候,会先判断两种字符串的类型是否相等,再比较

    <?php 
    var_dump("name" == 0);        // true
    var_dump("1name" == 1);     // true
    var_dump("name1" == 1);        // false
    var_dump("name1" == 0);        // true
    var_dump("0e123456" == "0e4456789");    // true
    

    5、Switch绕过

    <?php 
    $i = "1aaa";
    switch($i){
        case 0:
        case 1:
            echo "正确";
        break;
    }
    

    image.png

    6、St**rcmp函数缺陷
    strcmp ( string $str1 , string $str2 ):**如果str1小于str2 返回 < 0;如果 str1大于str2返回 > 0;如果两者相等,其他返回 0

    <?php 
    $password = $_GET['password'];
    $pass = "123456";
    
    if(isset($password)){
        if(!strcmp($password,$pass)){
            echo "密码正确";
        }else{
            echo "密码错误";
        }
    }else{
        echo "请输入密码";
    }
    

    传入数组作比较返回null(某种意义相当于0)
    image.png

    strcmp与PHP版本有关
    PHP5.2.1版本中使用strcmp比较数组和字符串时候会返回 int(1)
    PHP5.3版本中使用strcmp比较数组和字符串时候会返回 null
    **