Ripstech Java Security 2019 Calendar复现系列(三)
字数 1567 2025-08-25 22:59:03
Java安全漏洞复现与防御指南
目录遍历到RCE漏洞(Day11)
漏洞原理
该漏洞存在于处理tar文件解压的逻辑中,攻击者可以通过构造恶意tar文件实现任意文件写入,最终导致远程代码执行(RCE)。
关键点:
- 代码将tar文件内容提取到Tomcat临时目录中以"test"开头的文件夹中
/tmp/uploaded.tar路径完全由攻击者控制TarArchiveEntry.getName()获取的文件名仅经过简单的../过滤- 过滤不严格,可通过
..././等方式绕过
复现步骤
-
环境搭建:
docker pull tomcat:9.0.30-jdk8-openjdk docker run -p 80:8080 -it container_id /bin/bash -
构造恶意tar文件:
- 创建包含特殊文件名的文件:
..usr/local/tomcat/webapps/ROOT/index.jsp - 使用二进制编辑器修改tar文件中的文件名
- 创建包含特殊文件名的文件:
-
漏洞利用:
- 将恶意tar文件放入
/tmp/uploaded.tar - 发送POST请求触发解压操作
- 将恶意tar文件放入
防御措施
- 对解压路径进行严格校验,限制在指定目录内
- 使用规范化路径检查,如
getCanonicalPath() - 实现更严格的路径遍历检查,考虑多种变体
XSS漏洞(Day12)
漏洞原理
该漏洞源于未对用户输入进行适当过滤,导致攻击者可以突破HTML属性限制注入恶意脚本。
关键点:
customClass参数值直接赋给div标签属性- 虽然使用了ESAPI进行HTML编码,但属性值本身未过滤
- 攻击者可通过双引号突破属性限制
复现步骤
-
构造Payload:
/index.jsp?username=123&customClass=1" </div><script>alert(1)</script> -
防御措施:
- 对所有用户输入进行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:
options=-exec cat /etc/passwd ; -
防御措施:
- 避免直接拼接用户输入到系统命令
- 使用白名单验证输入
- 使用安全的API替代系统命令
SQL注入漏洞(Day16)
漏洞原理
HQL查询中用户输入未正确过滤导致的注入漏洞。
关键点:
escapeQuotes函数仅将单引号转义为双引号- 攻击者可通过
\'绕过过滤 - 注释符
#可绕过后续引号
复现步骤
-
构造Payload:
test\' or 1=1 # -
防御措施:
- 使用参数化查询
- 实现更严格的输入验证
- 使用ORM框架的安全查询方法
- 最小权限原则配置数据库账户
总结与最佳实践
-
输入验证:
- 对所有用户输入进行严格验证
- 使用白名单而非黑名单方法
- 规范化路径和输入数据
-
安全编码:
- 避免直接拼接用户输入到命令、查询中
- 使用安全的API和框架功能
- 实施深度防御策略
-
环境加固:
- 最小权限原则
- 定期更新依赖库
- 安全配置应用服务器
-
安全测试:
- 实施自动化安全扫描
- 定期进行渗透测试
- 代码审计
通过理解和修复这些常见漏洞模式,开发者可以显著提高Java应用程序的安全性。