
代码审计
代码审计的核心漏洞集中在输入验证缺失、权限控制失效、危险函数滥用三大类,高效排查需结合自动化扫描与人工深度验证,优先聚焦高风险模块(如认证、数据操作功能)。以下结合实战方法论,分漏洞类型与审计策略解析:
核心表现:
URL认证绕过:通过/;/admin、//admin等特殊路径绕过拦截器逻辑。
水平越权:普通用户通过修改ID访问他人数据(如/user/delete?id=1001未校验权限)。
垂直越权:低权限用户访问高权限接口(如普通用户调用/admin/exportData)。
关键特征:
拦截器/过滤器中仅校验路径前缀(如uri.startsWith("/admin")),未处理路径规范化差异。
核心表现:
Fastjson/Jackson组件:通过@type字段加载恶意类触发RCE。
Apache Commons Collections链:利用InvokerTransformer等构造执行链。
关键特征:
代码中存在ObjectInputStream.readObject()或未禁用autoTypeSupport 的JSON解析配置。
核心表现:
动态拼接SQL:MyBatis中使用${}而非#{}占位符。
未校验字段名:排序参数直接拼接(如ORDER BY ${orderField})。
关键特征:
用户输入未经白名单校验直接嵌入SQL语句,缺少参数化查询。
核心表现:
并发缺陷:积分兑换、库存扣减等操作未加锁导致超发。
流程绕过:支付流程中跳过风控校验步骤。
关键特征:
人工审计易发现,自动化工具漏报率高(如未校验“新旧密码是否一致”)。
高危模块优先:
聚焦认证授权、数据操作、文件管理三大模块(占漏洞总量70%以上)。
关键路径标记:
用IDE标记外部接口(如@RequestMapping注解方法)和危险函数(如Runtime.exec()),快速定位攻击面。
工具选择:
基础漏洞:用Semgrep匹配高危代码模式(如sql = "SELECT * FROM user WHERE id=" + input)。
深度分析:CodeQL编写自定义规则,追踪用户输入到危险函数的完整数据流。
关键操作:
扫描后人工过滤误报,重点关注高危漏洞标记为“可利用” 的结果(如SQL注入需验证是否可控输入)。
数据流追踪法:
从用户输入点(如@RequestParam String id)逆向追踪至执行点,确认:
是否经过有效过滤(如StringUtils.filterSQL(id))。
是否存在多层调用绕过(如参数经中间函数处理后仍被拼接)。
业务逻辑验证:
针对逻辑漏洞,模拟异常业务场景(如高并发请求积分兑换),验证是否存在竞态条件。
未授权访问:
构造特殊URL路径(如/./admin、/admin%20)测试认证绕过,检查拦截器是否处理路径规范化。
反序列化漏洞:
使用ysoserial生成测试payload,验证是否触发DNS请求或命令执行(避免直接执行危险命令)。
SQL注入:
通过时间盲注(如1' AND SLEEP(5)--)验证漏洞可利用性,避免破坏测试数据。
误报处理:
工具报告的漏洞需人工验证上下文(如eval()在沙箱环境中可能安全)。
漏报补救:
对逻辑漏洞,结合业务流程图通读关键模块(如支付回调函数),而非仅依赖关键字搜索。
关键输入点:
优先审计外部接口参数(如API请求体、URL路径),忽略内部调用参数(如工具生成的辅助方法)。
高危函数链:
从Runtime.exec()出发,逆向追踪参数来源,确认是否来自用户输入(而非硬编码字符串)。
精准定位:
报告需明确漏洞触发条件(如“当order参数含%20时绕过校验”)。
修复方案分层:
紧急缓解:输入白名单过滤(如ORDER BY仅允许id,name,age)。
根本修复:改用预编译查询或重构权限校验逻辑。
代码审计的核心效率在于精准定位攻击面,而非全量扫描。优先通过接口排查法锁定高危模块,再结合危险方法溯源法验证漏洞可利用性。对SQL注入、未授权访问等高频漏洞,自动化工具可覆盖80%基础问题;但对逻辑漏洞和复杂利用链,必须人工验证数据流与业务上下文。企业若仅依赖工具报告,将遗漏30%以上真实风险,而聚焦关键路径的人工深度验证可将漏洞检出率提升至95%以上。
标签:代码审计、漏洞扫描