为了避免泄露目标信息
所有环境均为在本地重新部署
登录页面随手一试,发现可爆破,账号密码均是base64编码传输的
通过信息搜集已经知道目标习惯用姓名全拼作为账号,直接上top500配合123456
跑一波弱口令,很简单就拿到一个普通员工账号
liuwei/123456
但找了一圈貌似没什么用啊,里面功能主要就是各种流程表单,拿不到权限,上传只要不是图片、文档、压缩包之类的格式,统一都强制加了后缀
通讯录有目标所有人员的账号,爆来爆去也都是一样的员工账号权限,管理员密码比较复杂
看了一下是某OA的2.2.7版本的,不过已公开的漏洞都被修了,看来是被打怕了
刚好是开源的,直接github找了一波历史版本代码分析,历史版本没有2.2.7的了,只能拿最接近的2.3.1来分析
先是通过敏感函数readdir()
找到位于/include/chajian/fileChajian.php
中的getfilerows()
函数
妥妥的一个列目录下文件的功能,目录参数就是函数传入的参数$path
寻找哪里调用了getfilerows()
只有两处调用了,第二处明显传入的是一个固定值
来看第一个函数:/webmain/system/beifen/beifenAction.php
中的getdatssssAjax()
函数
69行获取了POST参数folder
,70行将folder
拼接进''.UPDIR.'/data/'.$folder.''
全局查找UPDIR,值为upload
,所以目录的前缀文件夹是/upload/data/
71行通过getfilerows()
函数获取该路径下的文件列表
72~91行,对文件列表进行遍历,然后存储到一个json数组中,其中id
值就是文件名
至此第一个漏洞诞生,根据该系统的路由构造请求地址:
POST /index.php?a=getdatssss&m=beifen&d=system&ajaxbool=true
Cookie: xxxxx
folder=./
这个时候就考虑读哪个目录的文件列表有价值了,注意,只能看目录,目前还没有任意文件读取的漏洞
这套代码是php写的,身份认证是通过SESSION
,部署在Linux上,那么可以直接读取/tmp
目录(php默认session文件存放路径)
sess_
开头的文件就是php的session
文件,直接将sess_
后面的值替换为Cookie
中的PHPSESSID
值,然后判断一下用户名,看看能不能碰到管理员
运气好,直接一个管理员
替换cookie后拿到管理员账号
这时候尝试了网上其他很多漏洞,比如保存配置文件getshell之类,均失败告终,还得靠自己啊
于是第二个CVE在来的路上了
首先在系统管理翻了翻,发现一个有趣的功能【系统工具-插件模块】
这里有一个本地上传安装功能,在本地测试的时候发现默认不开启
吸引我的是第四个插件,UEditor
既然能够安装UEditor类的插件,也能够本地上传安装,那么能不能直接安装一个webshell
先随便搞了个zip包传上去抓包
点击确定后报错:无效安装包
上传功能是一个通用的上传口,获取安装zip信息的接口地址是/index.php?a=loadinstallinfo&m=upgrade&d=system&ajaxbool=true&rnd=920584&path=dXBsb2FkLzIwMjMtMDQvMTlfMDc0MjI2OTIuemlw
根据路由找到对应的php文件:/webmain/system/upgradeAction.php
中的loadinstallinfoAjax()
函数
压缩过的文件,格式化之后
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编码
回到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");
然后随便找个上传点传上去
得到zip包路径为upload/2023-04/19_08203127.zip
,编码后为dXBsb2FkLzIwMjMtMDQvMTlfMDgyMDMxMjcuemlw
然后请求
GET /index.php?a=loadinstallinfo&m=upgrade&d=system&ajaxbool=true&rnd=920584&path=dXBsb2FkLzIwMjMtMDQvMTlfMDgyMDMxMjcuemlw
此时查看/tmp目录,已经生成了shell.txt
Nice!搞定
(CVE-2023-49512)
那么第三个cve是怎么来的呢
说来惭愧,在分析完代码后,本地测试时用最新版测试老失败,然后看了下推送历史,发现在2.5.5版本更新了beifenAction.php
于是第三个CVE(CVE-2023-49512)就到手了,你看懂了吗😎
欢迎老板们打赏小鱼干💰
原文始发于微信公众号(Wax Today):三个CVE拿下某开源OA
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论