[PHP] MD5 比較的陷阱

2018, Dec 02    

PHP是一門弱類型語言,在使用”==”進行變量比較的時候,會先進行類型轉換,再進行比較操作。即使比較的是兩個字符串,如果二者滿足”科學計數法”的表達方法,也會先轉換成數字再進行比較。

比如:

var_dump("0e1234" == "0e5678");

其返回結果是true。

在比較md5時,如果目標密碼的md5值恰好是”0e”+數字,將可以出現密碼繞過漏洞。

Wordpress曾出現過一個Cookie偽造漏洞:http://www.freebuf.com/column/155922.html,原因即為哈希比較的時候由於該原因,我們可以通過爆破的方式,來嘗試構造出”0e”+數字這樣的哈希值,最後繞過Cookie檢查,進而登錄後台。

<?php
if (isset($_GET['Username']) && isset($_GET['password'])) {
    $logined = true;
    $Username = $_GET['Username'];
    $password = $_GET['password'];

     if (!ctype_alpha($Username)) {$logined = false;}
     if (!is_numeric($password) ) {$logined = false;}
     if (md5($Username) != md5($password)) {$logined = false;}
     if ($logined){
    echo "successful";
      }else{
           echo "login failed!";
        }
    }

資料來源

https://tricking.io/card/3/content