美文网首页CTF经验帖
WEB md5 collision(分值50)

WEB md5 collision(分值50)

作者: Cytosine | 来源:发表于2017-10-22 12:12 被阅读0次

    点此进入南京邮电大学网络攻防训练平台

    md5 collision,md5碰撞

    解题过程

    题目源码:

    <?php
    $md51 = md5('QNKCDZO');
    $a = @$_GET['a'];
    $md52 = @md5($a);
    if(isset($a)){
    if ($a != 'QNKCDZO' && $md51 == $md52) {
        echo "nctf{*****************}";
    } else {
        echo "false!!!";
    }}
    else{echo "please input a";}
    ?>
    

    QNKCDZO的md5值为0e830400451993494058024219903391
    分析题目源码,如果a的值不为QNKCDZO,并且md5值也为0e830400451993494058024219903391,则会输出flag。

    不过好像除了QNKCDZO,并没有其他字符串md5值为0e830400451993494058024219903391

    回头再看源码,注意到判断的时候$md51 == $md52,用的是==而不是===,也就是说md51md52不需要完全相等。

    网上搜索 php == 判断md5
    发现文章:php弱类型中提到如下问题:

    一个数字和一个字符串进行比较,PHP会把字符串转换成数字再进行比较。PHP转换的规则的是:若字符串以数字开头,则取开头数字作为转换结果,若无则输出0。例如:123abc转换后应该是123,而abc则为0,0==0这当然是成立的啦!所以,0 ==’abc’是成立的。当有一个对比参数是整数的时候,会把另外一个参数强制转换为整数。

    上文中给出了一个例子:

    <?php
    $a = md5('240610708'); // = 0e462097431906509019562988736854
    $b = md5('QNKCDZO'); // = 0e830400451993494058024219903391
    var_dump($a == $b);
    ?>
    

    输出

    bool(true)
    

    所以,给a传值240610708,得到网页输出的flag为nctf{md5_collision_is_easy}

    flag

    总结

    1. php使用==比较数字和字符串时,将字符串转换成数字后与数字进行比较。
    2. php字符串转换成数字的规则是:
      • 字符串以数字开头:取前面的数字
      • 字符串不以数字开头:0
    3. 如果==两侧的字符串都是以0e开头,并且后面还是数字,就会被解释成科学计数法,也就是0的多少多少次幂,也就是后面的数字无论是多少,最后结果都为0.
    4. 上一点也是这道题的另一种思路。找到另一个字符串,这个字符串的md5值也以0e开头。参考:md5值以0e开头的字符串
      第二种思路的flag

    相关文章

      网友评论

        本文标题:WEB md5 collision(分值50)

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