CTF中的md5(ALL_IN_ONE 2020.11.20更新)
CTF中的md5
第一種情況,md5弱型別比較
if(md5($_GET['a'])==md5($_GET['b']))
{
var_dump($flag);
}
因為是if的判斷條件是兩個數弱型別相等,就可以利用hash比較缺陷去繞過
比如
var_dump("0e12345"=="0e66666");//true
var_dump(md5('240610708')==md5('QNKCDZ0'));//true
也就是隻要兩個數的md5加密後的值以0e開頭就可以繞過,因為php在進行弱型別比較(即==)時,會現轉換字串的型別,在進行比較,而在比較是因為兩個數都是以0e開頭會被認為是科學計數法,0e後面加任何數在科學計數法中都是0,所以兩數相等,在進行嚴格比較(===)時才會先判斷字串型別是否相等,在比較。
想這樣特殊的md5值還有
php >QLTHNDT:0e405967825401955372549139051580 >QNKCDZO:0e830400451993494058024219903391 >PJNPDWY:0e291529052894702774557631701704 >NWWKITQ:0e763082070976038347657360817689 >NOOPCJF:0e818888003657176127862245791911 >MMHUWUV:0e701732711630150438129209816536 >MAUXXQC:0e478478466848439040434801845361 >
除了這些還有很多參考:https://github.com/spaze/hashes/blob/master/md5.md
第二種情況,md5強型別比較
if(md5((string)$_GET['a'])===md5((string)$_GET['b']))
{
var_dump($flag);
}
此時兩個md5後的值採用嚴格比較,沒有規定字串如果這個時候傳入的是陣列不是字串,可以利用md5()函式的缺陷進行繞過
var_dump(md5([1,2,3])==md5([4,5,6]));//true
var_dump(md5($_GET['a'])==md5($_GET['b']));
?a[]=1&b[]=1//true
md5()函式的描述是string md5(string $str[,bool $raw_output=false])
md5中需要的是一個string引數,但是當你傳入一個array(陣列)是,md5()是不會報錯的,只是無法求出array的md5的值,這樣就會導致任意的2個array的md5的值都會相等
第一種情況也可以使用弱型別繞過
第三種情況,md5碰撞
if($_GET['a']!==$_GET['b'] && md5($_GET['a'])===md5($_GET['b']))
{
echo 'ok';
}
真實md5碰撞,因為此時不能輸入陣列了,只能輸入字串
a=M%C9h%FF%0E%E3%5C%20%95r%D4w%7Br%15%87%D3o%A7%B2%1B%DCV%B7J%3D%C0x%3E%7B%95%18%AF%BF%A2%00%A8%28K%F3n%8EKU%B3_Bu%93%D8Igm%A0%D1U%5D%83%60%FB_%07%FE%A2&b=M%C9h%FF%0E%E3%5C%20%95r%D4w%7Br%15%87%D3o%A7%B2%1B%DCV%B7J%3D%C0x%3E%7B%95%18%AF%BF%A2%02%A8%28K%F3n%8EKU%B3_Bu%93%D8Igm%A0%D1%D5%5D%83%60%FB_%07%FE%A2
兩個關於md5碰撞的網站:
第四種情況,sql語句
$query = "SELECT * FROM flag WHERE password = '" . md5($_GET["hash4"],true) . "'";
這需要一個極其特殊的md5的值 ffifdyop
這個字串進行md5後恰好結果是’or’6�]��!r,��b,他的前四位為’or’正好滿足sql注入查詢的條件,因此可以完美繞過
md5值暴破
爆破指令碼和使用方式:
submd5.py
# -*- coding: utf-8 -*-
import multiprocessing
import hashlib
import random
import string
import sys
CHARS = string.letters + string.digits
def cmp_md5(substr, stop_event, str_len, start=0, size=20):
global CHARS
while not stop_event.is_set():
rnds = ''.join(random.choice(CHARS) for _ in range(size))
md5 = hashlib.md5(rnds)
if md5.hexdigest()[start: start+str_len] == substr:
print rnds
stop_event.set()
if __name__ == '__main__':
substr = sys.argv[1].strip()
start_pos = int(sys.argv[2]) if len(sys.argv) > 1 else 0
str_len = len(substr)
cpus = multiprocessing.cpu_count()
stop_event = multiprocessing.Event()
processes = [multiprocessing.Process(target=cmp_md5, args=(substr,
stop_event, str_len, start_pos))
for i in range(cpus)]
for p in processes:
p.start()
for p in processes:
p.join()
使用方式:
爆破md5的值是以3e5f開頭的字串的值
驗證:
其他特殊的hash值(md4、crc32…)
https://github.com/spaze/hashes
感謝各位大神的整理
相關文章
- Oracle中的MD5加密Oracle加密
- JAVA中MD5加密(MD5工具類)Java加密
- 弱口令、子域名、md5、偽隨機數、目錄爆破與CTF實戰隨機
- 【CTF入門】BUUCTF Misc刷題(持續更新)
- ctf pwn中的unlink exploit(堆利用)
- MD5加密的密碼資訊回顯更新問題,Mybatis-plus動態更新問題以及更新策略加密密碼MyBatis
- VM - JIS-CTF-VulnUpload-CTF01 的破解
- javaScript中計算字串MD5JavaScript字串
- CTF中的一些圖形密碼密碼
- MD5的使用
- .net core中你的MD5用對了嗎?
- CTF 中 ARM & AArch64 架構下的 Pwn架構
- MD5演算法:密碼學中的傳奇演算法密碼學
- python對介面中的資料進行md5加密Python加密
- MD5的其他使用
- CTF學習(14)MISC(資料包中的線索)
- MD5的簡單用法
- MD5碰撞的演化之路
- CTF中的最佳化隨機演算法(爬山&退火)隨機演算法
- 面向 CTF 的 VM 破解系列
- 安全-md5
- md5解密解密
- MD5加密加密
- MD5手機號線上解密 MD5解密解密
- 2020.11.20 文獻14閱讀《我國水電站地下廠房的發展》
- 修改檔案的md5碼
- CTF總結
- CTF 退役記
- CSS的再深入(更新中···)CSS
- CTF中常用的參考表
- CTF 中 glibc堆利用 及 IO_FILE 總結
- MD5介紹
- MD5簽名
- md5繞過
- java MD5 加密Java加密
- java md5加密的幾種方式Java加密
- 檢視jks檔案的MD5
- 0ctf writeup