更多黑客技能 公众号:白帽子左一
作者:掌控安全-master
一位向往于任意门的白帽少年,我的奇技淫巧,让你尽可能的getshell.
今天的主角通达OA,前段时间黑产界的杀手,开始吧!
0x00 漏洞简介
CNVD:CNVD-2020-26562
通达OA是由北京通达信科科技有限公司开发的一款办公系统,前几天通达官方在其官网发布了安全提醒与更新程序,并披露有用户遭到攻击。
攻击者可在未授权的情况下可上传图片木马文件,之后通过精心构造的请求进行文件包含,实现远程命令执行,且攻击者无须登陆认证即可完成攻击。
本文主要以通达OA文件上传和文件包含导致的RCE进行复现和分析
通过fofa的搜索可以看到通达OA系统应用非常广泛,这就给同学们提供了大量的实战环境.当然大家一定要做一个正直的白帽子.
0x01 影响范围
通达OA V11版 <= 11.3 20200103
通达OA 2017版 <= 10.19 20190522
通达OA 2016版 <= 9.13 20170710
通达OA 2015版 <= 8.15 20160722
通达OA 2013增强版 <= 7.25 20141211
通达OA 2013版 <= 6.20 20141017
0x02 环境搭建
通达OA系统采用了一键式的傻瓜操作,正常的软件安装,这里我本地搭建的.安装过程省略.安装完成后访问本地地址,截图如下:
0x03 未授权上传文件
文件在 webroot\ispirit\im\upload.php
<?php
set_time_limit(0);
$P = $_POST['P'];
if (isset($P) || $P != '') {
ob_start();
include_once 'inc/session.php';
session_id($P);
session_start();
session_write_close();
} else {
include_once './auth.php';
}
include_once 'inc/utility_file.php';
include_once 'inc/utility_msg.php';
include_once 'mobile/inc/funcs.php';
ob_end_clean();
$TYPE = $_POST['TYPE'];
$DEST_UID = $_POST['DEST_UID'];
$dataBack = array();
if ($DEST_UID != '' && !td_verify_ids($ids)) {
$dataBack = array('status' => 0, 'content' => '-ERR ' .
_('接收
方ID无效'));
echo json_encode(data2utf8($dataBack));
exit;
}
if (strpos($DEST_UID, ',') !== false) {
} else {
$DEST_UID = intval($DEST_UID);
}
if ($DEST_UID == 0) {
if ($UPLOAD_MODE != 2) {
$dataBack = array('status' => 0, 'content' => '-ERR ' .
_('接收方ID无效'));
echo json_encode(data2utf8($dataBack));
exit;
}
}
$MODULE = 'im';
if (1 <= count($_FILES)) {
if ($UPLOAD_MODE == '1') {
if (strlen(urldecode($_FILES['ATTACHMENT']['name'])) !=
strlen($_FILES['ATTACHMENT']['name'])) {
$_FILES['ATTACHMENT']['name'] =
urldecode($_FILES['ATTACHMENT']['name']);
}
}
$ATTACHMENTS = upload('ATTACHMENT', $MODULE, false);
if (!is_array($ATTACHMENTS)) {
$dataBack = array('status' => 0, 'content' => '-ERR ' .
$ATTACHMENTS);
echo json_encode(data2utf8($dataBack));
exit;
}
ob_end_clean();
$ATTACHMENT_ID = substr($ATTACHMENTS['ID'], 0, -1);
$ATTACHMENT_NAME = substr($ATTACHMENTS['NAME'], 0, -1);
if ($TYPE == 'mobile') {
$ATTACHMENT_NAME =
td_iconv(urldecode($ATTACHMENT_NAME),
'utf-8', MYOA_CHARSET);
}
} else {
$dataBack = array('status' => 0, 'content' => '-ERR ' .
_('无文
件上传'));
echo json_encode(data2utf8($dataBack));
exit;
}
$FILE_SIZE = attach_size($ATTACHMENT_ID, $ATTACHMENT_NAME,
$MODULE);
if (!$FILE_SIZE) {
$dataBack = array(