最近两天看到通达11.7的利用蛮火的,遂进行一下利用链复现和漏洞分析,匆匆一下午简单分析了利用链和相关的漏洞点,如有错误请师傅们指正。

大概看到两个利用的思路

1.任意用户登陆 + 任意文件读取 + SSRF 2.任意用户登陆 + 文件上传 + 目录穿越 + 文件包含

Trick:快速判断版本,可使用inc/expired.php等目录

图片

组合拳一

任意用户登陆

组合拳 RCE 的灵魂,利用条件:需管理员在线 POC

/mobile/auth_mobi.php?isAvatar=1&uid=1&P_VER=0

图片

漏洞产生的核心是在这里会根据这些参数的判断,从而进行数据库查询,最后将SID附值给P后,调用session_id覆盖了session

看一下数据库查询语句

$sql = “SELECT SID FROM user_online WHERE UID = ‘$uid’ and CLIENT = ‘$P_VER’”;

UID是在线人员的UID

Client客户端登录设备类型,0指浏览器

可以通过遍历UID登录所有当前在线的账号

图片

故而取出的SID就是PHPSESSID,随后经过session_id+session_start重新设置当前会话ID并重用现有会话

从下图可以看出两者 PHPSESSID 是一样的

图片

同时根据源码可以推断出,如果管理员不在线,那么数据库中取出的SID附值给P也是空的,因此会调用relogin(),输出 RELOGIN 并退出。

任意文件读取

读取文件之前先找一下绝对路径,下面的这个URI泄漏了一些敏感信息(需要登录)

/general/approve_center/archive/getTableStruc.php

看一下相关源码,这里找的是log路径输出的位置

图片

这里可以获取一部分绝对路径 C:/TDOA

看了一下redis.windows.conf这个是默认安在OApath/bin/redis.windows.conf这里的

图片

因此获取绝对路径为 C:\TDOA\bin\redis.windows.conf

/ispirit/im/photo.php?AVATAR_FILE=C:\TDOA\bin\redis.windows.conf&UID=1

图片

photo.php最上方有一个对UID相关的判断

if (isset($UID) && (0 < intval($UID)))

只要大于 0,那么就进入 if 里面的内容

代码中前面有对于KEY的判断,会有相应的$AVATAR_FILE的拼接处理,核心漏洞代码如下,判断是否$``AV``ATAR_FILE对应的文件存在,如果存在的话就读取,因此这里造成了任意文件读取漏洞

图片

值得留疑的是我并没有找到**$AVATAR_FILEUID的传参点,跟了几个include进来的文件也没有发现$AVATAR_FILEUID**传参附值的地方,可能是在更深的调用,没有对全部文件解密,懒得一个个找了,暂时这么理解吧,如果有师傅知道可以滴滴我。

SSRF

POC

/pda/workflow/img_download.php?PLATFORM=dd&ATTACHMENTS=PAYLOAD

可结合redis进行更深一步的利用,这里以http请求为例。

图片

先看img_download.php,这里根据PLATFORM参数值进入不同的IF语句,在dd这里,ATTACHMENTS经过切割处理和遍历之后,调用到remote_download函数。

跟进remote_download,这里初始化了一个Curl类

图片

看一下curl.class类,根据其构造方法可以看到这里

图片

remote_download调用get方法的时候会调用到Curl类的get方法,执行指定的cURL会话,造成了SSRF

图片

组合拳二

文件上传 + 目录穿越

@LoRexxar 师傅文里提到通达OA处理上传文件的逻辑主要函数为td_copytd_move_uploaded_file这两个

这里与漏洞利用相关的为td_move_uploaded_file

webroot\inc\utility_file.php

图片

跟进is_uploadable函数

图片

原文概括已经很好了

1、不能没有. 2、不能.之后为空 3、.之后3个字符不能是 php

由于通达内置的nginx的配置很好,导致避免了其他文件后缀解析成 PHP

location ~ .php$ { fastcgi_pass OfficeFPM; fastcgi_index index.php; include fastcgi.conf;

add_header X-Frame-Options SAMEORIGIN; }

其次通达还配置了专门的附件目录

location /attachment { deny all; }

一般来说,除非找到绕过的办法,否则所有的文件都会被上传到这个目录下,那么无论我们是否能绕过后缀限制,我们都没办法解析执行php文件,所以这里我们需要找到一个配合目录穿越的文件上传点

/general/reportshop/utils/upload.php

看一下相关的源代码,上传的文件属性不是 xls 或者 img 才会进入后面的判断流程

图片

之后先进行check_filenamecheck_filetype

图片

跟进两个判断函数,check_filename主要判断一些斜杠之类的敏感字符,``check_filetype则是以黑名单的形式校验了后缀名,这里限制了php,但是我们可以通过传txt等方式结合文件包含来getshell,接着我们需要找目录穿越

图片

核心漏洞点,这里newid的可控会造成目录穿越

图片

这里可以关注到newid被直接拼接进了路径中,且没有设计专门的过滤,导致我们可以穿越任意目录写,当newid为../../../../目录相应就为

D:/MYOA/webroot/attachment/reportshop/attachment/{321/…/…/…/…/a}_.txt

文件包含

/ispirit/interface/gateway.php

看一下相关源码,这里限制了general、ispirit、module开头

图片

利用方式很简单,不用强行绕过包含的逻辑,只需要结合前面的跨目录文件上传直接上传到这里限制的目录下利用包含就可以了

图片

后台SQL注入

URI

/general/appbuilder/web/officeproduct/productapply/applyprobygroup

POST

arr[5][pro_id]=151';select sleep(5) %23

图片

REF

https://paper.seebug.org/1492/

https://articles.zsxq.com/id_cffeaoi67h29.html