按页面拆分网站漏洞检测问题,核心是先把“站点整体有漏洞”拆成“某一个URL或某一类页面上出现了可复现的异常”,再围绕这个页面收集请求、响应、参数和权限证据。不要一上来就扫描全站,否则报告里会混入大量无法定位的告警。正确顺序是:选定一个具体页面,记录它的正常行为,再对比异常行为,最后判断问题出在输入处理、输出编码、访问控制还是配置层面。
同一个站点里,不同页面的漏洞成因差别很大。按页面拆分时,先给页面分类,比按漏洞名称分类更有效。常见分类包括:
id、page、keyword的页面,重点看参数是否进入数据库查询、命令执行或模板渲染。分类之后,每个页面只回答一个问题:这个页面在什么输入、什么身份、什么请求方法下,产生了不该产生的结果。这样拆分,后续复查才能落到同一个页面上。
在判断漏洞之前,先记录这个页面的正常表现。需要收集的证据包括:
例如,假设某页面为/product?Id=1001,正常返回一个商品详情。把Id改为1001'后,如果页面返回数据库报错,这只能说明输入可能进入了数据库查询,不能直接断定存在SQL注入。还需要用布尔条件、时间延迟或报错差异进一步验证。这里要区分“可能原因”和“已经定位的原因”:报错是现象,注入是待验证结论。
按页面拆分后,判断漏洞类型要看证据落在哪一层:
判断时不要只看扫描器告警等级。告警只能提示“这里可能有问题”,不能替代对单个页面的请求与响应分析。第三方估算流量、搜索引擎报告与站内统计口径不同,也不能用来证明某个页面是否存在漏洞。
确认问题后,处理范围应尽量限制在受影响页面及其共用组件。可执行步骤是:
复查的通过标准不是“扫描器不再报”,而是原先可复现的异常行为无法再复现,并且正常功能没有受到影响。如果修复后页面返回统一错误页,还要确认错误页没有泄露堆栈、路径或数据库信息。
第一,把全站扫描结果直接当成页面级结论。第二,只记录漏洞名称,不记录URL、参数和身份。第三,把前端校验当作安全边界。第四,在未确认影响范围前批量修改,导致无法判断哪次改动生效。第五,把一次请求的异常当成稳定漏洞,没有做重复验证。
更稳妥的做法是维护一张页面级清单:每个页面一行,列出URL、页面类型、测试参数、身份、观察到的异常、初步判断、处理动作和复查结果。这样既能定位问题,也能避免不同页面之间互相干扰。
下一步,选一个已经出现异常的具体页面,按上面的请求、响应、身份和参数四项补齐证据,再决定它属于哪类漏洞。没有这一步,网站漏洞检测很容易停留在告警列表,而无法形成可处理的页面级结论。