最近两天看到通达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_FILE
和UID
的传参点,跟了几个include进来的文件也没有发现$AVATAR_FILE
和UID
**传参附值的地方,可能是在更深的调用,没有对全部文件解密,懒得一个个找了,暂时这么理解吧,如果有师傅知道可以滴滴我。
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_copy
和td_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_filename
和check_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