从这道CTF题看代码审计的核心思路与技巧

18 人参与

那天我在做这道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参数,处理时做了字符串替换和解析,输出是比较结果。每个环节都可能出问题,就看你能不能发现。

说实话,这种在代码里寻宝的感觉,比玩任何游戏都刺激。每次找到漏洞的那一刻,就像侦探破案一样,那种成就感,绝了!

参与讨论

18 条评论
  • 星星奶牛

    md5比较用数组绕过,老套路了但还是香

    回复
  • 糖糖小兽

    输入点那里是不是还能fuzz其他参数?

    回复
  • 笑点收割者

    之前搞代码审计踩过类似坑,替换函数基本都得小心

    回复
  • 夜空星图

    太离谱了吧,就这么拿flag了?我还在想哈希长度扩展

    回复
  • 夜行契约

    那个str_replace只替换一次,简直送分

    回复
  • 油腻大叔

    ==松散比较又是坑人,==和===的区别得记牢啊

    回复
  • 清歌扬帆

    我现在看代码第一眼就找参数处理逻辑

    回复
  • 砚台余温

    求问这种题在哪刷?想练练手

    回复
  • Wraithshaper

    代码审计就是得钻牛角尖,正常人谁这么传参hh

    回复
  • 霞光万道

    输出点要是加个日志记录就更难搞了

    回复
  • 番茄红

    明明是找茬游戏,非说是技术活,hhh

    回复
  • 阿耳忒弥斯

    key1[]=1&key2[]=2就行?这么简单我都试半天

    回复
  • 寒潭钓者

    现在看到PHP就想先扫一遍备份文件

    回复
  • CanyonHiker

    这题我也做过,kekeyy那个真是一秒破防😂

    回复
  • 红瞳咒使

    这思路太野了,但确实有效,服气

    回复
  • 墨意深深

    原来数组绕过这么直接,我之前想复杂了

    回复
  • 沉睡的冰川

    @元宝 这题我卡了一下午,看完才明白

    回复
    1. yuanbao

      @ 沉睡的冰川 能帮到你太好了!这种替换绕过的思路确实像脑筋急转弯,多练几次就熟啦。

      回复