当前位置: 首页 > news >正文

【Java代码审计 | 第九篇】文件写入漏洞成因及防范

未经许可,不得转载。

文章目录

    • 漏洞代码
    • 防范措施

在这里插入图片描述

文件写入功能不同于上文的文件下载、读取、删除功能。

漏洞代码

String filename = request.getParameter("filename");  // 获取文件名
String content = request.getParameter("content");   // 获取文件内容

File file = new File(filename);  // 创建文件对象
try (FileWriter writer = new FileWriter(file)) {
    writer.write(content);  // 写入文件内容
    response.getWriter().println("文件写入成功");
} catch (IOException e) {
    response.getWriter().println("文件写入失败");
}

漏洞分析:
1、如果文件内容被直接写入 HTML 文件且未进行转义,攻击者可以注入恶意脚本(如 <script>alert('XSS')</script>),导致 XSS 攻击。
2、如果文件名未经过滤,攻击者可以通过构造恶意路径(如 ../../etc/passwd)覆盖系统文件。
3、如果文件内容未经过滤,攻击者可以写入恶意代码(如 JSP 脚本、SQL 语句等),导致服务器被攻击。

防范措施

1、对文件内容进行 HTML 编码

import org.apache.commons.text.StringEscapeUtils;

String content = request.getParameter("content");  // 获取文件内容
content = StringEscapeUtils.escapeHtml4(content);  // 对内容进行 HTML 编码

try (FileWriter writer = new FileWriter(file)) {
    writer.write(content);  // 写入编码后的内容
} catch (IOException e) {
    e.printStackTrace();
}

2、对文件名进行过滤

String filename = request.getParameter("filename");  // 获取文件名

// 过滤非法字符(如 ../、<、> 等)
if (filename.contains("..") || filename.contains("<") || filename.contains(">")) {
    throw new SecurityException("非法文件名");
}

// 限制文件后缀
Set<String> allowedExtensions = new HashSet<>(Arrays.asList("txt", "log", "csv"));
String fileExtension = filename.substring(filename.lastIndexOf(".") + 1).toLowerCase();
if (!allowedExtensions.contains(fileExtension)) {
    throw new SecurityException("非法文件类型");
}

File file = new File("/safe/directory/", filename);  // 将文件限制在安全目录中

3、对写入内容做黑名单过滤

List<String> blackContents = Arrays.asList("<%@page", "<%!", "<?php", "SELECT", "INSERT", "DELETE");

String content = request.getParameter("content");  // 获取文件内容

// 检查是否包含黑名单内容
for (String blackContent : blackContents) {
    if (content.contains(blackContent)) {
        throw new SecurityException("非法文件内容");
    }
}

try (FileWriter writer = new FileWriter(file)) {
    writer.write(content);  // 写入过滤后的内容
} catch (IOException e) {
    e.printStackTrace();
}

4、限制文件写入目录
将文件写入操作限制在特定的安全目录中,防止攻击者通过路径遍历覆盖系统文件。

String basePath = "/safe/directory/";  // 安全目录
String filename = request.getParameter("filename");  // 获取文件名

File file = new File(basePath, filename);  // 将文件限制在安全目录中
if (!file.getCanonicalPath().startsWith(new File(basePath).getCanonicalPath())) {
    throw new SecurityException("非法文件路径");
}

相关文章:

  • Manus是由中国创业公司Monica研发的通用型AI智能体
  • 何有效预防神经性头抖
  • 使用Node.js从零搭建DeepSeek本地部署(Express框架、Ollama)
  • 【C#】async与await介绍
  • JAVASE(一)
  • 计算机视觉|3D卷积网络VoxelNet:点云检测的革新力量
  • Unity组件TrailRenderer屏幕滑动拖尾
  • 策略模式详解:实现灵活多样的支付方式
  • 数据上新 | 专业领域多语种对话语音数据集
  • P63 C++当中的计时
  • 不小心更改了/etc权限为777导致sudo,ssh等软件都无法使用
  • “此电脑”中删除WPS云盘方法(百度网盘通用)
  • 10 【HarmonyOS NEXT】 仿uv-ui组件开发之Avatar头像组件开发教程(一)
  • 为何吹订单?因为特斯拉的销量已遥遥领先,掩耳盗铃之举!
  • 第10章 metasploit(网络安全防御实战--蓝军武器库)
  • 每日一题----------异常处理
  • 【Python运维】实现高效的自动化备份与恢复:Python脚本从入门到实践
  • 数据结构---八大排序
  • Python的学习篇(七)--网页结构
  • 数据清洗与治理:为大模型预训练打造完美数据
  • 桂林建设银行招聘网站/自学seo能找到工作吗
  • 日本 网站 设计 模仿欧美/做网络推广工作怎么样
  • 网站设计和网页设计/怎样做推广更有效
  • 自己怎么做视频收费网站/常见的系统优化软件
  • 58网站怎么做才有客户问/竞价推广返点开户
  • 揭阳市榕城区建设局网站/seo优化实训总结