某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-urlencodedrootName={%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.xdnf.cn/news/1537970.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

图像修复(Inpainting)技术的前沿模型与数据集资源汇总

图像修复(Image Inpainting)是一种计算机视觉技术,旨在填补图像中的缺失区域或去除图像中的不需要部分,使其看起来自然且无明显痕迹。其目标是根据图像的上下文信息和周围像素来推断和重建缺失区域的内容,以生成逼真且…

《机器学习》周志华-CH7(贝叶斯分类)

7.1贝叶斯决策论 对分类任务而言,在所有相关概率已知的理想情形下,贝叶斯决策论考虑如何基于这些概率核误判损失来选择最优的类别标记。 R ( x i ∣ x ) ∑ j 1 N λ i j P ( c j ∣ x ) \begin{equation} R(x_{i}|x)\sum_{j1}^{N}\lambda_{ij}P(c_{j}…

DTMF2str集成工具

DTMF2str 项目地址: baicaiyihao/DTMF2str: DTMF解码并转换为字符串 (github.com) 用于CTF中misc DTMF题中,方便ctfer解题。 注:工具根据现有的一些题型进行编写的,如果有无法解出的题型可以提issus后续进行完善。 工具功能&a…

C++独立开发开源大数计算库 CBigNum

项目简介&项目地址 CBigNum 是本人独立开发开源的一款大数计算库,支持任意位数整数带任意位数小数的浮点运算。您可以通过本库执行非常大的数据运算或非常高精度的除法运算(您可以随意指定除法的小数保留到第几位)。 项目地址:https://github.com/…

MATLAB路径规划如何采用矢量法让他们尽量在一个方向??

🏆本文收录于《CSDN问答解惑-专业版》专栏,主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收…

HTML | 外部引入 CSS 的2种方式:link和@import有什么区别?

外部引入 CSS 有2种方式,link 和 import。就结论而言,强烈建议使用 link ,慎用 import 方式。 两者都是外部引用 CSS 的方式,但是存在一定的区别: (1)从属关系区别 link是HTML / XHTML标签&a…

误删分区后的数据救赎恢复实战解析

在数字化时代,数据不仅是信息的载体,更是个人记忆与企业资产的宝贵财富。然而,误删分区这一操作失误,却如同暗流涌动,悄无声息地吞噬着用户的重要数据。本文将深入探讨误删分区的现象、影响,并详细介绍一种…

Linux运维培训班靠谱吗?如何判断一个培训班的教学质量?

当我们下定决心打算系统培训Linux运维时,哪家机构比较好成为了我们面临的最大难题。之前分享过很多培训机构的个人感受,但授人以鱼不如授人以渔,说到底那些都是我个人的看法,因此今天打算帮助大家学会如何判断一个培训班的好坏。 …

C# 修改项目类型 应用程序程序改类库

初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github:codetoys,所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的,可以在任何平台上使用。 源码指引:github源…

72、Python之函数式编程:纯函数与lambda表达式

引言 今天聊点简单的,也就是“纯函数”。任何一个函数只要满足纯函数的两个特性,就是纯函数。纯函数与lambda表达式,其实没有必然的联系。只是由于lmbada表达式比较简洁,很多时候可以作为纯函数的一种实现方式。 本文的主要内容…

PointNet++改进策略目录

后续我将如何使用文章中创新点加入的PointNet中代码实现部分进行更新 题目原理解析代码改进PointNet改进策略 :模块改进 | LFA | RandLA-Net,通过随机采样与局部特征聚合提升大规模3D点云处理效率✔️❌PointNet改进策略 :模块改进 | Residua…

【网络】详解HTTP协议的CGI机制和CGI进程

目录 引言 CGI机制模型 伪代码示例 个人主页:东洛的克莱斯韦克-CSDN博客 引言 CGI机制是HTTP协议提供的偏底层的一套机制,也是非常重要的机制——它让大量的业务进程和HTPP协议解耦。而CGI进程是业务层的,用来处理各种数据,比…

1分钟解锁AI绘本财富密码:从0到10万粉,她只用了三步!

在这个信息爆炸的时代,我们每天都在为生活奔波,赚钱似乎变得越来越难。记得小时候,我们总是梦想着能有一种魔法,让书本里的金币自动飞入脑中,但现实却是残酷的我们只能眼睁睁地看着那些遥不可及的梦想。然而&#xff0…

Selenium with Python学习笔记整理(网课+网站)

本篇是根据学习网站和网课结合自己做的学习笔记,后续会一边学习一边补齐和整理笔记 官方学习网站在这获取: https://selenium-python.readthedocs.io/getting-started.html#simple-usage WEB UI自动化环境配置 (推荐靠谱的博客文章来进行环境配置,具…

再次被对地观测拒稿

又拒稿了,这次应该不是没法修改了,范围不一样,准备改投其他期刊了。 创新性不够说明还难以达到1区的要求,继续先投着一区试试吧,不行再降了 所以说还需要一开始就对照期刊范围来写,比较有针对性。

apk反编译修改教程系列-----修改apk 去除软件加固状态 应用加固的一些常识与检测【二十六】

目前很多apk应用有加固。其中包括如360加固、腾讯乐固等,厂商无非是把一系列的混淆、加密、隐藏、检测等技术组合起来,封装好给你使用。真实的目的就是防止APK被调试 。呗任意修改。此博文普及一些加固的基本常识。后续实例演示一些apk去加固的步骤。 通过博文了解 1-----a…

OpenAI的o1模型与Transformer的无限潜力:数学证明推理算力无上限

近期,斯隆奖得主马腾宇和Google Brain推理团队创始人Denny Zhou合作,提出了一项引人注目的数学证明:只要思维链(CoT)足够长,Transformer就有能力解决各种复杂问题。这一发现引发了广泛关注,因为…

智能BI项目第三期

AIGC AI 提问技巧 为了让 Al 更好地理解我们的输入,并给出预期精确的输出,需要严格控制我们的提问词。 1.使用系统预设 控制输入格式(便于Al精确地理解我们的需求) 你是一个数据分析师和前端开发专家,接下来我会按照以下固定格式给你提供…

【开源免费】基于SpringBoot+Vue.JS在线文档管理系统(JAVA毕业设计)

本文项目编号 T 038 ,文末自助获取源码 \color{red}{T038,文末自助获取源码} T038,文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析 六、核心代码6.1 查…

<<编码>> 第 14 章 反馈与触发器(1)--振荡器 示例电路

继电器振荡器 info::操作说明 无需操作, 保持控制开关常闭以形成振荡 如需停止振荡, 则断开控制开关 注: 要看到灯闪烁的效果, 右上角 “仿真速度” 控制杆应设置为一个较低的位置(靠左侧) 另: 因继电器内部开关跳动动画效果耗时太长, 即便设置为较低的仿真速度也无法观察到开关…