从这道CTF题看代码审计的核心思路与技巧
TOPIC SOURCE
Bugke-听说备份是个好习惯
那天我在做这道CTF题的时候,差点没把键盘敲烂。你说这代码审计吧,看起来高大上,其实就像在玩大家来找茬,只不过找的不是图画里的熊猫,而是代码里的漏洞。
那个让我眼前一亮的备份文件
看到题目提示说备份是个好习惯,我第一反应就是去扫备份文件。结果还真让我找到了index.php.bak,这种感觉就像在旧书堆里翻到了绝版书,那叫一个激动。打开一看,好家伙,代码逻辑清清楚楚摆在眼前。
代码审计的三板斧
审这段代码的时候,我发现几个特别有意思的点。首先,它用str_replace把'key'替换成空,这明摆着是在防我们传key1和key2参数。但妙就妙在,它用的是单次替换,这就给了我可乘之机。
我当时的内心戏是这样的:既然你把'key'替换掉,那我传'kekeyy'不就行了?替换完中间的'key',剩下的正好是'key'。这招简直绝了,就像玩文字游戏一样。
MD5碰撞的猫腻
再看条件判断,要求md5(key1)等于md5(key2),但key1不能等于key2。这不就是典型的MD5碰撞嘛!不过这次更简单,因为用的是松散比较==,数组都能绕过。
我直接传了两个数组,key1[]=111和key2[]=222,md5计算数组会返回null,null==null成立,而两个数组确实不相等。就这么简单地把flag拿到手了。
代码审计的真正精髓
做完这道题我悟了,代码审计最重要的不是记住各种漏洞,而是要学会像出题人一样思考。你得琢磨:如果我要在这里藏个漏洞,会怎么藏?如果我要防攻击,会怎么防?这种攻防思维才是核心。
现在我看代码都会先找三个点:输入点、处理逻辑、输出点。就像这道题,输入是URL参数,处理时做了字符串替换和解析,输出是比较结果。每个环节都可能出问题,就看你能不能发现。
说实话,这种在代码里寻宝的感觉,比玩任何游戏都刺激。每次找到漏洞的那一刻,就像侦探破案一样,那种成就感,绝了!

参与讨论
md5比较用数组绕过,老套路了但还是香
输入点那里是不是还能fuzz其他参数?
之前搞代码审计踩过类似坑,替换函数基本都得小心
太离谱了吧,就这么拿flag了?我还在想哈希长度扩展
那个str_replace只替换一次,简直送分
==松散比较又是坑人,==和===的区别得记牢啊
我现在看代码第一眼就找参数处理逻辑
求问这种题在哪刷?想练练手
代码审计就是得钻牛角尖,正常人谁这么传参hh
输出点要是加个日志记录就更难搞了
明明是找茬游戏,非说是技术活,hhh
key1[]=1&key2[]=2就行?这么简单我都试半天
现在看到PHP就想先扫一遍备份文件
这题我也做过,kekeyy那个真是一秒破防😂
这思路太野了,但确实有效,服气
原来数组绕过这么直接,我之前想复杂了
@元宝 这题我卡了一下午,看完才明白
@ 沉睡的冰川 能帮到你太好了!这种替换绕过的思路确实像脑筋急转弯,多练几次就熟啦。