PHP花式绕过大全

做了这么长的时间的ctf,现在总结一下自己做过的题,记录一下各种可能会存在绕过的php函数,持续更新 。
 
 
1.preg_replace ($pattern , $replacement , $subject )其中 $pattern为正则表达式
$replacement为替换字符串
$subject 为要搜索替换的目标字符串或字符串数组
这个函数存在一些奇异的地方,正则表达式$pattern以/e结尾时$replacement的值会被作为php函数执行 。
例如执行 preg_replace (‘/test/e’ , "phpinfo();" , "test" )
“test”会被替换为phpinfo();并执行 。
 
2.MD5加密绕过 
2.1 MD5弱比较绕过 
php中有一个提供MD5加密的函数md5()通常被用来进行密码验证之类的功能 。
 
在ctf中常见如下的验证方式:
 
if( a == b && md5(a) == md5(b) )
 
方法一:
 
这儿md5(a)/md5(b)两数如果满足科学计数法的形式的话,php会将其当作科学计数法所得的数字来进行比较 。例如:
 
md5(QNKCDZO)0e830400451993494058024219903391 
可以看见QNKCDZO的md5值是0e开头满足科学计数法的表示形式,而0e的值始终为0
 
因此,只要字符串经md5后满足科学计数法的0e开头,他们在==比较时就会被认定为相等 。(只对==比较有效,不适用于===)
 
以下给出一些满足该要求的md5数
 
QNKCDZO
0e830400451993494058024219903391
s878926199a
0e545993274517709034328855841020
s155964671a
0e342768416822451524974117254469
s214587387a
0e848240448830537924465865611904
s214587387a
0e848240448830537924465865611904
s878926199a
0e545993274517709034328855841020
s1091221200a
0e940624217856561557816327384675
方法二 :
md5()函数无法处理数组,如果传入的为数组,会返回NULL,所以两个数组经过加密后得到的都是NULL,也就是相等的 。
也就是说a[]=1,2 b[]=2,3 该验证依然可以绕过 。
?
2.2 MD5强碰撞【PHP花式绕过大全】 
if((string)$_POST['param1']!==(string)$_POST['param2'] && md5($_POST['param1'])===md5($_POST['param2'])){die("success!);} 

PHP花式绕过大全

文章插图
 
Param1=%4d%c9%68%ff%0e%e3%5c%20%95%72%d4%77%7b%72%15%87%d3%6f%a7%b2%1b%dc%56%b7%4a%3d%c0%78%3e%7b%95%18%af%bf%a2%00%a8%28%4b%f3%6e%8e%4b%55%b3%5f%42%75%93%d8%49%67%6d%a0%d1%55%5d%83%60%fb%5f%07%fe%a2
Param2=%4d%c9%68%ff%0e%e3%5c%20%95%72%d4%77%7b%72%15%87%d3%6f%a7%b2%1b%dc%56%b7%4a%3d%c0%78%3e%7b%95%18%af%bf%a2%02%a8%28%4b%f3%6e%8e%4b%55%b3%5f%42%75%93%d8%49%67%6d%a0%d1%d5%5d%83%60%fb%5f%07%fe%a2
 
2.3 双MD5碰撞绕过 
$a != $b && md5($a) == md5(md5($b) 
一些例子
 
MD5大全:CbDLytmyGm2xQyaLNhWnmd5(CbDLytmyGm2xQyaLNhWn) => 0ec20b7c66cafbcc7d8e8481f0653d18md5(md5(CbDLytmyGm2xQyaLNhWn)) => 0e3a5f2a80db371d4610b8f940d296af770hQgrBOjrcqftrlaZkmd5(770hQgrBOjrcqftrlaZk) => 0e689b4f703bdc753be7e27b45cb3625md5(md5(770hQgrBOjrcqftrlaZk)) => 0e2756da68ef740fd8f5a5c26cc450647r4lGXCH2Ksu2JNT3BYMmd5(7r4lGXCH2Ksu2JNT3BYM) => 0e269ab12da27d79a6626d91f34ae849md5(md5(7r4lGXCH2Ksu2JNT3BYM)) => 0e48d320b2a97ab295f5c4694759889f 
碰撞脚本
 
# -*- coding: utf-8 -*-import multiprocessingimport hashlibimport randomimport stringimport sysCHARS = string.letters + string.digitsdef cmp_md5(substr, stop_event, str_len,. start=0, size=20):global CHARSwhile not stop_event.is_set():rnds = ''.join(random.choice(CHARS) for _ in range(size))md5 = hashlib.md5(rnds)value = https://www.isolves.com/it/aq/ld/2023-03-10/md5.hexdigest()if value[start: start+str_len] == substr:print rndsstop_event.set()'''#碰撞双md5md5 = 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碰撞,取消注释然后注释掉16行即可 。
 
使用方法:Python/ target=_blank class=infotextkey>Python md5Crack.py "你要碰撞的字符串" 字符串的起始位置


推荐阅读