通达 OA 11.7 组合拳 RCE 利用分析

  • 通达 OA 11.7 组合拳 RCE 利用分析已关闭评论
  • 106 views
  • A+

概述

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

大概看到两个利用的思路
1. 任意用户登陆 + 任意文件读取 + SSRF
2. 任意用户登陆 + 文件上传 + 目录穿越 + 文件包含

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

image.png

组合拳一

任意用户登陆

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

POC

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

image.png

(SecIN 社区貌似不支持 GIF 动图的上传,这里静态图片可能体验比较差)

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

看一下数据库查询语句

$sql = "SELECT SID FROM user_online WHERE UID = '$uid' and CLIENT = '$P_VER'";

UID 是在线人员的 UID

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

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

image.png

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

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

image.png

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

image.png

任意文件读取

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

/general/approve_center/archive/getTableStruc.php

image.png

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

image.png

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

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

image.png

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

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

image.png

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

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

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

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

image.png

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

SSRF

POC

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

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

image.png

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

image.png

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

image.png

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

image.png

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

image.png

组合拳二

文件上传 + 目录穿越

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

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

webroot\inc\utility_file.php

image.png

跟进is_uploadable函数

image.png

原文概括已经很好了

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 才会进入后面的判断流程

image.png

之后先进行 check_filenamecheck_filetype

image.png

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

image.png

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

image.png

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

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

文件包含

/ispirit/interface/gateway.php

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

image.png

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

image.png

后台 SQL 注入

URI

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

POST

language
arr\[5\]\[pro\_id\]=151';select sleep(5) %23

image.png

REF

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

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