代码审计:必须要知道的注入型漏洞风险参数来源
字数 1415 2025-08-19 12:40:39

代码审计中注入型漏洞风险参数来源详解

一、代码审计概述

代码审计是通过检查源代码中的安全缺陷,发现程序存在的安全隐患或编码不规范问题,对程序源代码进行逐条检查和分析的过程。

二、注入型漏洞风险参数来源

1. Request域相关参数

1.1 常见注解

  • @RequestBody: 用于接收HTTP请求体中的数据
  • @ResponseBody: 用于将方法返回的对象写入HTTP响应体
  • @RequestParam: 用于获取请求参数
  • @PathVariable: 用于获取URL路径中的变量
  • @PathParam: JAX-RS注解,用于获取路径参数
  • @QueryParam: JAX-RS注解,用于获取查询参数

1.2 Servlet API方法

  • request.getParameter(): 获取请求参数值
  • Request.getQueryString(): 获取查询字符串
    • 示例:http://localhost/test.do?a=b&c=d&e=f 返回 a=b&c=d&e=f
  • request.getRequestURI(): 返回除去host(域名或IP)部分的路径
  • request.getRequestURL(): 返回完整路径
  • request.getContextPath(): 返回工程名部分(若工程映射为/则返回空)
  • request.getServletPath(): 返回除去host和工程名部分的路径
  • request.getScheme(): 返回协议名称(默认http)
  • request.getServerName(): 返回浏览器中显示的主机名
  • request.getServerPort(): 获取服务器端口号
  • request.getPathInfo():
    • 示例:http://localhost:8080/dwr/servlet/test/joejoe1991/a.html 返回 /joejoe1991/a.html
  • request.getInputStream(): 获取POST请求数据

2. 客户端URL相关属性

通过window.location对象可获取以下URL属性:

  • hash: 从井号(#)开始的URL(锚点)
  • host: 主机名和端口号
  • hostname: 主机名
  • href: 完整URL
  • pathname: URL路径部分
  • port: 端口号
  • protocol: 协议
  • search: 查询字符串

三、关键审计点

  1. 参数来源追踪:审计时应特别关注从上述来源获取的参数,这些往往是注入攻击的入口点

  2. 未过滤的输入:检查这些参数是否经过适当的验证和过滤

  3. 直接拼接SQL:关注这些参数是否被直接用于SQL语句拼接

  4. 动态执行代码:检查这些参数是否被用于动态执行代码(如eval等)

  5. 文件操作:检查这些参数是否被用于文件路径操作

四、防御建议

  1. 对所有来自客户端的输入进行严格验证和过滤
  2. 使用参数化查询而非字符串拼接
  3. 实施最小权限原则
  4. 对特殊字符进行转义处理
  5. 使用安全的API替代危险函数

五、总结

在代码审计过程中,注入型漏洞的风险参数主要来自请求域的各种参数获取方式,包括注解、Servlet API方法以及客户端URL属性。审计时应重点关注这些参数的处理方式,确保没有直接使用未经验证的用户输入进行敏感操作。

代码审计中注入型漏洞风险参数来源详解 一、代码审计概述 代码审计是通过检查源代码中的安全缺陷,发现程序存在的安全隐患或编码不规范问题,对程序源代码进行逐条检查和分析的过程。 二、注入型漏洞风险参数来源 1. Request域相关参数 1.1 常见注解 @RequestBody : 用于接收HTTP请求体中的数据 @ResponseBody : 用于将方法返回的对象写入HTTP响应体 @RequestParam : 用于获取请求参数 @PathVariable : 用于获取URL路径中的变量 @PathParam : JAX-RS注解,用于获取路径参数 @QueryParam : JAX-RS注解,用于获取查询参数 1.2 Servlet API方法 request.getParameter() : 获取请求参数值 Request.getQueryString() : 获取查询字符串 示例: http://localhost/test.do?a=b&c=d&e=f 返回 a=b&c=d&e=f request.getRequestURI() : 返回除去host(域名或IP)部分的路径 request.getRequestURL() : 返回完整路径 request.getContextPath() : 返回工程名部分(若工程映射为/则返回空) request.getServletPath() : 返回除去host和工程名部分的路径 request.getScheme() : 返回协议名称(默认http) request.getServerName() : 返回浏览器中显示的主机名 request.getServerPort() : 获取服务器端口号 request.getPathInfo() : 示例: http://localhost:8080/dwr/servlet/test/joejoe1991/a.html 返回 /joejoe1991/a.html request.getInputStream() : 获取POST请求数据 2. 客户端URL相关属性 通过 window.location 对象可获取以下URL属性: hash : 从井号(#)开始的URL(锚点) host : 主机名和端口号 hostname : 主机名 href : 完整URL pathname : URL路径部分 port : 端口号 protocol : 协议 search : 查询字符串 三、关键审计点 参数来源追踪 :审计时应特别关注从上述来源获取的参数,这些往往是注入攻击的入口点 未过滤的输入 :检查这些参数是否经过适当的验证和过滤 直接拼接SQL :关注这些参数是否被直接用于SQL语句拼接 动态执行代码 :检查这些参数是否被用于动态执行代码(如eval等) 文件操作 :检查这些参数是否被用于文件路径操作 四、防御建议 对所有来自客户端的输入进行严格验证和过滤 使用参数化查询而非字符串拼接 实施最小权限原则 对特殊字符进行转义处理 使用安全的API替代危险函数 五、总结 在代码审计过程中,注入型漏洞的风险参数主要来自请求域的各种参数获取方式,包括注解、Servlet API方法以及客户端URL属性。审计时应重点关注这些参数的处理方式,确保没有直接使用未经验证的用户输入进行敏感操作。