凌晨两点,漏洞我盯着屏幕上那个红得刺眼的漏洞漏洞报告,第一次觉得自己像个拆弹专家。漏洞不是漏洞电影里那种帅气的,是漏洞那种手抖得连剪刀都拿不稳的。
漏洞不是漏洞造出来的,是漏洞“长”出来的。就像你老房子墙角的漏洞裂缝,没人特意去凿,漏洞但地基在动、漏洞水泥在缩,漏洞某天它就出现了。漏洞代码也一样——程序员写下一行判断时少了个边界条件,漏洞框架升级后接口参数变了,漏洞甚至只是漏洞服务器时间设置错了,都可能变成攻击者手里的梯子。
我见过最离谱的漏洞,藏在某银行APP的“找回密码”功能里。开发者为了让用户体验流畅,把验证码校验放在了前端。懂行的朋友已经笑了——前端校验等于没校验。攻击者打开浏览器开发者工具,删掉那行if语句,直接跳转到重置密码的接口,整个账户就成了他的提款机。你说开发蠢吗?他只是想省一次服务器请求,让页面响应快0.3秒。
真正的漏洞挖掘,更像是在跟程序员玩心理战。你得猜他哪次偷懒了,哪次被产品经理催得忘了加鉴权,哪次复制粘贴代码时忘了改ID。有个老黑客跟我说过一句糙理不糙的话:“漏洞不是代码写错了,是人性露怯了。”
拿经典的SQL注入来说吧。1998年就有案例,到现在2024年了,我上周还在一家物流公司的系统里测出来。那个接口把用户输入的手机号直接拼进数据库查询语句,连参数化查询都没用。你说这技术难吗?大学数据库课第一周就教了。但那个项目是外包给一个刚毕业的学生做的,他赶工期,用了最顺手但最危险的字符串拼接写法。
所以你要问漏洞怎么做,我的答案是:先学会像程序员一样思考,再学会像懒人一样思考。前者让你知道代码本该是什么样,后者让你发现它实际变成了什么样。别急着上工具,Burp Suite和sqlmap是辅助,真正值钱的是你脑子里的那份“怀疑清单”——这个登录框能不能绕过?那个文件上传有没有校验后缀名?管理员后台的Cookie是不是只用了用户名加密?
我自己的习惯是,拿到一个目标先不看功能文档,直接翻它的前端JS文件。很多开发会把接口地址、参数结构甚至硬编码的密钥留在里面,跟把家门钥匙藏在门口脚垫下差不多。上周测某政务系统,就在一个公共JS文件里找到了数据库备份文件的路径,连密码都是“admin123”。那一刻我哭笑不得——不是攻击手段多高明,是防守方根本没设防。
最后说句掏心窝的话。这行干久了,你会发现自己对“信任”这个词越来越敏感。每次看到“记住我”的勾选框,脑子里第一反应是“这个token有效期设了多久”;每次收到带附件的邮件,鼠标悬停在链接上先看域名。这不是职业病,是你看过太多本不该被看到的隐私后,对数字世界产生的基本敬畏。
漏洞怎么做?别把它当技术问题,把它当人性考题。出题的是写代码的人,答题的是找漏洞的人,而改卷的,是那些把身家性命交给代码的普通用户。你每挖出一个洞,都是在帮他们补上一块可能塌陷的地板。这活儿不酷,但踏实。