Java代码审计-XSS审计
字数 1667 2025-08-10 22:08:13

Java代码审计-XSS漏洞审计与防御

一、XSS漏洞简介

XSS(Cross Site Scripting)即跨站脚本攻击,是一种针对网站应用程序的安全漏洞攻击技术,属于代码注入的一种。攻击者在网页中嵌入客户端脚本(通常是JavaScript编写的恶意代码),当Web应用未对用户输入或输出进行适当过滤或转义时,这些恶意代码会被执行。

XSS攻击特征

  • 攻击者向Web页面注入恶意脚本代码
  • 恶意脚本在用户浏览器中执行
  • 可用于窃取用户信息、会话劫持、网络钓鱼等

XSS攻击类型

  1. 反射型XSS:非持久型,通过URL参数直接注入
  2. 存储型XSS:持久型,恶意代码存储在服务器端
  3. DOM型XSS:完全在客户端执行,不经过服务器

二、反射型XSS审计

反射型XSS特点

  • 通过外部输入直接在浏览器端触发
  • 恶意数据常包含在URL链接中
  • 需要用户主动访问恶意链接

审计示例代码

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<%
    // 从请求中获得参数
    String name = request.getParameter("name");
    String studentId = request.getParameter("sid");
    
    // 直接输出未过滤的参数
    out.println("name = " + name);
    out.println("studentId = " + studentId);
%>
</body>
</html>

漏洞分析

  • 直接从HttpServletRequest获取参数
  • 未对输入输出进行过滤、扰乱或编码
  • 直接使用out.println()输出未处理的内容

攻击示例

http://localhost:8080/XSS-demo/reflective-xss.jsp?name=<script>alert(/xss/);</script>&sid=111

三、存储型XSS审计

存储型XSS特点

  • 恶意代码存储在服务器(数据库或文件)
  • 攻击行为会持续存在
  • 输入点和输出点可能不在同一业务流中

审计策略

  1. 黑白盒结合审计
  2. 通过功能、接口名、表名、字段名搜索
  3. 寻找"输入点"与"输出点"

实际案例审计

案例1:用户面板便签处XSS

  1. 漏洞表现:用户面板便签处可注入恶意脚本
  2. 代码追踪
    • 定位到UserpanelController
    • 跟进UserDao数据库操作
    • 发现全局无XSS过滤器
  3. 漏洞代码
    // 仅进行非空判断,无过滤操作
    if(!StringUtils.isEmpty(writep)){
        user.setUserpan(writep);
    }
    

案例2:文件管理-新建文件夹处XSS

  1. 漏洞表现:文件名输入可触发XSS
  2. 代码追踪
    • 搜索表单actioncreatepath
    • 定位TypeSysController文件
  3. 漏洞代码
    // 无任何校验和过滤,直接保存
    return "redirect:/filemanage";
    

案例3:系统管理-类型管理处XSS

  1. 漏洞表现:模板名称和类型字段可触发XSS
  2. 代码追踪
    • 搜索路径typecheck
    • 检查保存逻辑
  3. 漏洞代码
    // 仅校验状态和session,无防护措施
    if(status){
        if(session.getAttribute("type") != null){
            // 直接保存
        }
    }
    

四、DOM型XSS审计

DOM型XSS特点

  • 基于Document Object Model
  • 完全在客户端处理,不经过服务器
  • 由不可控的危险数据传入有缺陷的JS代码引起

审计示例代码

<script>
    var pos = document.URL.indexOf("#")+1;
    var name = document.URL.substring(pos, document.URL.length);
    document.write(name);
    eval("var a = " + name);
</script>

常见输入点

  • document.URL
  • document.location
  • document.referer
  • document.form

常见输出点

  • eval
  • document.write
  • document.InnerHTML
  • document.OuterHTML

攻击示例

http://localhost:8080/xss-demo/dom-xss.jsp#1;alert(/safedog/)

五、XSS漏洞修复方法

1. 输入过滤

  • 使用Java过滤器filter
  • 使用Spring参数校验注解

2. 输出转义

  • 使用org.springframework.web.util.HtmlUtils
  • 使用commons-lang-2.5.jar进行HTML标签及转义字符转换
  • 转义特殊字符:', ", <>, /, :, &, #

3. JS框架防护

  • 启用Angular JS等框架的XSS防护功能

4. 标签属性黑白名单

  • 使用正则表达式匹配
  • 不在白名单的直接拦截而非替换为空

5. 设置HttpOnly

  • 防止XSS后的Cookie劫持攻击
  • 阻止客户端脚本访问Cookie

六、审计总结

审计关键点

  1. 识别输入输出点:找到所有用户可控数据的入口和展示点
  2. 上下文分析:检查输入输出点的上下文环境
  3. 防御措施检查:确认是否实施了过滤、扰乱或编码

高危代码模式

  • 直接使用request.getParameter()获取参数并输出
  • 使用out.println()直接输出未处理内容
  • 使用eval()等危险函数处理用户输入
  • 直接操作DOM元素内容而不转义

最佳实践

  1. 对所有用户输入进行严格验证和过滤
  2. 对所有输出到页面的内容进行适当转义
  3. 使用安全编码框架和库
  4. 实施内容安全策略(CSP)
  5. 定期进行安全代码审计和渗透测试
Java代码审计-XSS漏洞审计与防御 一、XSS漏洞简介 XSS(Cross Site Scripting)即跨站脚本攻击,是一种针对网站应用程序的安全漏洞攻击技术,属于代码注入的一种。攻击者在网页中嵌入客户端脚本(通常是JavaScript编写的恶意代码),当Web应用未对用户输入或输出进行适当过滤或转义时,这些恶意代码会被执行。 XSS攻击特征 攻击者向Web页面注入恶意脚本代码 恶意脚本在用户浏览器中执行 可用于窃取用户信息、会话劫持、网络钓鱼等 XSS攻击类型 反射型XSS :非持久型,通过URL参数直接注入 存储型XSS :持久型,恶意代码存储在服务器端 DOM型XSS :完全在客户端执行,不经过服务器 二、反射型XSS审计 反射型XSS特点 通过外部输入直接在浏览器端触发 恶意数据常包含在URL链接中 需要用户主动访问恶意链接 审计示例代码 漏洞分析 直接从 HttpServletRequest 获取参数 未对输入输出进行过滤、扰乱或编码 直接使用 out.println() 输出未处理的内容 攻击示例 三、存储型XSS审计 存储型XSS特点 恶意代码存储在服务器(数据库或文件) 攻击行为会持续存在 输入点和输出点可能不在同一业务流中 审计策略 黑白盒结合审计 通过功能、接口名、表名、字段名搜索 寻找"输入点"与"输出点" 实际案例审计 案例1:用户面板便签处XSS 漏洞表现 :用户面板便签处可注入恶意脚本 代码追踪 : 定位到 UserpanelController 跟进 UserDao 数据库操作 发现全局无XSS过滤器 漏洞代码 : 案例2:文件管理-新建文件夹处XSS 漏洞表现 :文件名输入可触发XSS 代码追踪 : 搜索表单action createpath 定位 TypeSysController 文件 漏洞代码 : 案例3:系统管理-类型管理处XSS 漏洞表现 :模板名称和类型字段可触发XSS 代码追踪 : 搜索路径 typecheck 检查保存逻辑 漏洞代码 : 四、DOM型XSS审计 DOM型XSS特点 基于Document Object Model 完全在客户端处理,不经过服务器 由不可控的危险数据传入有缺陷的JS代码引起 审计示例代码 常见输入点 document.URL document.location document.referer document.form 常见输出点 eval document.write document.InnerHTML document.OuterHTML 攻击示例 五、XSS漏洞修复方法 1. 输入过滤 使用Java过滤器 filter 使用Spring参数校验注解 2. 输出转义 使用 org.springframework.web.util.HtmlUtils 使用 commons-lang-2.5.jar 进行HTML标签及转义字符转换 转义特殊字符: ' , " , <> , / , : , & , # 3. JS框架防护 启用Angular JS等框架的XSS防护功能 4. 标签属性黑白名单 使用正则表达式匹配 不在白名单的直接拦截而非替换为空 5. 设置HttpOnly 防止XSS后的Cookie劫持攻击 阻止客户端脚本访问Cookie 六、审计总结 审计关键点 识别输入输出点 :找到所有用户可控数据的入口和展示点 上下文分析 :检查输入输出点的上下文环境 防御措施检查 :确认是否实施了过滤、扰乱或编码 高危代码模式 直接使用 request.getParameter() 获取参数并输出 使用 out.println() 直接输出未处理内容 使用 eval() 等危险函数处理用户输入 直接操作DOM元素内容而不转义 最佳实践 对所有用户输入进行严格验证和过滤 对所有输出到页面的内容进行适当转义 使用安全编码框架和库 实施内容安全策略(CSP) 定期进行安全代码审计和渗透测试