Tale博客系统代码审计过程
字数 1393 2025-08-24 16:48:07

Tale博客系统代码审计教学文档

1. 项目概述

Tale博客系统是基于Blade框架开发的Java Web应用程序。本次审计发现了多个安全漏洞,包括任意文件读取、任意代码文件写入和任意文件上传漏洞。

2. 环境准备与项目结构

2.1 开发环境配置

  1. 使用IDEA作为开发环境
  2. 通过Maven->reload project加载项目依赖
  3. 运行Application启动项目

2.2 项目依赖

  • 使用Blade框架作为基础开发框架
  • 实现了WebHook组件用于请求拦截

2.3 权限控制机制

  • 系统定义了ADMIN_URI常量:public static final String ADMIN_URI = "/admin"
  • WebHook会检查请求URL是否以ADMIN_URI开头且不是登录请求
  • 未登录用户访问admin路径会被重定向到登录页面
  • 安全特性:Blade框架会自动处理路径遍历(如/test/../admin/index无法匹配/admin/index

3. 漏洞分析

3.1 任意文件读取漏洞

漏洞位置

路由:admin/template/content

漏洞详情

  1. 用户可控参数fileName直接拼接形成文件路径
  2. 未对fileName进行任何过滤处理
  3. 直接使用Files.readAllLines读取文件内容

验证方法

读取系统敏感文件(如pom.xml):

GET /admin/template/content?fileName=pom.xml

3.2 任意代码文件写入漏洞

漏洞位置

路由:admin/api/template/save

漏洞详情

  1. 接收TemplateParam对象,包含两个可控参数:
    @Data
    public class TemplateParam {
        private String fileName;
        private String content;
    }
    
  2. 仅检查fileName是否为空(StringKit.isBlank(templateParam.getFileName())
  3. 直接拼接filepath并写入内容
  4. 文件不存在时会自动创建

利用方式

  1. 修改服务器上的任意文件
  2. 写入恶意路由代码(服务器重启后生效):
    • 创建不需要认证的路由
    • 植入后门代码获取系统权限

验证方法

  1. 修改桌面文件
  2. 写入新的路由代码

3.3 任意文件上传漏洞

漏洞位置

路由:admin/api/attach/upload

漏洞详情

  1. 获取文件名并赋值给fname
  2. getFileKey方法处理上传路径:
    • 检查/upload/当前日期/目录是否存在,不存在则创建
    • 使用StringKit.fileExt生成文件名,但未对文件后缀做任何限制

利用限制

  • 上传的文件可能不被解析执行
  • 可被用于存储型XSS攻击

验证方法

上传包含恶意脚本的文件(如HTML/JS文件)

4. 漏洞修复建议

4.1 任意文件读取修复

  1. fileName参数进行严格过滤
  2. 限制可访问的目录范围
  3. 使用白名单方式限制可读取的文件类型

4.2 任意代码文件写入修复

  1. 对写入路径进行规范化处理
  2. 限制可写入的文件扩展名
  3. 实现代码签名验证机制
  4. 对管理员操作进行二次认证

4.3 任意文件上传修复

  1. 实现严格的文件扩展名白名单
  2. 对上传文件内容进行检查
  3. 设置独立的非执行上传目录
  4. 对图片类文件进行重采样处理

5. 总结

本次审计发现的漏洞主要源于:

  1. 用户输入未经验证直接使用
  2. 文件操作未进行适当的路径限制
  3. 缺乏对危险文件类型的过滤机制

这些漏洞组合利用可导致服务器完全沦陷,建议开发者立即修复并加强输入验证机制。

Tale博客系统代码审计教学文档 1. 项目概述 Tale博客系统是基于Blade框架开发的Java Web应用程序。本次审计发现了多个安全漏洞,包括任意文件读取、任意代码文件写入和任意文件上传漏洞。 2. 环境准备与项目结构 2.1 开发环境配置 使用IDEA作为开发环境 通过Maven->reload project加载项目依赖 运行Application启动项目 2.2 项目依赖 使用Blade框架作为基础开发框架 实现了WebHook组件用于请求拦截 2.3 权限控制机制 系统定义了 ADMIN_URI 常量: public static final String ADMIN_URI = "/admin" WebHook会检查请求URL是否以 ADMIN_URI 开头且不是登录请求 未登录用户访问admin路径会被重定向到登录页面 安全特性 :Blade框架会自动处理路径遍历(如 /test/../admin/index 无法匹配 /admin/index ) 3. 漏洞分析 3.1 任意文件读取漏洞 漏洞位置 路由: admin/template/content 漏洞详情 用户可控参数 fileName 直接拼接形成文件路径 未对 fileName 进行任何过滤处理 直接使用 Files.readAllLines 读取文件内容 验证方法 读取系统敏感文件(如pom.xml): 3.2 任意代码文件写入漏洞 漏洞位置 路由: admin/api/template/save 漏洞详情 接收 TemplateParam 对象,包含两个可控参数: 仅检查 fileName 是否为空( StringKit.isBlank(templateParam.getFileName()) ) 直接拼接 filepath 并写入内容 文件不存在时会自动创建 利用方式 修改服务器上的任意文件 写入恶意路由代码(服务器重启后生效): 创建不需要认证的路由 植入后门代码获取系统权限 验证方法 修改桌面文件 写入新的路由代码 3.3 任意文件上传漏洞 漏洞位置 路由: admin/api/attach/upload 漏洞详情 获取文件名并赋值给 fname getFileKey 方法处理上传路径: 检查 /upload/当前日期/ 目录是否存在,不存在则创建 使用 StringKit.fileExt 生成文件名,但未对文件后缀做任何限制 利用限制 上传的文件可能不被解析执行 可被用于存储型XSS攻击 验证方法 上传包含恶意脚本的文件(如HTML/JS文件) 4. 漏洞修复建议 4.1 任意文件读取修复 对 fileName 参数进行严格过滤 限制可访问的目录范围 使用白名单方式限制可读取的文件类型 4.2 任意代码文件写入修复 对写入路径进行规范化处理 限制可写入的文件扩展名 实现代码签名验证机制 对管理员操作进行二次认证 4.3 任意文件上传修复 实现严格的文件扩展名白名单 对上传文件内容进行检查 设置独立的非执行上传目录 对图片类文件进行重采样处理 5. 总结 本次审计发现的漏洞主要源于: 用户输入未经验证直接使用 文件操作未进行适当的路径限制 缺乏对危险文件类型的过滤机制 这些漏洞组合利用可导致服务器完全沦陷,建议开发者立即修复并加强输入验证机制。