通达OA文件上传和文件包含漏洞分析

通达OA文件上传和文件包含漏洞分析

0x00 背景

3月13日,通达OA在官方论坛发布紧急通知并提供了对应版本的修复补丁。近日,各大厂商公众号也都发布了相关文章,漏洞POC也在逐渐公开。

0x01 漏洞起因-补丁、源码对比分析

1、根据官网和网上公开的信息来看,文件上传漏洞存在多个版本,而文件包含漏洞似乎仅在V11存在,到通达官网下载V11.3版本安装包和补丁文件。

2、下载完成后发现php文件都被加密了,不能直接看到。使用在线zend解密工具解码文件。根据网上公开信息已知漏洞接口文件是upload.php和gateway.php。

3、对比修复前后的upload.php文件,发现改动的地方如图,这正是文件上传漏洞起因。可以看到未修复前对参数$P做了判断,当参数是空时,进行身份认证,意味着只要参数不为空,就不会进行身份认证,可以随意构造$P的值,从而导致未授权用户拥有上传文件的权限,而补丁文件不管$P是不是空都做身份认证。

img

4、对比修复前后的gateway.php,修复后主要对包含的URL的做了限制,不能包含“..”否则会报错,目的是限制通过“..”来获取到其他目录的文件。

img

0x02 漏洞POC构造思路

总体思路:首先上传文件,成功上传后需要知道文件对应所在目录,然后利用文件包含来读取上传的文件。

(1) 如何构造上传文件的HTTP请求?

分析upload.php源文件,构造涉及参数:

$P,$P值随意只要不为空;

$DEST_UID和$UPLOAD_MODE

$DEST_UID $UPLOAD_MODE
0 2
不为0 1
2
3
其它

$_FILES[‘ATTACHMENT’][‘name’])及file

(2) 文件上传后对应目录在哪里?

分析代码,$FILE_PATH顾名思义是上传文件路径,attach_real_path这个函数找了下没找到是什么含义,最后百度了下找到了,是通达oa的开发函数,“根据附件的ID、名称等获取该附件在服务器上存储的物理路径,参数:$ATTACHMENT_ID $ATTACHMENT_NAME $MODULE 返回值:附件在服务器上的物理路径,如D:/MYOA/attach/email/”,到本地安装目录下查看确实有这个attach目录,根据$MODULE = ‘im’推测在/attach/im目录下。

至于文件名,每次上传的文件都有echo文件名。

img

图 代码分析

img

图 百度获取的attach_real_path含义

img

图 本地路径

(3) 如何构造文件包含HTTP请求?

首先需要包含general/、ispirit/、module/这三个中的任意一个,否则会报错,然后根据“..”来获取到对应上传文件的目录,从而包含到对应的文件。

img

0x03 漏洞复现

(1) 下载、傻瓜式安装通达OA

img

img

(2) 根据前面的思路构造上传文件的HTTP POST请求,根据响应+OK [vm]379@2003_1950118141|ATTACHMENT|0[/vm]获取到文件路径和名称。到本地目录查看。

img

图 上传文件HTTP请求

img

图 文件路径

(3)构造包含路径的参数值,根据前面的思路,general/、ispirit/、module/这三个中的任意一个结合“..”来获取到对应上传文件的路径, attach和webroot在同意层,而general在webroot目录下,所以general的上级目录可用获取到attach,即general../attach,而general/的上上级可获取attach,即general/../../attach。最终文件路径如下:general/../../attach/im/2003/1950118141.attachment。

img

(4)本地文件包含请求如下注意编码格式为url编码:

img