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>
审计要点
- 参数是否可控
- 传入的参数是否会被过滤后共享到request域中
- 如果在可控且不被过滤的情况下,很可能存在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审计
审计步骤
- 全局搜索
request.setAttribute方法 - 查看传值类型,跟踪到实体类
- 关注实体类中String类型的变量
- 跟踪调用链,查看是否有过滤
- 追溯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域中。
常用方法:
addObject(String attributeName, Object attributeValue)getModel().put("name", "value")
审计步骤
- 全局搜索
new ModelAndView - 查看调用的方法,特别是
addObject - 跟踪共享的值来源
- 检查是否有过滤处理
典型漏洞模式
ModelAndView mav = new ModelAndView("page");
mav.addObject("data", userInput); // 未过滤直接添加
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)