声明:本文章仅作为网安知识分享

前言

这里浅记一次在项目中挖到的泛微OA的垂直越权漏洞,还挺有趣,数据查询的数据包不是直接用明文传输查询关键字段,需结合两个数据包来实现越权访问,感觉挺有意思的。

泛微OA系统界面 泛微OA系统界面

漏洞发现过程

这次垂直越权的接口是管理员的系统操作日志查询接口,普通用户前台没有该接口,通过管理员账号查看系统日志发现关键接口:

/api/xxx/xxx/xxx/datas 获取日志接口
日志查询接口数据包

该数据包用于获取系统日志记录,其中 datakey 为核心字段,用于负责传输对应查询的数据类型,低权限用户可直接使用该数据包进行越权查询系统日志记录。但是该数据包时间久了再次发包就会提示"页面停留过久,请刷新后重试",因此猜测该字段是由时间戳和查询日志的相关参数加密后生成,必须得让低权限账号也能生成该 datakey 才能成为有效的越权操作。

datakey时间校验提示

关键突破

后面又仔细回看了一遍获取日志记录的所有数据包,发现 datakey 是由该接口:

/api/xxx/xxx/xxx/getPagingResult

从直接后端返回,没有办法进行逆向破解,但好在该接口也可以越权操作。

getPagingResult接口返回datakey

这里数据包来自管理员账号,一开始犯了个错——只将 cookie 进行了替换,没有注意其中的 userid 参数,user=1 为管理员 id,并未修改为普通账号对应的 id,发包就提示"您没有该权限!"

差一点就放弃了,后来又转回来看一圈,尝试在这个数据包对 userid 进行 fuzz,将 0-200 都尝试了一遍,发现对应账号的 userid 可以成功拿到返回 sessionkey。

fuzz userid成功获取sessionkey

最终利用

日志查询数据包再添加 pageSize 字段控制返回结果大小,以获取全部系统日志记录。再通过结合 /api/xxx/xxx/xxx/getPagingResult 接口越权获得实时更新的 sessionkey(datakey),防止出现"页面停留过久,请刷新后重试"的提示。

漏洞总结

漏洞类型垂直越权(普通用户访问管理员功能)
影响系统泛微OA
涉及接口/api/xxx/xxx/xxx/datas(查询日志)、/api/xxx/xxx/xxx/getPagingResult(获取 datakey)
利用关键① 替换 cookie 为低权限用户;② fuzz userid 参数(0-200)获取对应 sessionkey;③ 两个接口结合使用绕过时间校验
漏洞效果普通用户可越权查询管理员系统操作日志记录