MD5繞過的技巧


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碰撞

$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()函數


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM