三个CVE拿下某开源OA

admin 2023年12月10日08:22:51评论59 views字数 2764阅读9分12秒阅读模式


  今日更新主题:遇到某OA系统的过程比较有趣,在此记录。
为了避免泄露目标信息
所有环境均为在本地重新部署
​仅为演示思路。




三个CVE拿下某开源OA


起手




登录页面随手一试,发现可爆破,账号密码均是base64编码传输的

三个CVE拿下某开源OA

通过信息搜集已经知道目标习惯用姓名全拼作为账号,直接上top500配合123456跑一波弱口令,很简单就拿到一个普通员工账号

liuwei/123456

三个CVE拿下某开源OA

但找了一圈貌似没什么用啊,里面功能主要就是各种流程表单,拿不到权限,上传只要不是图片、文档、压缩包之类的格式,统一都强制加了后缀

通讯录有目标所有人员的账号,爆来爆去也都是一样的员工账号权限,管理员密码比较复杂

看了一下是某OA的2.2.7版本的,不过已公开的漏洞都被修了,看来是被打怕了

三个CVE拿下某开源OA

刚好是开源的,直接github找了一波历史版本代码分析,历史版本没有2.2.7的了,只能拿最接近的2.3.1来分析

第一个CVE




(CVE-2023-49514)

先是通过敏感函数readdir()找到位于/include/chajian/fileChajian.php中的getfilerows()函数

三个CVE拿下某开源OA

妥妥的一个列目录下文件的功能,目录参数就是函数传入的参数$path

三个CVE拿下某开源OA

寻找哪里调用了getfilerows()

三个CVE拿下某开源OA

只有两处调用了,第二处明显传入的是一个固定值

来看第一个函数:/webmain/system/beifen/beifenAction.php中的getdatssssAjax()函数三个CVE拿下某开源OA

69行获取了POST参数folder,70行将folder拼接进''.UPDIR.'/data/'.$folder.''

全局查找UPDIR,值为upload,所以目录的前缀文件夹是/upload/data/

三个CVE拿下某开源OA

71行通过getfilerows()函数获取该路径下的文件列表

72~91行,对文件列表进行遍历,然后存储到一个json数组中,其中id值就是文件名

至此第一个漏洞诞生,根据该系统的路由构造请求地址:

POST /index.php?a=getdatssss&m=beifen&d=system&ajaxbool=true
Cookie: xxxxx

folder=./

三个CVE拿下某开源OA

这个时候就考虑读哪个目录的文件列表有价值了,注意,只能看目录,目前还没有任意文件读取的漏洞

这套代码是php写的,身份认证是通过SESSION,部署在Linux上,那么可以直接读取/tmp目录(php默认session文件存放路径)

三个CVE拿下某开源OA

sess_开头的文件就是php的session文件,直接将sess_后面的值替换为Cookie中的PHPSESSID值,然后判断一下用户名,看看能不能碰到管理员

运气好,直接一个管理员

三个CVE拿下某开源OA

替换cookie后拿到管理员账号

三个CVE拿下某开源OA

这时候尝试了网上其他很多漏洞,比如保存配置文件getshell之类,均失败告终,还得靠自己啊

于是第二个CVE在来的路上了


第二个CVE




(CVE-2023-49513)

首先在系统管理翻了翻,发现一个有趣的功能【系统工具-插件模块】

三个CVE拿下某开源OA

这里有一个本地上传安装功能,在本地测试的时候发现默认不开启

吸引我的是第四个插件,UEditor

既然能够安装UEditor类的插件,也能够本地上传安装,那么能不能直接安装一个webshell

先随便搞了个zip包传上去抓包

三个CVE拿下某开源OA

点击确定后报错:无效安装包

三个CVE拿下某开源OA

上传功能是一个通用的上传口,获取安装zip信息的接口地址是/index.php?a=loadinstallinfo&m=upgrade&d=system&ajaxbool=true&rnd=920584&path=dXBsb2FkLzIwMjMtMDQvMTlfMDc0MjI2OTIuemlw

三个CVE拿下某开源OA

根据路由找到对应的php文件:/webmain/system/upgradeAction.php中的loadinstallinfoAjax()函数

压缩过的文件,格式化之后

三个CVE拿下某开源OA

674行,判断adminid是不是为1,还好通过第一个漏洞拿到了adminid为1的账号权限

675~681行, 获取GET参数path并赋值给$nwsp变量,如果为空则退出,否则对参数值进行base64解码

682~691行,判断$nwsp值是否为数值字符串,数值字符串则通过官方的api接口去下载对应id的插件,否则用zipget()函数处理$nwsp

全局搜索找到了zipget()函数,位于/include/chajian/zipChajian.php,很简单的一个获取zip包文件函数,比较坑的是65行对文件内容进行了base64编码

三个CVE拿下某开源OA

回到loadinstallinfoAjax()函数接着看

$nwsp值不数值时,会对$nwsp所在的压缩包文件提取,赋值给$farr变量

692行,拼接一个路径字符串,值为/upload/logs/+md5($nwsp)

697~710行,对$farr变量进行遍历,并挨个生成文件到新的路径,比较给力的是705行和708行对刚才提取时做的base64编码进行了解码

711~712行,会判断生成路径下是否存在/installconfig/xinhuoa_config.php文件,不存在则退出

713行,直接包含/installconfig/xinhuoa_config.php文件???WTF???

还读什么代码,第二个CVE文件包含漏洞到手

总结一下利用条件:

  • zip包中需要存在/installconfig/xinhuoa_config.php文件

  • zip包需要在服务器上,并且路径名称base64编码后传递到GET参数path中

先本地制作一个zip包,xinhuoa_config.php写入

<?php file_put_contents("/tmp/shell.txt", "wax");

然后随便找个上传点传上去

三个CVE拿下某开源OA

得到zip包路径为upload/2023-04/19_08203127.zip,编码后为dXBsb2FkLzIwMjMtMDQvMTlfMDgyMDMxMjcuemlw

然后请求

GET /index.php?a=loadinstallinfo&m=upgrade&d=system&ajaxbool=true&rnd=920584&path=dXBsb2FkLzIwMjMtMDQvMTlfMDgyMDMxMjcuemlw

三个CVE拿下某开源OA

此时查看/tmp目录,已经生成了shell.txt

三个CVE拿下某开源OA

Nice!搞定


第三个CVE




(CVE-2023-49512)

那么第三个cve是怎么来的呢

说来惭愧,在分析完代码后,本地测试时用最新版测试老失败,然后看了下推送历史,发现在2.5.5版本更新了beifenAction.php

三个CVE拿下某开源OA

于是第三个CVE(CVE-2023-49512)就到手了,你看懂了吗😎


欢迎老板们打赏小鱼干💰



原文始发于微信公众号(Wax Today):三个CVE拿下某开源OA

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2023年12月10日08:22:51
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   三个CVE拿下某开源OAhttp://cn-sec.com/archives/2284138.html

发表评论

匿名网友 填写信息