打开AppScan,渗透扫描新建扫描任务,测试输入目标URL,漏洞点击“扫描”——很多人以为渗透测试就这么简单。渗透扫描去年我给一家做在线教育的测试客户做测试,他们运维负责人拍着胸脯说“我们每季度都用AppScan跑一遍,漏洞绝对没漏洞”。渗透扫描结果我手动测了不到二十分钟,测试就在一个老旧的漏洞课程上传接口里找到了任意文件上传。AppScan没报,渗透扫描因为那个接口需要先登录再带一个特定的测试Cookie参数,而他们的漏洞扫描配置里压根没加认证信息。
这不是渗透扫描说AppScan不行。恰恰相反,测试它是漏洞我在Web漏洞扫描环节用得最多的工具之一,尤其是需要快速覆盖大量URL、出合规报告的时候。但“用AppScan”和“用好AppScan”之间,差着几十个误报和漏报的距离。
默认的“全面扫描”策略听起来很省事,实际跑起来经常是灾难。一个中型电商站,URL动辄上万,AppScan的爬虫会顺着分页、筛选参数无限展开,三天都跑不完。我通常先做两件事:一是导入Burp或Postman里已经抓好的请求作为“仅扫描这些请求”的种子,二是把登录后的Cookie或Token配进“认证”模块。前者避免爬虫迷路,后者让扫描器能看到后台功能。有一次客户坚持用默认配置扫,报告里SQL注入误报占了七成,我重新配了认证和URL白名单后,有效漏洞从0变成11个。
AppScan报了一个“SQL注入”,点开详情看请求和响应。如果响应里出现了数据库报错信息,那基本坐实;如果只是响应时间变长,可能是盲注的猜测,需要手动用sqlmap验证。反过来,它没报的地方不一定安全。前面说的文件上传就是一个例子——AppScan的变体规则没覆盖到那个接口的Content-Type绕过。我的习惯是:把AppScan当第一层筛子,它报的高危漏洞逐个手动复现,它没报但业务逻辑复杂的功能点,自己用Burp重放几遍。
导出PDF报告发给开发,然后呢?很多团队就停在“已扫描,有漏洞”这一步。我见过最离谱的:报告里写“存在跨站脚本”,开发在输入框加了前端JS过滤,后端没动。下次扫描同一个点,AppScan照样报。渗透测试的闭环是修复后重新扫描那个特定请求,确认漏洞消失。AppScan支持“仅重新测试”之前发现的漏洞,这个功能比全量扫描有用得多。我一般会盯着开发改完,然后跑一次增量扫描,把漏洞状态从“待修复”改成“已修复”才结项。
工具就是工具。AppScan的规则库再全,也猜不到你业务里那个“user_id=1改成user_id=2就能看别人订单”的越权。它擅长的是已知模式的批量匹配,不擅长理解上下文。我见过安全工程师把AppScan当圣旨,扫完没高危就签字上线,结果被一个简单的验证码复用打穿。也见过有人嫌它误报多,干脆不用,手动测了三天漏掉一个Struts2的老漏洞。这两种都走极端。
我的用法很固定:AppScan跑两轮。第一轮快速扫,只开常见高危规则,半小时出初步结果。第二轮配好认证和URL列表,开全面规则,跑一晚上。第二天早上看报告,手动验证所有中高危,然后写一份带复现步骤和修复建议的文档。最后,把这次扫描的配置保存成模板,下次同类项目直接复用。省下来的时间,拿去测业务逻辑漏洞——那才是AppScan永远够不着的地方。