php-MD5()函數漏洞

一、數字與字符串之間的比較

var_dump( 0 == "a" ); true
var_dump( "0" == "a" );false

php把字母開頭的字符串轉化爲整型時,轉化爲0, 前面數字後面字母的話就只取到第一個字母出現的位置之前的數字。
二、MD5函數漏洞

$_GET['name'] != $_GET['password']
MD5($_GET['name']) == MD5($_GET['password'])

要求滿足上述條件則
那麼要求name和password數值不同但是MD5相同,在這裏可以利用繞過。
PHP在處理哈希字符串時,它把每一個以“0E”開頭的哈希值都解釋爲0,所以如果兩個不同的密碼經過哈希以後,其哈希值都是以“0E”開頭的,那麼PHP將會認爲他們相同,都是0。
GET傳入a=QNKCDZO&b=240610708就能繞過了
(MD5加密後和sha1加密後0E開頭的字符串百度有很多)
三、弱口令

if($_POST['param1']!==$_POST['param2'] && md5($_POST['param1'])===md5($_POST['param2'])){
        die("success!");
    }

在php中=爲完全等於運算,不僅比較值,而且還比較值的類型,只有兩者一致才爲真。再次使用a=QNKCDZO&b=240610708就不行了,因爲a和b類型不同
而在PHP中
md5([1,2,3]) == md5([4,5,6]) == NULL
[1] !
[2] && md5([1]) === md5([2])
所以GET傳入a[]=1&b[]=2就能夠繞過了
四、MD5碰撞

if((string)$_POST['param1']!==(string)$_POST['param2'] && md5($_POST['param1'])===md5($_POST['param2'])){
        die("success!);
}

要求構造param1和param2不同,但是MD5相同,也就是說要求傳入兩個MD5相同的不同字符串。

Param1=%4d%c9%68%ff%0e%e3%5c%20%95%72%d4%77%7b%72%15%87%d3%6f%a7%b2%1b%dc%56%b7%4a%3d%c0%78%3e%7b%95%18%af%bf%a2%00%a8%28%4b%f3%6e%8e%4b%55%b3%5f%42%75%93%d8%49%67%6d%a0%d1%55%5d%83%60%fb%5f%07%fe%a2
Param2=%4d%c9%68%ff%0e%e3%5c%20%95%72%d4%77%7b%72%15%87%d3%6f%a7%b2%1b%dc%56%b7%4a%3d%c0%78%3e%7b%95%18%af%bf%a2%02%a8%28%4b%f3%6e%8e%4b%55%b3%5f%42%75%93%d8%49%67%6d%a0%d1%d5%5d%83%60%fb%5f%07%fe%a2

MD5值相同使用谷歌可以搜到相當多被巧妙構造出的二進制文件,其MD5相同,注意一點,post時一定要urlencode!!!
使用fastcoll_v1.0.0.5工具可以生成兩個具有相同MD5的文件,但是文件卻是不同的。
參考鏈接:
https://blog.csdn.net/wy_97/article/details/79088218
https://blog.csdn.net/qq_19980431/article/details/83018232

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章