PHP_Code_Challenge-18-值不同MD5相同

题目

代码来自:23128/challenge18.php~

<?php
header("Content-type: text/html; charset=utf-8"); 
    if(isset($_POST['login']))
     {
        if(isset($_POST['user']))
        {
            if(@strcmp($_POST['user'],$USER))//USER是被隐藏的复杂用户名[原题已有注释]
            {
                die('user错误!');
            }
        }
        if (isset($_POST['name']) && isset($_POST['password']))
        {
            if ($_POST['name'] == $_POST['password'] )
            {
                die('账号密码不能一致!');
            }
            if (md5($_POST['name']) === md5($_POST['password']))
            {
                if(is_numeric($_POST['id'])&&$_POST['id']!=='72' && !preg_match('/s/', $_POST['id']))
                {
                        if($_POST['id']==72)
                            die("flag{xxxxxxxxxxxxx}");
                        else
                            die("ID错误2!");
                }
                else
                {
                    die("ID错误1!");
                }
            }
            else
                die('账号密码错误!');
        }
     }
 ?>

分析

  1. 不提交user

  2. 需要==比较不等并且md5后全等的两个变量

  3. 弱比较绕过

is_numeric($_POST['id'])+$_POST['id']!=='72'+$_POST['id']==72=>id=72.

知识点

MD5不能处理数组,处理任意数组返回值都相同


0E开头的两个md5值=====

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

72.是数字字符串

检测变量是否为数字或数字字符串
is_numeric ( mixed $var ) : bool
如果 var 是数字和数字字符串则返回 TRUE,否则返回 FALSE。


解法

name[]=1&password[]=2&id=72.&login=Check

原文地址:https://www.cnblogs.com/Rain99-/p/12737244.html