当前位置: 首页 > article >正文

某oa命令执行漏洞挖掘思路

《网安面试指南》icon-default.png?t=O83Ahttp://mp.weixin.qq.com/s?__biz=MzkwNjY1Mzc0Nw==&mid=2247484339&idx=1&sn=356300f169de74e7a778b04bfbbbd0ab&chksm=c0e47aeff793f3f9a5f7abcfa57695e8944e52bca2de2c7a3eb1aecb3c1e6b9cb6abe509d51f&scene=21#wechat_redirect

《Java代码审计》icon-default.png?t=O83Ahttp://mp.weixin.qq.com/s?__biz=MzkwNjY1Mzc0Nw==&mid=2247484219&idx=1&sn=73564e316a4c9794019f15dd6b3ba9f6&chksm=c0e47a67f793f371e9f6a4fbc06e7929cb1480b7320fae34c32563307df3a28aca49d1a4addd&scene=21#wechat_redirect

《Web安全》icon-default.png?t=O83Ahttp://mp.weixin.qq.com/s?__biz=MzkwNjY1Mzc0Nw==&mid=2247484238&idx=1&sn=ca66551c31e37b8d726f151265fc9211&chksm=c0e47a12f793f3049fefde6e9ebe9ec4e2c7626b8594511bd314783719c216bd9929962a71e6&scene=21#wechat_redirect

前段时间看到某系统爆出一个RCE,随后找到了源码对漏洞进行分析,并利用历史漏洞找到了其他突破点,进而找到新的漏洞。

前段时间看到某系统爆出一个RCE,随后找到了源码对漏洞进行分析,并利用历史漏洞找到了其他突破点,进而找到新的漏洞。

0x01 历史漏洞分析

首先来看一个历史漏洞,Ognl表达式注入导致RCE,具体payload如下

POST /common/common_sort_tree.jsp;.js HTTP/1.1
Host: xx.xx.xx.xx
Accept-Encoding: gzip, deflate
Content-Length: 174
Accept-Language: zh-CN,zh;q=0.8
Accept: */*
User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:5.0) Gecko/20100101 Firefox/5.0 info
Accept-Charset: GBK,utf-8;q=0.7,*;q=0.3
Connection: close
Cache-Control: max-age=0
Content-Type: application/x-www-form-urlencoded

rootName={%25Thread.@fe.util.FileUtil@saveFileContext(new%20java.io.File("../web/fe.war/123.jsp"),new%20sun.misc.BASE64Decoder().decodeBuffer("d2hvYW1p"))%25}

首先该系统在未登录的状态下默认是无法直接访问一些jsp文件的

web.xml中可以看到对jsp的使用的过滤器

image-20240104160205503

查看ControllerFilter5中的doFilter

image-20240104160356868

发现会判断uri的结尾是否是.jsp,判断jsp是否在白名单列表里,如果不在则返回302重定向到登陆页面,可以可以利用tomcat特性使用;绕过,因为 在URL中遇到;号会将;xxx/中的分号与斜杠之间的字符串以及分号本身都去掉,当然也可以用url编码绕过,这点在这里不做过多分析。

然后通过payload可以看到漏洞点在common_sort_tree.jsp,并且Ognl表达式通过rootName参数传递并执行,然后查看具体代码:

image-20240103143412286

通过查看该jsp文件可以看到rootName通过传参得到,然后传入builder.buildExp方法

image-20240103161201521

传入的语句首先会进行compiler生成一个列表,这个方法的主要功能是将输入的表达式进行编译,生成子表达式的列表,并在必要时替换原始表达式中的子表达式。该方法使用了一些标签和映射(startMapstopMap)来辅助解析和替换。

image-20240104102252861

然后在bean.xml中定义了一个parseMap 它表示了每个标签所对应的类方法,例如在payload中使用的是{%%}就对应使用的是objectValueParseImplbean 的标识符

image-20240104105559790

然后使用该类的实现作为 bean 的实例。.

然后在初始化方法的时候,遍历parseMap,并且取前两个字符和后两个字符分别作为start(起始符)和stop(结束符)

image-20240109111700053

然后使用this.analyse.addParse,生成mapValue

image-20240109111729020

然后使用tanalyse.analy进行分析并返回结果

image-20240103162218299

analy中提取开始标签和结束标签和内容content

image-20240103185239728

然后再这个analy方法中,首选会确定需要调用的函数,使用this.mapValue通过stop也就是尾部标识符获取对应的类名,这里的this.mapValue是一个hashmap,然后使用最下面的p.load调用对应的方法。在该方法中然后调用了getValue,这里代码就省略了

image-20240103162416212

最终到达Ognl.getValue并执行Ognl语句造成RCE。

0x02 其他漏洞发现

了解完了历史漏洞触发的流程,可以发现漏洞的根本原因是最开始的builder.buildExp方法对参数过滤不严格造成的,如果按照这个思路去找漏洞,可以看看还有哪里调用了这个方法,并且参数是否可控。

image-20240103163818411

image-20240103163848599

分别在jsp和jar包中搜索相关关键字,发现没有其他的引用。

但是当我们回头看这个类中所定义的其他方法时,发现了其他和buildExp相似的方法

例如build,他和buildExp除了方法名不一样内容都是一样的

image-20240103164236167

包括其他方法,也有简介的调用了build方法,例如:

image-20240103164410533

所以这就大大扩大了我们的寻找范围,通过正则[\.| ]+builder\.build,找到了很多调用的地方,接下来就是看看哪些参数可控

image-20240103165331976

这里找到其中一个,也就是上图搜索结果中的第一个:

image-20240103165822965

但是这里的event会经过loginInvokeCtrl.formatLogic的格式化,在这个函数中,会在logic前后加上标识符,

image-20240103170115194

但这并不影响,因为在build中的compiler会一层一层剥离语句,首先会执行最内层的标签里的语句。

接着继续追踪executeLogic看哪些地方调用了

image-20240103170651832

execute中,这两处均被调用了,并且参数时通过request.getParameter获得的,也是可控的。

但是该语句是在一个if判断条件中,需要满足用户登录或者指定的methodName和springId,这两个值也是通过request.getParameter直接获取到的

image-20240103171241635

然后继续向上追踪,终于找到了触发的地方doPost

image-20240105145820920

同样找到了它的url映射路径。至此,请求路径,以及所有的请求参数都是可控的,且请求参数可以直接传递到具有漏洞的方法里。


http://www.kler.cn/news/309567.html

相关文章:

  • 网络安全。
  • 数学建模笔记——动态规划
  • Vue3中集成高德地图并实现平移缩放功能
  • 如何搭建一个ip池用来做数据抓取用
  • MFC工控项目实例之十四模拟量信号名称从文件读写
  • uniapp上使用document方案之renderjs
  • 回收站数据怎么恢复?用这 5 种方法,准能恢复回收站数据!
  • 基于SpringBoot+定时任务实现地图上绘制车辆实时运动轨迹图
  • Pr:Adobe SRT
  • React中forwardRef()的作用?
  • python多进程程序设计 之二
  • 基于深度学习的文本引导的图像编辑
  • 【我的 PWN 学习手札】Largebin Attack(< glibc-2.30)
  • linux-Shell 编程-Shell 脚本基础
  • lvs命令介绍
  • k8s部署jumpserver4.0.2
  • Redis(redis基础,SpringCache,SpringDataRedis)
  • golang学习笔记24——golang微服务中配置管理问题的深度剖析
  • Unity3D 游戏数据本地化存储与管理详解
  • 深度智能:迈向高级时代的人工智能
  • ELK 日志分析
  • 十五、谷粒商城- 报错汇总
  • 16个AI应用技巧,职场提升永远可以相信!
  • 新书速览|NestJS全栈开发解析:快速上手与实践
  • C#通过MXComponent与三菱PLC通信
  • vue2基础系列教程之v-model及面试高频问题
  • CSP-J 算法基础 广度优先搜索BFS
  • 展锐平台手机camera 软硬件架构
  • 2024ICPC网络赛第一场
  • 【源代码+仿真+原理图+技术文档+演示视频+软件】基于物联网技术的宠物居家状况监测系统设计与实现