寫在前面:最近練習(xí)了一些CTF中關(guān)于md5繞過的題目,總結(jié)了幾種思路,本質(zhì)沒有太大變化,就是各種組合繞過,也是比較考察基礎(chǔ)的,前段時(shí)間太擺爛了,好久沒有更新了,革命尚未成功,同志仍需努力?。?!
關(guān)于md5
? md5是一種信息摘要算法(目標(biāo)是用于證明原文的完整性),其本質(zhì)也是一種哈希函數(shù),一種被廣泛使用的密碼散列函數(shù),任意長度的數(shù)據(jù)算出的md5值的長度都是固定的,md5碼具有高度的散列性,沒有規(guī)律可循,哪怕轅信息只有一點(diǎn)變化,那么md5碼也會發(fā)生巨大的變化,常用于驗(yàn)證文件的完整性,數(shù)據(jù)庫存儲密碼,數(shù)字簽名等。
? md5具有不可逆性,但是通過MD5碰撞,還是有一定可能逆向出來的,(推薦一個(gè)在線md5破解網(wǎng)站:md5在線破解網(wǎng)站)
PHP 類型比較
- 松散比較(運(yùn)算符):使用兩個(gè)等號?==?比較,只比較值,不比較類型。
- 嚴(yán)格比較(全等運(yùn)算符):用三個(gè)等號?===?比較,除了比較值,也比較類型。
詳細(xì)了解可以參考菜鳥教程,很詳細(xì)了。
PHP 0e漏洞
? PHP在處理哈希字符串時(shí),會利用”!=”或”==”來對哈希值進(jìn)行比較,它把每一個(gè)以”0E”開頭的哈希值都解釋為0(當(dāng)成科學(xué)計(jì)數(shù)法進(jìn)行處理),所以如果兩個(gè)不同的密碼經(jīng)過哈希以后,其哈希值都是以”0E”開頭的,那么PHP將會認(rèn)為他們相同,都是0。
? PHP在攻擊者可以利用這一漏洞,通過輸入一個(gè)經(jīng)過哈希后以”0E”開頭的字符串,即會被PHP解釋為0,如果數(shù)據(jù)庫中存在這種哈希值以”0E”開頭的密碼的話,他就可以以這個(gè)用戶的身份登錄進(jìn)去,盡管并沒有真正的密碼。
PHP md5()函數(shù)
語法:md5(string,raw)
參數(shù) | 描述 |
---|---|
string | 必需。規(guī)定要計(jì)算的字符串。 |
raw | 可選。規(guī)定十六進(jìn)制或二進(jìn)制輸出格式: TRUE - 原始 16 字符二進(jìn)制格式 FALSE - 默認(rèn) 32 字符十六進(jìn)制數(shù) |
具體使用方法,可以參考菜鳥教程
松散比較類型
?題目一
- 題目如下:
<?php
header("Content-Type:text/html;charset=utf-8");
show_source(__FILE__);
include('flag.php');
$md5 = $_GET['md5'];
if($md5 == md5($md5)){
echo 'GET_FLAG'.$flag;
}else{
echo 'md5校驗(yàn)失敗...';
}
?> md5校驗(yàn)失敗...
-
題目分析:
題目中要求一個(gè)字符串與md5加密后的值相等,通過上面PHP 0e漏洞的原理,也就將此題轉(zhuǎn)化成 ==>尋找一個(gè)字符串(0e開頭)加密后(還是0e開頭),弱比較相等。
payload:?md5=0e215962017
- 此題可解:
?
題目二
- 題目如下:
<?php
header("Content-Type:text/html;charset=utf-8");
show_source(__FILE__);
include('flag.php');
$username = $_GET['username'];
$password = $_GET['password'];
if($username != $password){
if(md5($username) == md5($password)){
echo 'GET_FLAG:'.$flag;
}else{
echo 'md5校驗(yàn)出錯...';
}
}else{
echo '用戶名密碼不能相等!';
}
?> 用戶名密碼不能相等
- 題目分析:
題目中,要求兩個(gè)字符串值不能相等,但是兩個(gè)字符串經(jīng)過md5加密后的值需要相等,通過上面PHP 0e漏洞的原理,也就將此題轉(zhuǎn)化成 ==> 尋找兩個(gè)值加密后以0e開頭,且0e后面是純數(shù)字的字符串即可,可以使用Python寫個(gè)程序或者直接在網(wǎng)上搜。
240610708
0e462097431906509019562988736854
314282422
0e990995504821699494520356953734
571579406
0e972379832854295224118025748221
QLTHNDT
0e405967825401955372549139051580
QNKCDZO
0e830400451993494058024219903391
EEIZDOI
0e782601363539291779881938479162
TUFEPMC
0e839407194569345277863905212547
UTIPEZQ
0e382098788231234954670291303879
- 此題可解:
嚴(yán)格比較類型
題目一
- 題目如下:
<?php
header("Content-Type:text/html;charset=utf-8");
show_source(__FILE__);
include('flag.php');
$username = $_GET['username'];
$password = $_GET['password'];
if($username != $password){
if(md5($username) === md5($password)){
echo 'GET_FLAG:'.$flag;
}else{
echo 'md5校驗(yàn)出錯...';
}
}else{
echo '用戶名密碼不能相等!';
}
?> 用戶名密碼不能相等!
- 題目分析:
全等運(yùn)算符“===”,既比較值又比較類型,題目中“!=”意思為“不等于”,具體可查看菜鳥教程關(guān)于“!=”說明,值不相等時(shí)返回“ture”,也就是說兩個(gè)參數(shù)值要不相等,兩個(gè)參數(shù)在md5加密后全相等,也就是說兩個(gè)參數(shù)在md5加密后不僅值相等類型也要一致,此時(shí)就無法利用PHP 0e漏洞了,需要別的方法繞過。
可以利用md5在加密字符串時(shí)會warining,輸出結(jié)果為NULL,傳入兩個(gè)數(shù)組,這樣就能使兩個(gè)參數(shù)在md5加密后的類型是一致的。
payload:?username[]=1&password[]=2
- 此題可解:
?catf1ag{nlLU5FRGzI98ZuDyCYwq4KG4iZqIVEmp}
SQL注入+md5
(此題考察了SQL注入+md5各種繞過)
- 題目如下:
- 題目分析:
隨便輸入內(nèi)容。點(diǎn)擊提交沒有任何回顯,想到查看網(wǎng)頁源代碼,是否會有線索解題,在源代碼中看到“header”,考慮可以嘗試抓包查看HTTP頭,這里推薦一個(gè)好用的在線工具(在線查看HTTP/HTTPS響應(yīng)消息頭)。
通過抓包(如下圖),發(fā)現(xiàn)“Hint”處存在一個(gè)SQL語句“select * from 'admin' where password=md5($pass,true)”,這里通過上面對PHP md5()函數(shù)的解釋,md5($pass,true)為true時(shí),返回的是原始 16 字符二進(jìn)制格式,這時(shí)可以通過輸入ffifdyop進(jìn)行繞過。
ffifdyop繞過原理:
ffifdyop經(jīng)過md5加密后是:276f722736c95d99e921722cf9ed621c
在轉(zhuǎn)換字符串是:'or'6<亂碼>? 即 ?
'or'66?]??!r,??b
利用方法:
select * from admin where password=''or'6<亂碼>'
就相當(dāng)于構(gòu)成永真式,即萬能密碼,實(shí)現(xiàn)SQL注入
select * from admin where password=''or 1
?輸入提交后,返回了新的頁面(如下圖)。
查看網(wǎng)頁源代碼。
<!--
$a = $GET['a'];
$b = $_GET['b'];
if($a != $b && md5($a) == md5($b)){
-->
這里通過代碼審計(jì):
傳入?yún)?shù)a和b不能相等,兩個(gè)參數(shù)經(jīng)過md5加密后值相等??梢詤⒖忌厦娴乃缮⒈容^類型進(jìn)行繞過。提交參數(shù)后,頁面刷新(如下圖)。
好家伙,又要繞過,需要傳入?yún)?shù)param1和param2,需要滿足兩個(gè)參數(shù)不相等,md5加密后值和類型都相等,可以參考上面的嚴(yán)格比較類型進(jìn)行繞過(數(shù)組)。需要注意的是這里需要使用POST傳參,這里推薦工具:HackBar。
- 題目得解:
?flag{2223418e-1d21-4436-95cb-4050c0ffc7a4}
題目練習(xí)平臺
Catf1agCTF - 綜合訓(xùn)練平臺(前面幾道題目)文章來源:http://www.zghlxwxcb.cn/news/detail-649735.html
BUUCTF在線評測http://www.catf1ag.cn/mainBUUCTF在線評測(最后一題[BJDCTF2020]Easy MD51)文章來源地址http://www.zghlxwxcb.cn/news/detail-649735.html
到了這里,關(guān)于CTF-[Web] MD5解題思路的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!