zoukankan      html  css  js  c++  java
  • PHP中MD5函数漏洞

    题目描述

    一个网页,不妨设URL为http://haha.com,打开之后是这样的

    if (isset($_GET['a']) and isset($_GET['b'])) {
        if ($_GET['a'] != $_GET['b']) {
        	if (md5($_GET['a']) === md5($_GET['b'])) {
                echo ('Flag: '.$flag);
            }else {
                echo 'Wrong.';
            }
        }
    }
    

    根据这段代码,可以看出;

    • 使用GET方式提交参数,可以直接在URL里面改,不用写POST请求
    • GET里面必须包含a,b两个参数
    • a!=b,这里的不等是严格的value上的不等,而不是!==引用上的不等
    • a和b的md5必须相等
    • 这段代码是无论如何都要返回的,如果答案错误,先返回wrong,再返回这段代码。

    如果提交http://haha.com?a=3&b=2,返回wrong
    如果提交http://haha.com?a=3&b=3,跟没带参数一样,因为没有进入到那层判断中去
    问,怎么提交才能得到flag

    预备知识

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

        QNKCDZO
        240610708
        s878926199a
        s155964671a
        s214587387a
        s214587387a
         sha1(str)
        sha1('aaroZmOk')  
        sha1('aaK1STfY')
        sha1('aaO8zKZF')
        sha1('aa3OFF9m')
    

    同时MD5不能处理数组,若有以下判断则可用数组绕过

    if(@md5($_GET['a']) == @md5($_GET['b']))
    {
        echo "yes";
    }
    //http://127.0.0.1/1.php?a[]=1&b[]=2
    

    题解

    URL可以传递数组参数,形式是http://haha.com?x[]=1&x[]=2&x[]=3,这样就提交了一个x[]={1,2,3}的数组。
    在PHP中,MD5是不能处理数组的,md5(数组)会返回null,所以md5(a[])null,md5(b[])null,md5(a[])=md5(b[])=null,这样就得到答案了。

    http://butian.secbox.cn/flag.php?a[]=1&b[]=2
    返回结果

    Flag: flag{1bc29b36f623ba82aaf6724fd3b16718}
    if (isset($_GET['a']) and isset($_GET['b'])) {
        if ($_GET['a'] != $_GET['b']) {
        	if (md5($_GET['a']) === md5($_GET['b'])) {
                echo ('Flag: '.$flag);
            }else {
                echo 'Wrong.';
            }
        }
    }
        
    

    我说

    一开始我还以为要找到两个md5相同的字符串,百度一番不曾找到。只找到一个fastcoll.exe文件碰撞器,内容都是二进制的,不是字符串。

    直接搜索PHP、MD5,就发现原来这题跟密码学半毛钱关系没有,只是简简单单的PHP语言漏洞。
    于是余有叹焉,PHP是地球上最垃圾的语言,一方面养活着一大群抱残守缺的程序员,另一方面也养活着一批PHP安全方面的专家。程序员这不是自娱自乐吗?用Java哪来的这么多奇葩问题,强类型的安全性自然而然,一切都是确定的,弱类型带来了太多的可能性。脚本写起来虽然方便,却最好只在本地使用而不要放在易受攻击的地方。

    参考资料

    CSDN网络安全大神:PHP函数漏洞总结

  • 相关阅读:
    AngularJS Insert Update Delete Using PHP MySQL
    Simple task manager application using AngularJS PHP MySQL
    AngularJS MySQL and Bootstrap Shopping List Tutorial
    Starting out with Node.js and AngularJS
    AngularJS CRUD Example with PHP, MySQL and Material Design
    How to install KVM on Fedora 22
    Fake_AP模式下的Easy-Creds浅析
    河南公务员写古文辞职信
    AI
    政协委员:最大愿望是让小学生步行上学
  • 原文地址:https://www.cnblogs.com/weiyinfu/p/6821812.html
Copyright © 2011-2022 走看看