zoukankan      html  css  js  c++  java
  • PHP md5 相等绕过

    1 "oe" 绕过

    1.1 原理

    根据这篇文章[1]

    因为处理hash字符串时,PHP会将每一个以 0E开头的哈希值解释为0,那么只要传入的不同字符串经过哈希以后是以 0E开头的,那么PHP会认为它们相同

    基本的原理是这样的,但更严谨的字符串格式是,0e 开头,同时后面都是数字,不能包含其他字符的字符串,md5 值才会相等(== 的结果为 True,但 === 的结果为 False)。

    <?php
    $a = "s878926199a";
    $b = "s155964671a";
    
    print_r($a . "-->" . md5($a) . "<br>");
    print_r($b . "-->" . md5($b) . "<br>");
    // s878926199a-->0e545993274517709034328855841020
    // s155964671a-->0e342768416822451524974117254469
    
    print_r(var_dump(md5($a) == md5($b)) . "<br>"); // bool(true)
    
    // 数字 vs 数字
    $a1 = "0e33";
    $b1 = "0e89";
    print_r(var_dump($a1 == $b1) . "<br>"); // bool(true)
    
    // 数字 vs 字母
    $a3 = "0eadd";
    $b3 = "0e232";
    print_r(var_dump($a3 == $b3) . "<br>"); // bool(false)
    
    // 数字 vs 数字/字母
    $a4 = "0ea34343dd";
    $b4 = "0e232";
    print_r(var_dump($a4 == $b4) . "<br>"); // bool(false)
    

    1.2 利用

    常见的 md5 值是 0e 开头且后面均为数字的字符串

    s878926199a
    0e545993274517709034328855841020
    s155964671a
    0e342768416822451524974117254469
    s214587387a
    0e848240448830537924465865611904
    s214587387a
    0e848240448830537924465865611904
    s878926199a
    0e545993274517709034328855841020
    s1091221200a
    0e940624217856561557816327384675
    s1885207154a
    0e509367213418206700842008763514
    s1502113478a
    0e861580163291561247404381396064
    s1885207154a
    0e509367213418206700842008763514
    s1836677006a
    0e481036490867661113260034900752
    s155964671a
    0e342768416822451524974117254469
    s1184209335a
    0e072485820392773389523109082030
    s1665632922a
    0e731198061491163073197128363787
    s1502113478a
    0e861580163291561247404381396064
    s1836677006a
    0e481036490867661113260034900752
    s1091221200a
    0e940624217856561557816327384675
    s155964671a
    0e342768416822451524974117254469
    s1502113478a
    0e861580163291561247404381396064
    s155964671a
    0e342768416822451524974117254469
    s1665632922a
    0e731198061491163073197128363787
    s155964671a
    0e342768416822451524974117254469
    s1091221200a
    0e940624217856561557816327384675
    s1836677006a
    0e481036490867661113260034900752
    s1885207154a
    0e509367213418206700842008763514
    s532378020a
    0e220463095855511507588041205815
    s878926199a
    0e545993274517709034328855841020
    s1091221200a
    0e940624217856561557816327384675
    s214587387a
    0e848240448830537924465865611904
    s1502113478a
    0e861580163291561247404381396064
    s1091221200a
    0e940624217856561557816327384675
    s1665632922a
    0e731198061491163073197128363787
    s1885207154a
    0e509367213418206700842008763514
    s1836677006a
    0e481036490867661113260034900752
    s1665632922a
    0e731198061491163073197128363787
    s878926199a
    0e545993274517709034328855841020
    240610708 
    0e462097431906509019562988736854
    314282422 
    0e990995504821699494520356953734
    571579406 
    0e972379832854295224118025748221
    903251147 
    0e174510503823932942361353209384
    1110242161 
    0e435874558488625891324861198103
    1320830526 
    0e912095958985483346995414060832
    1586264293 
    0e622743671155995737639662718498
    2302756269 
    0e250566888497473798724426794462
    2427435592 
    0e067696952328669732475498472343
    2653531602 
    0e877487522341544758028810610885
    3293867441 
    0e471001201303602543921144570260
    3295421201 
    0e703870333002232681239618856220
    3465814713 
    0e258631645650999664521705537122
    3524854780 
    0e507419062489887827087815735195
    3908336290 
    0e807624498959190415881248245271
    4011627063 
    0e485805687034439905938362701775
    4775635065 
    0e998212089946640967599450361168
    4790555361 
    0e643442214660994430134492464512
    5432453531 
    0e512318699085881630861890526097
    5579679820 
    0e877622011730221803461740184915
    5585393579 
    0e664357355382305805992765337023
    6376552501 
    0e165886706997482187870215578015
    7124129977 
    0e500007361044747804682122060876
    7197546197 
    0e915188576072469101457315675502
    7656486157 
    0e451569119711843337267091732412
    QLTHNDT 
    0e405967825401955372549139051580
    QNKCDZO 
    0e830400451993494058024219903391
    EEIZDOI 
    0e782601363539291779881938479162
    TUFEPMC 
    0e839407194569345277863905212547
    UTIPEZQ 
    0e382098788231234954670291303879
    UYXFLOI 
    0e552539585246568817348686838809
    IHKFRNS 
    0e256160682445802696926137988570
    PJNPDWY 
    0e291529052894702774557631701704
    ABJIHVY 
    0e755264355178451322893275696586
    DQWRASX 
    0e742373665639232907775599582643
    DYAXWCA 
    0e424759758842488633464374063001
    GEGHBXL 
    0e248776895502908863709684713578
    GGHMVOE 
    0e362766013028313274586933780773
    GZECLQZ 
    0e537612333747236407713628225676
    NWWKITQ 
    0e763082070976038347657360817689
    NOOPCJF 
    0e818888003657176127862245791911
    MAUXXQC 
    0e478478466848439040434801845361
    MMHUWUV 
    0e701732711630150438129209816536
    

    2 数组绕过(PHP 8 无法绕过)

    在 PHP5 和 PHP7 中,当两个 md5 进行比较时,若参数是不同的数组,那么 ===== 比较的结果均为 True

    // /param.php?a[]=1&b[]=2
    print_r(PHP_VERSION . "<br>");
    
    $a = $_GET["a"];
    $b = $_GET["b"];
    
    print_r($a . "<br>");
    print_r($b . "<br>");
    
    print_r(var_dump(md5($a) === md5($b)));
    

    PHP5
    image
    PHP7
    image
    然而 PHP8。。。
    image

    3 md5 碰撞

    利用 fastcoll 进行 md5 碰撞,生成两个字面值不同但 md5 相同的字符串。
    新建一个空的 txt 文档。
    image
    然后拖到 exe 上,自动生成两个文件。
    image
    得到两个文件,通过代码读取即可。
    image

    <?php
    
    $a = file_get_contents('D:tmpa_msg1.txt');
    $b = file_get_contents('D:tmpa_msg2.txt');
    
    print_r($a . "<br>");
    print_r($b . "<br>");
    print_r(var_dump($a === $b) . "<br>"); // bool(false)
    print_r(var_dump(md5($a) === md5($b)) . "<br>"); // bool(true)
    

    md5 碰撞面对一些绕过非常有用,例如通过参数上传一句话木马[2]


    1. https://zhuanlan.zhihu.com/p/123235283 ↩︎

    2. https://www.cnblogs.com/Riv3r1and/p/13795704.html ↩︎

  • 相关阅读:
    十三 web爬虫讲解2—Scrapy框架爬虫—Scrapy爬取百度新闻,爬取Ajax动态生成的信息
    十二 web爬虫讲解2—Scrapy框架爬虫—Scrapy模拟浏览器登录—获取Scrapy框架Cookies
    十一 web爬虫讲解2—Scrapy框架爬虫—Scrapy使用
    十 web爬虫讲解2—Scrapy框架爬虫—Scrapy安装—Scrapy指令
    九 web爬虫讲解2—urllib库爬虫—实战爬取搜狗微信公众号—抓包软件安装Fiddler4讲解
    八 web爬虫讲解2—urllib库爬虫—ip代理—用户代理和ip代理结合应用
    七 web爬虫讲解2—urllib库爬虫—状态吗—异常处理—浏览器伪装技术、设置用户代理
    六 web爬虫讲解2—urllib库爬虫—基础使用—超时设置—自动模拟http请求
    五 web爬虫,scrapy模块,解决重复ur——自动递归url
    四 web爬虫,scrapy模块标签选择器下载图片,以及正则匹配标签
  • 原文地址:https://www.cnblogs.com/ainsliaea/p/15126218.html
Copyright © 2011-2022 走看看