渗透测试里有个词叫“静态分析”,渗透静态听起来挺学术,渗透静态说白了就是渗透静态对着源代码发呆。不运行程序,渗透静态不点界面,渗透静态纯靠眼睛一行行扫代码,渗透静态像考古学家刷陶片那样刷出漏洞。渗透静态我见过最狠的渗透静态静态渗透,是渗透静态在一个凌晨三点的机房里,老周对着三千行PHP代码,渗透静态突然指着屏幕说:“这儿,渗透静态`$_GET`直接拼进`eval`了,渗透静态连个过滤都没加。渗透静态”
那是渗透静态个老旧的CMS系统,开发商早跑路了,渗透静态代码注释全是拼音。老周没开任何工具,就靠肉眼在函数调用之间画线,像在读一封错别字连篇的情书。他管这叫“代码直觉”——其实哪有什么直觉,是他过去五年被SQL注入坑过太多次,看到字符串拼接就条件反射地皱眉。静态分析最迷人的地方就在这:你不需要真的把炸弹引爆,光看引信怎么接的就知道会炸。
但静态也不是万能的。有些漏洞藏得深,得靠动态跑起来才能露馅。比如那次我们测一个金融App,静态扫了三遍没发现问题,结果一上线,有人用特殊编码绕过了登录校验。老周复盘时抽了半包烟,最后憋出一句:“代码是死的,人是活的。写代码的人没想到的,攻击者替他想到了。”
这话糙理不糙。静态分析本质上是在跟开发者的思维惯性较劲。你翻代码的时候,能感觉到那个人当时是着急赶工,还是认真设计了异常处理。比如变量命名乱成一锅粥的,八成后期修修补补过;注释写得比代码还详细的,反而可能藏着不想让人发现的逻辑。有个前辈教过我一个土办法:看到特别工整的代码块,先怀疑它是不是故意引你往那儿看,真正的后门往往藏在看起来最无害的配置文件里。
我后来自己练手,找了个开源的博客系统练静态。翻了三天,终于在密码重置的模块里发现个问题——它用时间戳做token,而且没加随机盐。这意味着只要知道用户注册时间,就能伪造重置链接。当时我兴奋得差点把咖啡打翻,后来冷静下来一想,这漏洞在真实环境里未必打得通,因为服务器时间通常有偏差。但那种“看穿代码背后设计缺陷”的快感,跟动态打进去完全两码事。
静态分析最考验耐心,也最不讨喜。没有弹shell的瞬间快感,没有红队报告里那些花哨的截图。它更像是在跟代码作者隔空对话,你问他:“兄弟,你这段逻辑真的想清楚了吗?”他没法回答,但漏洞会替你回答。有时候盯着屏幕久了,会觉得那些括号和分号都活过来,在跳一支危险的舞——你站得足够远,才能看清整个舞步的破绽。
说到底,渗透这行当,动态是冲锋枪,静态是放大镜。真到了关键时刻,放大镜比冲锋枪管用——毕竟,你总得先看清锁眼在哪,才知道该往哪儿开枪。