java代码审计java-sec-code XSS,任意文件读取
字数 1393 2025-08-19 12:42:40
Java代码审计:XSS与任意文件读取漏洞分析
1. XSS漏洞分析
1.1 反射型XSS
漏洞代码特征:
@RequestMapping("/reflect")
@ResponseBody
public String reflect(String xss) {
return xss;
}
漏洞原理:
@RequestMapping("/reflect")注解将HTTP请求路由到该方法@ResponseBody注解直接将方法返回值作为HTTP响应体返回- 未对用户输入的
xss参数进行任何过滤或编码处理 - 攻击者可构造恶意脚本作为参数值,服务器会原样返回给客户端执行
修复建议:
- 对输出内容进行HTML实体编码
- 使用安全的响应头如
Content-Type: text/plain - 使用框架提供的XSS防护机制
1.2 存储型XSS
漏洞代码特征:
@RequestMapping("/store")
public String store(String xss, HttpServletResponse response) {
Cookie cookie = new Cookie("xss", xss);
response.addCookie(cookie);
return "redirect:/show";
}
@RequestMapping("/show")
@ResponseBody
public String show(@CookieValue("xss") String xss) {
return xss;
}
漏洞原理:
/store端点将用户输入的xss参数值存储在Cookie中/show端点通过@CookieValue注解读取Cookie值并直接返回- 恶意脚本被持久化存储在Cookie中,每次访问都会执行
修复建议:
- 对存储在Cookie中的值进行编码处理
- 设置Cookie的
HttpOnly属性防止JavaScript访问 - 对输出内容进行适当的编码
1.3 安全编码示例
安全处理方式:
- 使用HTML实体编码转换特殊字符(如
&转义为&) - 使用框架提供的XSS过滤器
- 设置安全的Content-Type响应头
2. 任意文件读取漏洞
2.1 基本文件读取漏洞
漏洞代码特征:
@RequestMapping("/getImage")
@ResponseBody
public String getImage(String filepath) {
return getImgBase64(filepath);
}
private String getImgBase64(String imgFile) {
File f = new File(imgFile);
if (f.exists() && !f.isDirectory()) {
byte[] data = Files.readAllBytes(Paths.get(imgFile));
return new String(Base64.encodeBase64(data));
}
return "";
}
漏洞原理:
- 直接使用用户提供的
filepath参数构造文件路径 - 未对路径进行任何安全检查
- 攻击者可通过
../目录遍历或绝对路径读取任意文件 - 文件内容经Base64编码后返回,可被解码获取原始内容
利用方式:
- 读取系统敏感文件:
/etc/passwd、C:\Windows\win.ini - 读取应用配置文件:
WEB-INF/web.xml - 读取源代码文件
修复建议:
- 限制文件读取目录为指定安全目录
- 检查路径是否包含
../等目录遍历符号 - 禁止绝对路径访问
- 使用白名单限制可访问文件类型
2.2 不完善的安全过滤
部分修复代码:
@RequestMapping("/getImageSec")
@ResponseBody
public String getImageSec(String filepath) {
if (SecurityUtil.pathFilter(filepath) == null) {
return "";
}
return getImgBase64(filepath);
}
过滤逻辑分析:
public static String pathFilter(String temp) {
// 处理多层URL编码
while(temp.indexOf('%') >= 0) {
temp = URLDecoder.decode(temp, "UTF-8");
}
// 检查路径是否包含..或以/开头
if(temp.contains("..") || temp.startsWith("/")) {
return null;
}
return temp;
}
过滤缺陷:
- 仅针对Windows系统(检查
/而非\) - 多层URL解码可能导致绕过
- 未考虑其他特殊字符和编码方式
- 未限制最终文件路径必须在安全目录下
改进建议:
- 使用规范化路径检查(
getCanonicalPath()) - 同时检查
/和\路径分隔符 - 设置严格的根目录限制
- 使用白名单文件扩展名检查
3. 漏洞检测与防御最佳实践
通用安全原则
- 输入验证:对所有用户输入进行严格验证
- 输出编码:根据输出上下文进行适当的编码
- 最小权限:使用最低必要权限访问资源
- 默认拒绝:采用白名单而非黑名单机制
代码审计要点
- 查找未过滤的用户输入直接输出点
- 检查文件操作相关的用户输入处理
- 验证所有安全过滤逻辑是否可被绕过
- 检查框架安全配置是否启用
工具辅助
- 使用静态代码分析工具(如Fortify、Checkmarx)
- 进行动态渗透测试验证漏洞
- 使用交互式应用安全测试(IAST)工具
4. 总结
本文分析了Java Web应用中常见的XSS和任意文件读取漏洞,通过实际代码示例展示了漏洞原理、利用方式及修复方案。开发人员应深刻理解这些安全问题的本质,在编码过程中贯彻安全开发规范,避免类似漏洞的产生。