0x01 前言 

通达OA作为国内最主流的三大OA之一,经常参攻防演练的小伙伴一定非常喜欢这套系统的漏洞。历史上通达OA报出过很多高危漏洞,也曾经被人吐槽安全水平不高。但是经过这么多年的沉淀,现在通达OA的安全水平已经有了显著的提高。

本文以曾经研究过的通达OA11.9版本为例,阐述在高版本通达中如何利用通达自身的特性来getshell。文中涉及的所有漏洞都是笔者自研和首发,大多数已在最新版的通达OA12.0中修复,本文只是分享一下挖掘这些漏洞的思路和过程。很多时候我们想拿到权限,不一定非要通过某个牛逼的漏洞,组合利用一些特性也能带来意想不到的效果。

 0x02 获取普通用户权限 

历史很多通达OA的漏洞都是未授权或者越权,包括高危的SQL注入或者文件上传。目前较新版本的通达对于越权的问题处理的比较好,绝大多数文件都是需要登陆之后才能访问的。所以我们不再局限于寻找未授权访问的文件,而是寻找方便的用户口令爆破方式。

第一个很重要的tips是,通达OA安装之后的默认密码是空,这一点尤其重要。实战环境中能遇到的通达OA的很多弱口令都是空。如果用户要修改口令,则必须满足“8-20位,必须同时包含字母和数字”(低版本的通达OA没有复杂度限制),如图2.1所示。

图2.1 通达OA修改口令的要求

直接从通达OA的登陆口来爆破虽然没有验证码,但是却是有登陆次数错误的限制,而且有前端的RSA加密。但是这两个限制都是可以绕过的。

1)通达OA11.9在登录处默认使用了RSA的加密传输,但是修改参数encode_type=0,就可以明文传输密码了;

2)通达OA11.8默认10分钟只能输出3次密码,但是由于获取的IP是从X-Forwarded-For中获取的,所以可以通过该字段无限制爆破。

另外,为了更好的提高爆破密码的效率,配合另一个找回密码的接口,可以用于探测用户名是否存在。如图2.2所示。

图2.2 通过找回密码的接口判断用户名是否存在

为了更好的利用整个弱口令爆破的过程,编写了一个自动化的爆破脚本,具有下面的功能。文末附脚本下载方式,使用方式如图2.3所示。

▶自动发现系统存在的用户名

▶指定进程数,对用户名进行密码爆破

▶指定用户名,只对指定的用户名进行爆破

▶支持对中文用户名进行爆破

▶支持基于存在用户名的相关密码爆破,比如用户名张三,则密码为zhangsan123

图2.3 通达OA自动爆破脚本

 0x03 普通用户提权 

通过上面的弱口令爆破的思路,我们大概率已经获取目标相关的一个普通用户权限。普通用户可以登陆系统,但是还是不能拿到服务器权限,我们需要对普通用户进行提权。

未授权的SQL注入漏洞很少,但是登陆之后的SQL注入漏洞就很多了。在通达OA11.9版本中存在很多后台的SQL注入漏洞,但是我们需要首先绕过通达的全局的安全过滤,如图3.1所示。

图3.1 通达OA的全局SQL注入防御

这个SQL注入其实就是原来的80sec,很多其他的CMS也使用过,网上也有关于80sec的绕过方式,基本的思路就是通过特殊的方式引入单引号来进行绕过,如下所示。

id=@`'` union select 1,2,3 from user -- '

但是在11.9版本的通达中已经对响应的绕过方式进行了修复,修复代码如图3.2所示。首先会把所有转移之后的引号替换为空,然后再把反引号中的引号替换为空。这样我们就没办法再用上面的方式来绕过WAF了。

图3.2 通达OA修复80sec的漏洞

那么现在的情况下,还能不能利用通达OA的SQL注入漏洞呢?答案是肯定的。仔细阅读阅读通达OA的全局注入防护函数sql_injection,函数会禁止SQL语句中使用注释,禁止使用联合查询,禁止使用常见的注入关键字。但是不会禁止使用bool盲注,如图3.3所示。

通达OA11.9版本在普通用户权限下,还是有很多SQL注入的漏洞。这里给出一个示例,其他的注入读者可以自己再去找。定位到漏洞文件/module/appbuilder/user_select/query.php,如图3.4所示。

图3.4 因为通达OA全局变量的特性导致SQL注入漏洞

因为这里的注入有诸多限制,所以用SQLMAP跑不出来,我自己写了一个脚本来跑这种注入(文末附脚本下载方式)。运行如图3.5所示。

图3.5 使用注入脚本注出数据

这样我们可以拿到admin对应的hash值,但是并不是所有admin的hash都可以解密。还有哪些用户是可以帮助我们拿到服务器权限的呢?要能拿到服务器权限,用户需要有硬盘管理的权限,具体到数据库中需要满足下面的条件。

select concat(byname,0x23,password) from user where user.user_id in (select byname from user_function where user_func_id_str like 0x252c37372c25 and user_id != 0x61646d696e) and user.not_login=0 order by user_id desc limit 0,1

在上面的自动化脚本中我已经实现了指定注出具有“硬盘管理”权限用户的功能,稍微改一点就可以直接用了。

 0x04 获取服务器权限 

登录一个刚才获取用户。来到知识管理 - 网络硬盘设置,如图4.1所示。

图4.1 网络硬盘设置

最开始这里面是空的,新建一个共享目录。由于通达OA11.9增加了策略,不允许设置的目录中包含wwwroot所在的目录。定位文件

/general/system/netdisk/new/submit.php,如图4.2所示。

图4.2 网络硬盘设置限制

我们不能添加带wwwroot的目录,但是我们可以添加wwwroot对应的根目录,默认情况下通达OA WEB根目录是安装在D:/myoa/wwwroot/。所以我们可以添加D:/的网络硬盘,我本地是装在C盘,所以添加对应C盘的网络硬盘,如图4.3所示。

图4.3 添加C:///的网络硬盘

配置这个共享目录的权限,主要是自己要能上传文件,查看目录结构 权限设置 - 批量权限设置。在授权人员中加上自己。

图4.4 为新增加的网络硬盘配置权限

现在就可以浏览C:/的根目录了。

图4.5 网络硬盘配置中找到网站根目录

找到网站根目录,对应的wwwroot目录下面。点击单个上传。抓包。

图4.6 通过网络硬盘上传文件

但是上传的时候还是会报错。

图4.7 网络硬盘上传文件报错

这主要是由于inc/utility_file.php文件中,对上传文件的路径做了限制。如果上传路径中包含了wwwroot,然后又没有attachment,就不允许上传,如图4.8所示。

图4.8 上传文件要求上传文件必须在attachment目录

绕过方式就是,我们自己在某个字目录下面创建一个attachment目录。比如在inc下面创建目录attachment。

然后再到这个目录上传文件,如图4.9所示。

图4.9 在自建的attachment目录上传文件

这是后上传抓包,直接上传1.png是可以的了。但是上传php还是不可以。修改上传的后缀为 1.php .(0x88对应的ascii)。直接在hex里面修改就可以了,如图4.10所示。

图4.10 通过在文件名末尾增加0x88对应的ascii可以绕过上传黑名单检测

现在我们的目录文件1.php就在下面的路径了/inc/attachment/1.php

但是通达11.9版本修复了Wscript.Shell执行命令的方式,怎么执行命令是另一个问题了。这是通达11.9版本disable_functions的函数列表disable_functions = exec,shell_exec,system,passthru,proc_open,show_source,phpinfo,popen,dl,eval,proc_terminate,touch,escapeshellcmd,escapeshellarg

这里和以前第一个不同的点是没有禁用assert了,所以,我们可以构造一个一句话木马,但是这个一句话有很大的缺陷,我们并不能通过这个一句话来执行系统命令。如何执行系统命令呢?肯定是有办法的,留给大家思考一下。

 0x05 总结 

通达OA的代码量很大,很乱,甚至一套系统竟然是用了多个不同的开发框架,虽然最近系统修复了很多的漏洞,但是仔细分析还是有一些利用思路。一键getshell是很难的,但是组合拳getshell还是有一定的可能性。

公众号回复”tongdaoa”获取文中脚本下载链接。

某知名OA高版本getshell思路(附部分脚本)相关推荐

  1. 某知名OA命令执行方法探索(续)

    在上一篇文章之后,有小伙伴留言问通达OA获取权限后如何才能执行命令.本来是想留下一个小的悬念给大家,既然有人问起,咱们就把这个问题继续探讨一下. 传送门: 某知名OA高版本getshell思路(附部分 ...

  2. SpringBoot高版本(2.4及以上)集成neo4j并进行增删改查,通俗易懂附源代码

    SpringBoot整合Neo4j,最新版本适用,超通俗详细讲解 0.前言 ​ 跟着班导师做项目的时候遇到社交网络的部分,而传统的关系数据库不能很好解决数据之间的关系,因此采用图数据的方式进行存储.N ...

  3. System.Data.OracleClient 需要 Oracle 客户端软件 8.1.7 或更高版本?

    System.Data.OracleClient 需要 Oracle 客户端软件 8.1.7 或更高版本? 环境: Win XP SP2+Oracle 10 g+VS 2005 错误:System.D ...

  4. .Net高并发解决思路(转)

    .Net高并发解决思路 2018年10月21日 14:19:14 赵东小生 阅读数:736 高并发 高并发一直是网站上线后会遇到的一个严峻的考验,渡过了一切都好,渡不过就是宕机. 在电商时代如此发达的 ...

  5. linux cpu不足处理运维,Linux运维知识之Linux服务器CPU占用率较高问题排查思路

    本文主要向大家介绍了Linux运维知识之Linux服务器CPU占用率较高问题排查思路,通过具体的内容向大家展现,希望对大家学习Linux运维知识有所帮助. 注意:本文相关配置及说明已在 CentOS  ...

  6. Centos7使用Yum安装高版本的LNMP

    [摘要] 本文旨在介绍使用yum的方式安装一些高版本的NGINX.MySQL.PHP服务.当然如果觉得红帽给的就够用,就用红帽给的就行. 在红帽系列的Linux操作系统中,nginx/mysql/ph ...

  7. Sandcastle Help File Builder(.NET帮助文档工具)的版本选择心得——支持VS2010至VS2015,高版本项目文件问题...

    作者: zyl910 一.缘由 "Sandcastle Help File Builder"(简称SHFB)是一个很好用.NET 帮助文档生成工具. 但它的每个版本支持的VS版本范 ...

  8. CAD高版本窗体阵列LISP_[转载]AutoCAD高版本怎么把阵列对话框调出来?

    AutoCAD低版本阵列ARRAY命令的参数设置用是对话框形式,到了高版本使用功能区界面后,不再使用对话框,而是会在功能区弹出一个"阵列"选项卡,如下图所示. 新版阵列还有一个不同 ...

  9. CAD高版本窗体阵列LISP_CAD高版本窗体阵列LISP_AutoCAD高版本怎么把阵列对话框调出来?...

    AutoCAD低版本阵列ARRAY命令的参数设置用是对话框形式,到了高版本使用功能区界面后,不再使用对话框,而是会在功能区弹出一个"阵列"选项卡,如下图所示. 新版阵列还有一个不同 ...

最新文章

  1. php 单词替换,如何在PHP中替换字符串中的单词?
  2. PL/SQL学习笔记(四)
  3. 计算机网络最佳路由,优化计算机网络路由的策略
  4. html自定义属性冒号,vue中标签上的属性加冒号与不加冒号的区别
  5. Python(5):循环
  6. iNeuOS工业互联网操作系统部署在华为欧拉(openEuler)国产系统
  7. Redis缓存,你真的懂了吗
  8. LeetCode 717. 1-bit and 2-bit Characters
  9. 计算机技能大赛简报,网络攻防比赛简报
  10. 整洁代码--写好注释
  11. c# Winform登陆界面设计,登陆用户不同权限设置
  12. javascript 纯前端实现汉字转拼音 —— pinyin-pro 库
  13. Java邮件发送基于springboot实现
  14. android模拟器如何增加RAM
  15. 路由与交换 实验一 路由器基本配置
  16. 对于因果模型的常见评估函数:SHD 和 FDR
  17. 小程序头像和昵称填写能力用底部弹框界面实现
  18. shtml 是什么?
  19. SoClean!磁盘清理软件
  20. Java 操作excel 插入删除列,插入删除图片

热门文章

  1. Ubuntu卸载java
  2. 1路电磁继电器模块的使用方法的直观理解
  3. 有哪些视频剪辑软件比较好用?
  4. 戴尔windows10桌面计算机,戴尔笔记本自带的win10系统怎么进行优化?
  5. 安徽省抽检安防监控摄像机产品质量合格率75%
  6. 分子量(Molar Mass)
  7. 清华大学计算机系教授武汉理工大学,清华大学脑与智能实验室导师教师师资介绍简介-胡晓林...
  8. web前端入门到实战:CSS 滚动捕捉技术(Scroll Snapping)
  9. AMQP协议简介(源自官网的翻译)
  10. 新项目流程4--快捷函数