Java审计之XSS篇
字数 1385 2025-08-18 17:33:19

Java审计之XSS漏洞分析与防御

0x00 XSS漏洞概述

XSS(跨站脚本攻击)漏洞产生过程:后台未对用户输入进行检查或过滤,直接把用户输入返回至前端,导致JavaScript代码在客户端任意执行。

在Java中,XSS通常表现为:

  • 接收未经过滤的参数共享到request域中
  • 在JSP页面里使用EL表达式直接输出这些参数

0x01 Java中XSS漏洞代码分析

基础示例代码

Servlet代码(xssServlet.java):

@WebServlet("/demo")
public class xssServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doGet(request,response);
    }
    
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html"); // 设置响应类型
        String content = request.getParameter("content"); // 获取content传参数据
        request.setAttribute("content", content); // content共享到request域
        request.getRequestDispatcher("/WEB-INF/pages/xss.jsp").forward(request, response); // 转发到xss.jsp页面
    }
}

JSP页面(xss.jsp):

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
    ${requestScope.content}
</head>
<body></body>
</html>

漏洞验证

访问URL: http://localhost:8080/untitled3_war_exploded/demo?content=<script>alert("xss")</script>

审计要点

  1. 参数是否可控
  2. 传入的参数是否会被过滤后共享到request域中
  3. 如果在可控且不被过滤的情况下,很可能存在XSS漏洞

0x02 XSS防御策略

使用ESAPI进行防御

ESAPI介绍
企业安全API(ESAPI)是OWASP项目,为Web平台创建简单强大的安全控件,可以应付大部分Web攻击漏洞。

Maven依赖:

<dependency>
    <groupId>org.owasp.esapi</groupId>
    <artifactId>esapi</artifactId>
    <version>2.2.1.1</version>
</dependency>

防御代码示例:

@WebServlet("/demo")
class xssServlet extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html");
        String content = request.getParameter("content");
        String s = ESAPI.encoder().encodeForJavaScript(content); // 进行实体编码
        request.setAttribute("content", s);
        request.getRequestDispatcher("/WEB-INF/pages/xss.jsp").forward(request, response);
    }
}

0x03 setAttribute中的XSS审计

审计步骤

  1. 全局搜索request.setAttribute方法
  2. 查看传值类型,跟踪到实体类
  3. 关注实体类中String类型的变量
  4. 跟踪调用链,查看是否有过滤
  5. 追溯DAO层查看是否存入数据库

典型漏洞模式

// Controller
String userInput = request.getParameter("input");
request.setAttribute("output", userInput); // 未过滤直接共享到request域

// JSP
${output} // 直接输出

0x04 ModelAndView中的XSS审计

ModelAndView基础

ModelAndView是Spring MVC提供的模型和视图封装类,内部使用Map实现,视图解析器会将model中的每个元素通过request.setAttribute(name, value)添加到request域中。

常用方法:

  1. addObject(String attributeName, Object attributeValue)
  2. getModel().put("name", "value")

审计步骤

  1. 全局搜索new ModelAndView
  2. 查看调用的方法,特别是addObject
  3. 跟踪共享的值来源
  4. 检查是否有过滤处理

典型漏洞模式

ModelAndView mav = new ModelAndView("page");
mav.addObject("data", userInput); // 未过滤直接添加

0x05 存储型XSS审计实战

审计流程

  1. 定位Controller中接收用户输入的方法
  2. 跟踪Service层处理逻辑
  3. 检查DAO层数据操作
  4. 确认前端展示方式

关键点

  • 关注所有String类型的字段
  • 检查数据流:输入→处理→存储→输出
  • 确认每个环节是否有过滤或编码

0x06 参考工具与技术

  1. ESAPI: OWASP提供的企业安全API
  2. Lombok: 简化Java代码的插件
  3. MyBatis: 关注XML映射文件中的SQL语句
  4. JSP EL表达式: ${}直接输出可能存在风险

0x07 总结

Java审计中XSS漏洞的关键点:

  1. 输入点:request.getParameter()等获取用户输入的方法
  2. 处理过程:是否经过过滤或编码
  3. 输出点:JSP中的EL表达式、JSTL标签等
  4. 数据流:从输入到输出的完整路径

防御建议:

  1. 对所有用户输入进行验证和过滤
  2. 输出时进行HTML编码
  3. 使用ESAPI等安全框架
  4. 实施内容安全策略(CSP)
Java审计之XSS漏洞分析与防御 0x00 XSS漏洞概述 XSS(跨站脚本攻击)漏洞产生过程:后台未对用户输入进行检查或过滤,直接把用户输入返回至前端,导致JavaScript代码在客户端任意执行。 在Java中,XSS通常表现为: 接收未经过滤的参数共享到request域中 在JSP页面里使用EL表达式直接输出这些参数 0x01 Java中XSS漏洞代码分析 基础示例代码 Servlet代码(xssServlet.java): JSP页面(xss.jsp): 漏洞验证 访问URL: http://localhost:8080/untitled3_war_exploded/demo?content=<script>alert("xss")</script> 审计要点 参数是否可控 传入的参数是否会被过滤后共享到request域中 如果在可控且不被过滤的情况下,很可能存在XSS漏洞 0x02 XSS防御策略 使用ESAPI进行防御 ESAPI介绍 : 企业安全API(ESAPI)是OWASP项目,为Web平台创建简单强大的安全控件,可以应付大部分Web攻击漏洞。 Maven依赖 : 防御代码示例 : 0x03 setAttribute中的XSS审计 审计步骤 全局搜索 request.setAttribute 方法 查看传值类型,跟踪到实体类 关注实体类中String类型的变量 跟踪调用链,查看是否有过滤 追溯DAO层查看是否存入数据库 典型漏洞模式 0x04 ModelAndView中的XSS审计 ModelAndView基础 ModelAndView是Spring MVC提供的模型和视图封装类,内部使用Map实现,视图解析器会将model中的每个元素通过 request.setAttribute(name, value) 添加到request域中。 常用方法 : addObject(String attributeName, Object attributeValue) getModel().put("name", "value") 审计步骤 全局搜索 new ModelAndView 查看调用的方法,特别是 addObject 跟踪共享的值来源 检查是否有过滤处理 典型漏洞模式 0x05 存储型XSS审计实战 审计流程 定位Controller中接收用户输入的方法 跟踪Service层处理逻辑 检查DAO层数据操作 确认前端展示方式 关键点 关注所有String类型的字段 检查数据流:输入→处理→存储→输出 确认每个环节是否有过滤或编码 0x06 参考工具与技术 ESAPI : OWASP提供的企业安全API Lombok : 简化Java代码的插件 MyBatis : 关注XML映射文件中的SQL语句 JSP EL表达式 : ${} 直接输出可能存在风险 0x07 总结 Java审计中XSS漏洞的关键点: 输入点: request.getParameter() 等获取用户输入的方法 处理过程:是否经过过滤或编码 输出点:JSP中的EL表达式、JSTL标签等 数据流:从输入到输出的完整路径 防御建议: 对所有用户输入进行验证和过滤 输出时进行HTML编码 使用ESAPI等安全框架 实施内容安全策略(CSP)