概述
最近两天看到通达 11.7 的利用蛮火的,遂进行一下利用链复现和漏洞分析,匆匆一下午简单分析了利用链和相关的漏洞点,如有错误请师傅们指正
大概看到两个利用的思路
1. 任意用户登陆 + 任意文件读取 + SSRF
2. 任意用户登陆 + 文件上传 + 目录穿越 + 文件包含
Trick:快速判断版本,可使用 inc/expired.php
等目录
组合拳一
任意用户登陆
组合拳 RCE 的灵魂,利用条件:需管理员在线
POC
/mobile/auth_mobi.php?isAvatar=1&uid=1&P_VER=0
(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 登录所有当前在线的账号
故而取出的 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
的拼接处理,核心漏洞代码如下,判断是否 $AVATAR_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
language
arr\[5\]\[pro\_id\]=151';select sleep(5) %23
REF
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论