未经许可,不得转载。
文章目录

项目审计思路
1.审计第三方组件
如果该 Java 项目使用 Maven 进行依赖管理,则可以通过 pom.xml 文件分析其引用的第三方组件及版本信息。借助专业工具,可自动扫描并整理项目依赖,同时检测组件是否存在已知安全漏洞,从而提高代码审计的效率。
审计工具图文教程:【Java代码审计 | 第十七篇】组件漏洞识别工具PomEye安装使用详细教程

2.审计配置文件
在 Java 代码审计过程中,配置文件是一个关键的审计对象,攻击者可能会通过配置文件获取敏感信息或利用不安全的配置方式进行绕过实现攻击。
故需要对项目的配置文件、过滤器、拦截器等进行详细审计,以发现潜在的安全风险。
2.1审计过滤器(Filter)
过滤器 (Filter) 在 Java Web 应用中用于拦截和处理 HTTP 请求和响应,常用于身份验证、日志记录、权限控制等。审计重点包括:
1、敏感数据泄露:过滤器是否对用户输入进行了适当的清理?是否可能泄露敏感信息?
2、绕过身份验证:过滤器是否正确配置?是否可能被绕过?
3、不安全的请求参数处理:是否直接信任用户输入的数据并传递给后端处理?
审计步骤:在 web.xml 中搜索doFilter
存在 XSS 漏洞的 Filter 示例:
@WebFilter("/*")
public class XSSFilter implements Filter {
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest) request;
String username = req.getParameter("username"); // 直接获取用户输入
PrintWriter out = response.getWriter();
out.println("<html><body>");
out.println("<h1>Welcome, " + username + "</h1>"); // 未进行 XSS 过滤
out.println("</body></html>");
chain.doFilter(request, response);
}
}
问题: 代码直接将 username 参数的值拼接到 HTML 响应中,没有进行任何转义或过滤。
2.2审计配置文件(application.properties、application.yml)
Spring Boot 项目的核心配置通常存储在 application.properties 或 application.yml 文件中,审计重点包括:
1、数据库信息泄露:是否存储了明文数据库密码?是否启用了 spring.datasource.hikari.allowPoolSuspension=true 可能导致 DoS 攻击?
2、开放不安全的端口:是否对外暴露了管理接口?
3、调试模式开启:spring.devtools.restart.enabled=true 可能导致远程代码执行(RCE)。
4、日志信息泄露:日志级别是否为 DEBUG 或 TRACE,可能导致敏感信息泄露。
审计步骤:查看 application.properties 或 application.yml 文件
不安全的 application.properties 示例:
spring.datasource.url=jdbc:mysql://localhost:3306/mydb
spring.datasource.username=root
spring.datasource.password=123456
问题: 数据库密码以明文存储,可能被攻击者获取。应使用环境变量或加密存储(如 Jasypt)保护敏感信息。
2.3审计Config类
Spring Boot 中的 @Configuration 类通常用于定义 Bean 和应用程序配置,审计重点包括:
1、是否对外暴露了不安全的 Bean(如 DataSource、RestTemplate)?
2、是否存在 @Value 注解直接读取了敏感配置?
3、是否存在 @Bean 方法创建的对象可能被攻击者利用?
审计步骤:搜索WebMvcConfigurer
不安全的 Config 类示例:
@Configuration
public class AppConfig {
@Bean
public RestTemplate restTemplate() {
return new RestTemplate(); // 未限制 URL 访问范围,可能被 SSRF 利用
}
}
问题: RestTemplate 未进行 URL 访问控制,可能导致 SSRF(服务器端请求伪造) 攻击。
2.4审计拦截器(Interceptor)
注意:
1、过滤器(Filter) 需要在 web.xml 中进行配置,适用于所有 Java Web 应用,可用于请求过滤、编码处理、安全检查等。
2、拦截器(Interceptor) 需要在 springmvc.xml 配置文件中定义,仅适用于 Spring MVC,通常用于权限控制、日志记录、全局数据处理等。
拦截器(HandlerInterceptor)用于在请求到达 Controller 之前进行处理,审计重点包括:
1、是否正确验证身份和权限?
2、是否对用户输入进行了必要的安全检查?
3、是否存储了用户的敏感信息?
审计步骤:进入 interceptor 目录(一般情况下为此目录)
不安全的 Interceptor 示例:
public class AuthInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
String userId = request.getHeader("User-ID");
if (userId != null) {
User user = userService.getUserById(userId); // 直接信任请求头中的 User-ID
request.setAttribute("user", user);
}
return true;
}
}
问题: 直接从请求头获取 User-ID,可能导致身份伪造,应使用 JWT或Session进行身份验证。
3.正向排查
审计步骤:
1、搜索 @(.*?)Mapping\( —— 通过正则匹配 @RequestMapping、@GetMapping、@PostMapping 等注解,定位所有 Controller 层的接口。
2、分析外部可控参数 —— 检查 @RequestParam、@PathVariable、@RequestBody 等方式接收的参数,确定哪些参数是外部可控的。
3、跟踪参数流向 —— 确定这些参数是否传递到 危险方法(如 `SQL 执行、文件操作、反序列化、EL 表达式解析等)。
4、检查安全措施 —— 分析代码是否对用户输入进行了 参数校验、过滤或转义,确保没有安全风险。
4.逆向排查
审计步骤:
1、寻找危险函数 —— 从已知的危险操作入手,例如:
- SQL 注入: executeQuery()、prepareStatement()
- XSS: response.getWriter().write()
- 文件上传: FileOutputStream、Files.write()
- 远程调用: Runtime.exec()、ProcessBuilder
- 反序列化: ObjectInputStream.readObject()
- SpEL 表达式解析: ExpressionParser.parseExpression()
2、跟踪参数来源 —— 追踪传入危险函数的参数,检查它是否来源于外部可控输入(如 request.getParameter()、JSON 解析 等)。
3、验证安全措施 —— 判断是否对输入进行了 严格的参数校验和过滤,如:
- SQL 注入:是否使用 预编译 SQL 语句(PreparedStatement)?
- XSS 攻击:是否进行 HTML 转义(StringEscapeUtils.escapeHtml4())?
- 文件操作:是否限制 文件路径,防止目录遍历?
- 反序列化:是否使用 安全反序列化(如 ObjectInputStreamFilter)?
5万+



被折叠的 条评论
为什么被折叠?



