美文网首页
PHP学习笔记-常见的PHP漏洞

PHP学习笔记-常见的PHP漏洞

作者: 赵客缦胡缨v吴钩霜雪明 | 来源:发表于2021-03-29 12:52 被阅读0次

    PHP是弱类型语言,所以内置的很多函数,在进行转换和比较的时候,会有各种漏洞需要我们重点关注。

    MD5加密漏洞

    比较哈希字符串的时候,php程序把每一个以“0x”开头的哈希值都解释为科学计数法0的多少次方,恒为0。

    所以如果两个不同的密码经过哈希以后,其哈希值都是以“0e”开头的,那么php将会认为他们相同。

    另外md5加密是有几率两个字符串不同,但是加密后的值是相同的情况,这种情况称为哈希碰撞

    <?php
    $str1 = 's878926199a';
    $str2 = 's214587387a';
     
    echo json_encode([
        'md5_str1' => md5($str1),
        'md5_str2' => md5($str2),
        'bool' => md5($str1) == md5($str2)
    ]);
    

    结果如下,两个值加密后竟然相等。

    缺点你懂的,如果一个网站的某个用户密码加密后刚好是0e开头的,这个时候黑客过来破解,很容易就攻入了。

    {
        md5_str1: "0e545993274517709034328855841020",
        md5_str2: "0e848240448830537924465865611904",
        bool: true
    }
    

    is_numeric漏洞

    忽视0x这种十六进制的数,容易引发sql注入操作,暴漏敏感信息

    echo json_encode([
        is_numeric(233333),
        is_numeric('233333'),
        is_numeric(0x233333),
        is_numeric('0x233333'),
        is_numeric('233333abc'),
    ]);
    

    结果如下:

    16进制数0x61646D696EASII码对应的值是admin

    如果我们执行了后面这条命令的话:SELECT * FROM tp_user where username=0x61646D696E,结果不言而喻:

    [
        true,
        true,
        true,
        false,
        false
    ]
    

    in_array漏洞

    in_array中是先将类型转为整形,再进行判断。

    转换的时候,如果将字符串转换为整形,从字符串非整形的地方截止转换,如果无法转换,将会返回0。

    <?php
    var_dump(in_array("2%20and%20%", [0,2,3]));
    
    //结果如下:
    
    bool(true)
    

    switch漏洞

    switch中是先将类型转为整形,再进行判断。

    转换的时候,如果将字符串转换为整形,从字符串非整形的地方截止转换,如果无法转换,将会返回0。

    <?php
    $i ="abc";
    switch ($i) {
        case 0:
        case 1:
        case 2:
            echo "i是比3小的数";
            break;
        case 3:
            echo "i等于3";
    }
    

    结果如下:

    i是比3小的数

    intval强转漏洞

    <?php
    var_dump(intval('2')); //2
    var_dump(intval('3abcd')); //3
    var_dump(intval('abcd')); //0
    

    相关文章

      网友评论

          本文标题:PHP学习笔记-常见的PHP漏洞

          本文链接:https://www.haomeiwen.com/subject/recbhltx.html