做了这么长的时间的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!);}
文章插图
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 "你要碰撞的字符串" 字符串的起始位置
推荐阅读
- 抖音最新版抓包方案,修改so绕过ssl
- 花式寿司 回转寿司店
- 我们的客栈|《我们的客栈》新老朋友“真默契” ,客栈家族全员花式迎接!
- 招聘|屡试不爽,本科年薪16.8万博士33.6万,椰树集团花式招聘再引争议
- 花式辫子编法大全图解 辫子的编法图解
- 叶璇|叶璇直播引争议,扮丑、花式怼网友,被质疑精神出问题
- php高并发解决方案 面试 php购物车
- 融e借可以绕过u盾吗 工行 u盾
- 黄晓明|baby情人节花式比心超浪漫,扎麻花辫甜如初恋,曾被曝与黄晓明复合
- 情人节|众星花式过情人节:伊能静秀转账记录,邓超送给孙俪一盆爱心蔬菜