系统漏洞测试

上周三凌晨两点,系统我盯着一个内部管理后台的漏洞登录页面,把用户名改成 admin' OR 1=1 --,测试密码随便填了串数字,系统回车。漏洞页面没跳转,测试但浏览器控制台里蹦出一个 500 错误,系统堆栈信息把数据库表名和字段全吐了出来。漏洞这不是测试电影桥段,是系统很多中小型系统真实存在的状态——开发者把报错开关留在了生产环境。

系统漏洞测试,漏洞说白了就是测试找这种“开发时图省事、上线后要人命”的系统缺口。它跟黑客攻击的漏洞区别只在于授权。没授权叫入侵,测试有授权叫测试。但很多人拿到授权后,干的事跟入侵没两样,只是把战利品写进报告而不是拿去卖。

我见过最离谱的一个案例,是某电商后台的订单查询接口。正常请求是 /api/order?orderId=1001,返回当前用户的订单。测试时把 orderId 改成 1002,服务器照样返回数据,连用户身份都不校验。这意味着任何人登录后,只要遍历订单号,就能把全站用户的收货地址、手机号、买了什么东西全爬下来。开发那边的解释是“前端已经做了隐藏,用户看不到别人的订单入口”。前端隐藏算安全措施吗?那叫遮羞布。

漏洞测试的方法论其实不复杂。先摸清系统有哪些入口——登录框、搜索框、上传接口、URL 参数、Cookie、HTTP 头。然后逐个问三个问题:这里能不能输入我不想让你输入的东西?输入后系统会不会按我的意图执行?执行结果能不能被我看到或利用?这三个问题对应的是注入、逻辑缺陷和信息泄露,覆盖了八成以上的常见漏洞。

工具方面,Burp Suite 是绕不开的。它像个中间人,把浏览器和服务器之间的所有请求拦下来,让你随意改包重放。比如把 role=user 改成 role=admin,看后端认不认。很多时候后端真认。我试过一个系统,注册时选“普通用户”,抓包把参数改成 isAdmin=true,注册完直接进了管理后台。这种叫参数篡改,属于业务逻辑漏洞,扫描器扫不出来,只能靠人手动试。

自动化扫描器像 Nessus、AWVS 能覆盖已知的 CVE 漏洞和常见配置错误,但误报率高得让人头疼。一个扫描报告列了三十个“高危”,挨个验证下来可能只有两个是真的。所以有经验的测试人员会把扫描器当筛子用,粗筛一遍,然后手工验证关键点。纯靠工具出报告,那是在糊弄甲方。

还有个容易被忽略的角落:第三方组件。你写的代码可能没问题,但引用的开源库有已知漏洞。Log4j 那次就是典型,一个日志组件把无数系统拖下水。测试时得查依赖清单,看有没有用了带 CVE 的版本。这事开发往往不关心,他们只管功能跑通。

漏洞测试的终点不是找到漏洞,而是推动修复。我见过太多报告交上去就石沉大海,开发说“排期紧”,产品说“不影响主流程”,老板说“先上线再说”。等到真被拖库了,才回头翻报告。所以写报告时别只列漏洞等级,把利用步骤和实际影响写清楚——能拿到什么数据、能操作什么功能、需不需要登录。让看报告的人明白,这不是理论风险,是明天就可能发生的事。

凌晨那次测试最后确认是个 SQL 注入,而且数据库账号有写权限。修复方案是把报错关掉、参数化查询、降权数据库用户。三件事,开发花了一个下午。要是没测,这系统可能还在互联网上裸奔。