某甲方安全主管跟我抱怨过一件事:他们买了漏洞扫描系统,渗透扫每个季度都出报告,和漏结果第三方测评机构来做渗透测试时,区别还是渗透扫挖出了好几个高危漏洞。他问我,和漏这俩到底差在哪?区别我说,漏扫是渗透扫体检报告,渗透是和漏临床手术。体检能告诉你血脂偏高,区别但不会告诉你血管里那根斑块哪天会脱落。渗透扫
漏扫干的和漏事,本质上是区别“已知问题的排查”。它拿着一个庞大的渗透扫漏洞特征库,像查字典一样去比对系统里的和漏版本号、配置项、区别开放端口。你装了个Apache 2.4.49,库里记录了这个版本有路径穿越漏洞,它就给你标红。这个逻辑决定了它的两个硬边界:第一,它看不到库之外的东西;第二,它验证不了漏洞的真实可利用性。
有个特别经典的案例。2017年Struts2爆出远程代码执行漏洞,当时所有漏扫设备都在疯狂报警。但真正去渗透测试的人会发现,很多系统虽然存在漏洞版本,却因为部署了Web应用防火墙,或者网络层做了隔离,实际根本打不进去。漏扫不管这些,它只告诉你“这里可能有问题”。反过来,漏扫没报的,不代表安全。业务逻辑漏洞就是个典型——比如你修改订单金额参数,漏扫完全无感,因为它不理解业务。
渗透测试的逻辑就完全不同了。它模拟的是攻击者的真实行为路径:信息收集、漏洞探测、利用尝试、权限提升、横向移动。这活儿没有标准答案,全靠人的经验和对目标系统的理解。同样是SQL注入,漏扫发现参数点就完事了,渗透人员会尝试用联合查询、时间盲注、堆叠注入去拿数据库权限,然后看看能不能拖出用户表。
我见过一次真实的渗透测试,测试人员花了两天时间在目标系统的找回密码功能里折腾,最后通过验证码逻辑缺陷,直接重置了管理员的账号密码。这种漏洞,任何漏扫设备都不可能发现,因为它属于业务设计层面的缺陷,而不是某个软件组件的问题。
所以两者的关系不是替代,而是互补。漏扫适合高频次、大范围的日常巡检,便宜、快,能帮你兜住那些已知的、明显的技术漏洞。渗透测试适合关键节点、重大项目上线前,或者当你怀疑系统已经被盯上的时候,花点钱请专业的人来模拟一次真实攻击。成本差着一个数量级,但产出也完全不同。
回到开头那个主管,我给他的建议是:把漏扫当成周报,每周跑一遍,盯着增量变化;渗透当成季度体检,每次换不同的测试思路,别让同一批人反复测同一个系统。后来他们确实这么干了,第二年等保测评的时候,问题少了大半。
说到底,漏扫回答的是“有没有”,渗透回答的是“能不能”。你以为自己在做安全,其实很多人只是买了台扫描器,然后假装做了安全。
