MD5函數漏洞
$str1 = $_GET['str1'];
$str2 = $_GET['str2'];
if (md5($str1) == md5($str2)){
die('OK'); }
-
php弱類型比較產生的漏洞
- 想要滿足這個判斷只需要構造出MD5值為0e開頭的字符串,這樣的話弱類型比較會認為是科學技術法,0的多少次方都是0,因此可以繞過
-
有一些字符串的MD5值為0e開頭,這里記錄一下
- QNKCDZO
- 240610708
- s878926199a
- s155964671a
- s214587387a
-
還有MD5和雙MD5以后的值都是0e開頭的
- CbDLytmyGm2xQyaLNhWn
- 770hQgrBOjrcqftrlaZk
- 7r4lGXCH2Ksu2JNT3BYM
PHP特性
$str1 = $_GET['str1'];
$str2 = $_GET['str2'];
if (md5($str1) === md5($str2)) {
die('OK');
}
- 因為是強類型比較,用0e開頭的字符串是沒辦法繞過的了,但是PHP自身的特性使得可以提交一個數組,而md5函數傳入數組的返回值都是NULL,這樣就可以繞過強類型比較了。所以這里用GET傳入?str1[]=1&str2[]=2就行了
- 補充:md5()或者sha1()之類的函數計算的是一個字符串的哈希值,對於數組則返回false,如果
$str1
和$str2
都是數組則雙雙返回FALSE, 兩個FALSE相等得以繞過
- 補充:md5()或者sha1()之類的函數計算的是一個字符串的哈希值,對於數組則返回false,如果
MD5碰撞
$str1 = (string)$_GET['str1'];
$str2 = (string)$_GET['str2'];
if (md5($str1) === md5($str2)) {
die('OK');
}
- 由於強制類型轉換,傳數組就不可行了,這里就需要MD5碰撞,對於需要兩個內容不同但是MD5值相同的文件,使用Fastcoll就可以了
繞過md5()來構造攻擊語句
select * from 'admin' where password=md5($pass,true)
- ffifdyop
- 這個點的原理是 ffifdyop 這個字符串被 md5 哈希了之后會變成 276f722736c95d99e921722cf9ed621c,這個字符串前幾位剛好是 ‘ or ‘6,
而 Mysql 剛好又會吧 hex 轉成 ascii 解釋,因此拼接之后的形式是select * from 'admin' where password='' or '6xxxxx'。等價於 or 一個永真式,因此相當於萬能密碼,可以繞過md5()函數
- 這個點的原理是 ffifdyop 這個字符串被 md5 哈希了之后會變成 276f722736c95d99e921722cf9ed621c,這個字符串前幾位剛好是 ‘ or ‘6,