[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