Java代码审计-XSS审计
字数 1667 2025-08-10 22:08:13
Java代码审计-XSS漏洞审计与防御
一、XSS漏洞简介
XSS(Cross Site Scripting)即跨站脚本攻击,是一种针对网站应用程序的安全漏洞攻击技术,属于代码注入的一种。攻击者在网页中嵌入客户端脚本(通常是JavaScript编写的恶意代码),当Web应用未对用户输入或输出进行适当过滤或转义时,这些恶意代码会被执行。
XSS攻击特征
- 攻击者向Web页面注入恶意脚本代码
- 恶意脚本在用户浏览器中执行
- 可用于窃取用户信息、会话劫持、网络钓鱼等
XSS攻击类型
- 反射型XSS:非持久型,通过URL参数直接注入
- 存储型XSS:持久型,恶意代码存储在服务器端
- 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:用户面板便签处XSS
- 漏洞表现:用户面板便签处可注入恶意脚本
- 代码追踪:
- 定位到
UserpanelController - 跟进
UserDao数据库操作 - 发现全局无XSS过滤器
- 定位到
- 漏洞代码:
// 仅进行非空判断,无过滤操作 if(!StringUtils.isEmpty(writep)){ user.setUserpan(writep); }
案例2:文件管理-新建文件夹处XSS
- 漏洞表现:文件名输入可触发XSS
- 代码追踪:
- 搜索表单action
createpath - 定位
TypeSysController文件
- 搜索表单action
- 漏洞代码:
// 无任何校验和过滤,直接保存 return "redirect:/filemanage";
案例3:系统管理-类型管理处XSS
- 漏洞表现:模板名称和类型字段可触发XSS
- 代码追踪:
- 搜索路径
typecheck - 检查保存逻辑
- 搜索路径
- 漏洞代码:
// 仅校验状态和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.URLdocument.locationdocument.refererdocument.form
常见输出点
evaldocument.writedocument.InnerHTMLdocument.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
六、审计总结
审计关键点
- 识别输入输出点:找到所有用户可控数据的入口和展示点
- 上下文分析:检查输入输出点的上下文环境
- 防御措施检查:确认是否实施了过滤、扰乱或编码
高危代码模式
- 直接使用
request.getParameter()获取参数并输出 - 使用
out.println()直接输出未处理内容 - 使用
eval()等危险函数处理用户输入 - 直接操作DOM元素内容而不转义
最佳实践
- 对所有用户输入进行严格验证和过滤
- 对所有输出到页面的内容进行适当转义
- 使用安全编码框架和库
- 实施内容安全策略(CSP)
- 定期进行安全代码审计和渗透测试