struts框架下的TPN系统代码审计分析
字数 1488 2025-08-29 22:41:01

Struts框架下的TPN系统代码审计分析

1. 初始审计准备

1.1 文件结构分析

  • 首先检查项目结构,重点关注以下文件:
    • web.xml:Web应用部署描述文件
    • pom.xml:Maven项目配置文件
    • 各种XML配置文件
  • 检查关键目录:
    • /webapps/ROOT/WEB-INF/lib/:存放依赖的JAR包
    • /WEB-INF/classes/:存放编译后的类文件

1.2 框架识别

  • /webapps/ROOT/WEB-INF/lib/目录下发现struts2-core-2.1.8.1.jar
  • 确认使用Struts2框架,版本为2.1.8.1

2. 漏洞验证

2.1 版本漏洞检查

  • 通过Maven官网验证该版本漏洞情况:
    • 访问:https://mvnrepository.com/artifact/org.apache.struts/struts2-core
    • 确认2.1.8.1版本存在大量已知漏洞

2.2 安全配置检查

检查Struts2的安全配置是否到位:

  1. 动态方法调用检查

    • 搜索DynamicMethodInvocation关键字
    • 发现三个XML文件包含该配置
    • 唯一设置为false的是演示文件,实际未禁用动态方法调用
  2. OGNL表达式限制检查

    • 搜索<global-allowed-methods>配置
    • 未发现相关限制配置
    • 满足Struts漏洞利用前提条件

3. 路由映射分析

3.1 struts.xml配置分析

  • 定义命名空间:/lan
  • 关键action配置示例:
    <action name="admin_*" class="adminAction" method="{1}">
    
    • admin_*:通配符匹配以admin_开头的请求
    • class="adminAction":后端处理类
    • method="{1}":动态调用方法,{1}匹配通配符部分

3.2 可用接口分析

  1. adminAction类方法

    • 可用的测试方法:
      • admin_login
      • admin_getLisence
      • 其他方法均可尝试
  2. hostPolicyAction类方法

    • 通过hostPolicy_*接口
    • 可测试方法:getArpSwit

4. 漏洞利用

4.1 RCE(远程代码执行)漏洞

  • 利用条件:
    • Struts2版本存在漏洞
    • 未禁用动态方法调用
    • 未限制OGNL表达式
  • 利用方法:
    • 通过上述分析的接口进行命令执行测试

4.2 源码泄露

  • 发现压缩文件:
    • ROOT.bz2
    • login.bz2(不在网站根目录,无法直接访问)
  • 直接FUZZ ROOT.bz2文件可下载
  • 解压后获取网站完整源码

4.3 信息泄露

  1. FTP密码泄露

    • 发现FTP凭据但端口为22
    • 资产测绘未发现可用信息
  2. 用户信息泄露

    • 通过web.xml发现/userDownload接口
    • 分析UserBatchDownloadServlet类:
      • 实现文件下载功能
      • 直接访问可下载userlist文件
      • 包含大量用户名密码等敏感信息

5. 防御建议

  1. 框架层面

    • 升级Struts2到最新安全版本
    • 禁用动态方法调用:
      <constant name="struts.enable.DynamicMethodInvocation" value="false"/>
      
    • 限制OGNL表达式:
      <global-allowed-methods>execute,input,back,cancel,browse</global-allowed-methods>
      
  2. 应用层面

    • 删除不必要的测试文件和备份文件
    • 对敏感信息进行加密存储
    • 实现严格的访问控制
  3. 安全配置

    • 禁用目录列表
    • 限制敏感文件的访问权限
    • 定期进行安全审计和渗透测试

6. 审计总结

本次审计发现的主要问题:

  1. 使用存在已知漏洞的Struts2版本
  2. 缺乏基本的安全配置(动态方法调用和OGNL限制)
  3. 存在源码泄露风险
  4. 敏感信息未加密存储
  5. 存在用户信息泄露漏洞

修复优先级建议:

  1. 立即升级Struts2框架
  2. 删除或保护备份文件
  3. 加密存储敏感信息
  4. 实施严格的安全配置
Struts框架下的TPN系统代码审计分析 1. 初始审计准备 1.1 文件结构分析 首先检查项目结构,重点关注以下文件: web.xml :Web应用部署描述文件 pom.xml :Maven项目配置文件 各种XML配置文件 检查关键目录: /webapps/ROOT/WEB-INF/lib/ :存放依赖的JAR包 /WEB-INF/classes/ :存放编译后的类文件 1.2 框架识别 在 /webapps/ROOT/WEB-INF/lib/ 目录下发现 struts2-core-2.1.8.1.jar 确认使用Struts2框架,版本为2.1.8.1 2. 漏洞验证 2.1 版本漏洞检查 通过Maven官网验证该版本漏洞情况: 访问:https://mvnrepository.com/artifact/org.apache.struts/struts2-core 确认2.1.8.1版本存在大量已知漏洞 2.2 安全配置检查 检查Struts2的安全配置是否到位: 动态方法调用检查 搜索 DynamicMethodInvocation 关键字 发现三个XML文件包含该配置 唯一设置为 false 的是演示文件,实际未禁用动态方法调用 OGNL表达式限制检查 搜索 <global-allowed-methods> 配置 未发现相关限制配置 满足Struts漏洞利用前提条件 3. 路由映射分析 3.1 struts.xml配置分析 定义命名空间: /lan 关键action配置示例: admin_* :通配符匹配以 admin_ 开头的请求 class="adminAction" :后端处理类 method="{1}" :动态调用方法, {1} 匹配通配符部分 3.2 可用接口分析 adminAction类方法 可用的测试方法: admin_login admin_getLisence 其他方法均可尝试 hostPolicyAction类方法 通过 hostPolicy_* 接口 可测试方法: getArpSwit 4. 漏洞利用 4.1 RCE(远程代码执行)漏洞 利用条件: Struts2版本存在漏洞 未禁用动态方法调用 未限制OGNL表达式 利用方法: 通过上述分析的接口进行命令执行测试 4.2 源码泄露 发现压缩文件: ROOT.bz2 login.bz2 (不在网站根目录,无法直接访问) 直接FUZZ ROOT.bz2 文件可下载 解压后获取网站完整源码 4.3 信息泄露 FTP密码泄露 发现FTP凭据但端口为22 资产测绘未发现可用信息 用户信息泄露 通过 web.xml 发现 /userDownload 接口 分析 UserBatchDownloadServlet 类: 实现文件下载功能 直接访问可下载 userlist 文件 包含大量用户名密码等敏感信息 5. 防御建议 框架层面 升级Struts2到最新安全版本 禁用动态方法调用: 限制OGNL表达式: 应用层面 删除不必要的测试文件和备份文件 对敏感信息进行加密存储 实现严格的访问控制 安全配置 禁用目录列表 限制敏感文件的访问权限 定期进行安全审计和渗透测试 6. 审计总结 本次审计发现的主要问题: 使用存在已知漏洞的Struts2版本 缺乏基本的安全配置(动态方法调用和OGNL限制) 存在源码泄露风险 敏感信息未加密存储 存在用户信息泄露漏洞 修复优先级建议: 立即升级Struts2框架 删除或保护备份文件 加密存储敏感信息 实施严格的安全配置