Ripstech Java Security 2019 Calendar复现系列(三)
字数 1567 2025-08-25 22:59:03

Java安全漏洞复现与防御指南

目录遍历到RCE漏洞(Day11)

漏洞原理

该漏洞存在于处理tar文件解压的逻辑中,攻击者可以通过构造恶意tar文件实现任意文件写入,最终导致远程代码执行(RCE)。

关键点

  1. 代码将tar文件内容提取到Tomcat临时目录中以"test"开头的文件夹中
  2. /tmp/uploaded.tar路径完全由攻击者控制
  3. TarArchiveEntry.getName()获取的文件名仅经过简单的../过滤
  4. 过滤不严格,可通过..././等方式绕过

复现步骤

  1. 环境搭建

    docker pull tomcat:9.0.30-jdk8-openjdk
    docker run -p 80:8080 -it container_id /bin/bash
    
  2. 构造恶意tar文件

    • 创建包含特殊文件名的文件:..usr/local/tomcat/webapps/ROOT/index.jsp
    • 使用二进制编辑器修改tar文件中的文件名
  3. 漏洞利用

    • 将恶意tar文件放入/tmp/uploaded.tar
    • 发送POST请求触发解压操作

防御措施

  1. 对解压路径进行严格校验,限制在指定目录内
  2. 使用规范化路径检查,如getCanonicalPath()
  3. 实现更严格的路径遍历检查,考虑多种变体

XSS漏洞(Day12)

漏洞原理

该漏洞源于未对用户输入进行适当过滤,导致攻击者可以突破HTML属性限制注入恶意脚本。

关键点

  1. customClass参数值直接赋给div标签属性
  2. 虽然使用了ESAPI进行HTML编码,但属性值本身未过滤
  3. 攻击者可通过双引号突破属性限制

复现步骤

  1. 构造Payload

    /index.jsp?username=123&customClass=1" </div><script>alert(1)</script>
    
  2. 防御措施

    • 对所有用户输入进行HTML实体编码
    • 使用内容安全策略(CSP)
    • 对属性值进行严格验证

文件上传漏洞(Day13)

漏洞原理

文件上传功能存在两个关键问题:

  1. 仅检查Content-Typetext/plain,可轻易绕过
  2. 文件名未经验证,导致目录遍历

复现步骤

  1. 构造恶意请求

    • 设置Content-Type: text/plain
    • 使用包含../的文件名
  2. 防御措施

    • 实现严格的文件扩展名检查
    • 使用随机生成的文件名
    • 限制上传目录
    • 检查文件内容而不仅是MIME类型

CSV注入(Day14)

漏洞原理

虽然代码本身是将恶意CSV返回给攻击者自己,但展示了CSV注入的基本原理。

关键点

  1. CSV单元格内容完全由攻击者控制
  2. 当Excel等软件打开时可能执行公式

防御措施

  1. 对CSV内容进行转义
  2. 添加前缀字符防止公式执行
  3. 使用专门的CSV库处理数据

命令注入漏洞(Day15)

漏洞原理

通过find命令的-exec参数实现命令注入。

关键点

  1. 用户输入的options参数直接拼接到命令中
  2. find命令的-exec参数可执行任意命令

复现步骤

  1. 构造Payload

    options=-exec cat /etc/passwd ;
    
  2. 防御措施

    • 避免直接拼接用户输入到系统命令
    • 使用白名单验证输入
    • 使用安全的API替代系统命令

SQL注入漏洞(Day16)

漏洞原理

HQL查询中用户输入未正确过滤导致的注入漏洞。

关键点

  1. escapeQuotes函数仅将单引号转义为双引号
  2. 攻击者可通过\'绕过过滤
  3. 注释符#可绕过后续引号

复现步骤

  1. 构造Payload

    test\' or 1=1 #
    
  2. 防御措施

    • 使用参数化查询
    • 实现更严格的输入验证
    • 使用ORM框架的安全查询方法
    • 最小权限原则配置数据库账户

总结与最佳实践

  1. 输入验证

    • 对所有用户输入进行严格验证
    • 使用白名单而非黑名单方法
    • 规范化路径和输入数据
  2. 安全编码

    • 避免直接拼接用户输入到命令、查询中
    • 使用安全的API和框架功能
    • 实施深度防御策略
  3. 环境加固

    • 最小权限原则
    • 定期更新依赖库
    • 安全配置应用服务器
  4. 安全测试

    • 实施自动化安全扫描
    • 定期进行渗透测试
    • 代码审计

通过理解和修复这些常见漏洞模式,开发者可以显著提高Java应用程序的安全性。

Java安全漏洞复现与防御指南 目录遍历到RCE漏洞(Day11) 漏洞原理 该漏洞存在于处理tar文件解压的逻辑中,攻击者可以通过构造恶意tar文件实现任意文件写入,最终导致远程代码执行(RCE)。 关键点 : 代码将tar文件内容提取到Tomcat临时目录中以"test"开头的文件夹中 /tmp/uploaded.tar 路径完全由攻击者控制 TarArchiveEntry.getName() 获取的文件名仅经过简单的 ../ 过滤 过滤不严格,可通过 ..././ 等方式绕过 复现步骤 环境搭建 : 构造恶意tar文件 : 创建包含特殊文件名的文件: ..usr/local/tomcat/webapps/ROOT/index.jsp 使用二进制编辑器修改tar文件中的文件名 漏洞利用 : 将恶意tar文件放入 /tmp/uploaded.tar 发送POST请求触发解压操作 防御措施 对解压路径进行严格校验,限制在指定目录内 使用规范化路径检查,如 getCanonicalPath() 实现更严格的路径遍历检查,考虑多种变体 XSS漏洞(Day12) 漏洞原理 该漏洞源于未对用户输入进行适当过滤,导致攻击者可以突破HTML属性限制注入恶意脚本。 关键点 : customClass 参数值直接赋给div标签属性 虽然使用了ESAPI进行HTML编码,但属性值本身未过滤 攻击者可通过双引号突破属性限制 复现步骤 构造Payload : 防御措施 : 对所有用户输入进行HTML实体编码 使用内容安全策略(CSP) 对属性值进行严格验证 文件上传漏洞(Day13) 漏洞原理 文件上传功能存在两个关键问题: 仅检查 Content-Type 为 text/plain ,可轻易绕过 文件名未经验证,导致目录遍历 复现步骤 构造恶意请求 : 设置 Content-Type: text/plain 使用包含 ../ 的文件名 防御措施 : 实现严格的文件扩展名检查 使用随机生成的文件名 限制上传目录 检查文件内容而不仅是MIME类型 CSV注入(Day14) 漏洞原理 虽然代码本身是将恶意CSV返回给攻击者自己,但展示了CSV注入的基本原理。 关键点 : CSV单元格内容完全由攻击者控制 当Excel等软件打开时可能执行公式 防御措施 对CSV内容进行转义 添加前缀字符防止公式执行 使用专门的CSV库处理数据 命令注入漏洞(Day15) 漏洞原理 通过 find 命令的 -exec 参数实现命令注入。 关键点 : 用户输入的 options 参数直接拼接到命令中 find 命令的 -exec 参数可执行任意命令 复现步骤 构造Payload : 防御措施 : 避免直接拼接用户输入到系统命令 使用白名单验证输入 使用安全的API替代系统命令 SQL注入漏洞(Day16) 漏洞原理 HQL查询中用户输入未正确过滤导致的注入漏洞。 关键点 : escapeQuotes 函数仅将单引号转义为双引号 攻击者可通过 \' 绕过过滤 注释符 # 可绕过后续引号 复现步骤 构造Payload : 防御措施 : 使用参数化查询 实现更严格的输入验证 使用ORM框架的安全查询方法 最小权限原则配置数据库账户 总结与最佳实践 输入验证 : 对所有用户输入进行严格验证 使用白名单而非黑名单方法 规范化路径和输入数据 安全编码 : 避免直接拼接用户输入到命令、查询中 使用安全的API和框架功能 实施深度防御策略 环境加固 : 最小权限原则 定期更新依赖库 安全配置应用服务器 安全测试 : 实施自动化安全扫描 定期进行渗透测试 代码审计 通过理解和修复这些常见漏洞模式,开发者可以显著提高Java应用程序的安全性。