代码审计-CVE-2023-6654-PHPEMS-加密-解密分析

路由:
在这里插入图片描述
入口方法:
在这里插入图片描述
鉴权分析:
在这里插入图片描述
由此可以得出 鉴权是由session类负责获取参数后,由各个类的魔术方法负责:(在此还有一个方法 全局搜索登录关键词)

在这里插入图片描述
1、断点分析:
寻找鉴权点分析(我在文章的操作相关目录下面的app.php类打断点 因为此处打断点后 只需要刷新就会进行鉴权)

在这里插入图片描述
刷新后 步进 来到了session类里

在这里插入图片描述
再次步入后来到 ev类里 该类是一些工具类 如设置或者获取cookie等

在这里插入图片描述
再次步入 来到了 今天的主角 strings类 也就是字符串处理类 在保存cookie或者获取cookie时 先得进行字符串处理 也就是加密和解密 同时该程序在传递信息时 是采用直接传递对象的形式 也就是说存在序列化和反序列化 这样也就引发了 反序列化漏洞 该漏洞的cve 为:CVE-2023-6654
在这里插入图片描述
在客户端访问时 还会调用session类中的getSessionId方法,该方法先判断cookie中是否有用户信息,如果没有 则取信息后调用该类中的 setSessionUser方法,设置cookie,在设置cookie时,进行序列化操作后在加密保存在cookie里

前面提的这些网络安全技术我都整理录制成了视频教程,是我粉丝我都可以无偿分享。

在这里插入图片描述

2、加、解密分析
加密:

public function encode($info){ i n f o = s e r i a l i z e ( info = serialize( info=serialize(info); //先进行序列化操作 $key = CS; // CS为全局常量 在index.php时就引入了全局配置 k l = s t r l e n ( kl = strlen( kl=strlen(key); // 取密匙的长度 i l = s t r l e n ( il = strlen( il=strlen(info); // 取序列化后的文本长度 for($i = 0; $i < $il; $i++) { $p = i i% ikl; // 进行取余操作 i n f o [ info[ info[i] = chr(ord( i n f o [ info[ info[i])+ord( k e y [ key[ key[p])); // 将 i n f o 字符串中第 i 个字符的 A S C I I 值和 info字符串中第i个字符的 ASCII值和 info字符串中第i个字符的ASCII值和key字符串中第p个字符的ASCII值相加,然后将结果转换为对应的字符。这里是重点!!! } return urlencode($info); }
解密:

public function decode($info){ $key = CS; i n f o = u r l d e c o d e ( info = urldecode( info=urldecode(info);//进行url解码 k l = s t r l e n ( kl = strlen( kl=strlen(key); i l = s t r l e n ( il = strlen( il=strlen(info); for($i = 0; $i < $il; $i++) { $p = i i% ikl; i n f o [ info[ info[i] = chr(ord( i n f o [ info[ info[i])-ord( k e y [ key[ key[p])); // 将 i n f o 字符串中第 i 个字符的 A S C I I 值和 info字符串中第i个字符的 ASCII值和 info字符串中第i个字符的ASCII值和key字符串中第p个字符的ASCII值相减,然后将结果转换为对应的字符。
} i n f o = u n s e r i a l i z e ( info = unserialize( info=unserialize(info);// 进行反序列化 return $info; }
由上面的加密和解密的关系中 我得到这样的关系:

加密前 = 加密后 - 密匙
加密后 = 加密前 + 密匙
密匙 = 加密后 - 加密前
如果想使用该反序列化漏洞 就得先加密后 传入cookie中即可触发。但是该程序中得密匙是可以随机定义的,在全局配置文件中的CS常量:

define(‘CS’,‘1hqfx6ticwRxtfviTp940vng!yCQK6’);//请随机生成32位字符串修改此处值
由此可知道,密匙的长度固定 且为 32位字符如果想知道密匙就必须得到逆向加密算法,由我们上面的关系可以得到:密匙 = 加密后 – 加密前

function getkey( i n f o e n , info_en, infoen,info_de){ i l = s t r l e n ( il = strlen( il=strlen(info_en); $kl = 32; //密匙长度固定且为 32 k e y = " " ; f o r ( key = ""; for( key="";for(i = 0; $i < $il; $i++) { $p = i i% ikl; k e y . = c h r ( o r d ( key .= chr(ord( key.=chr(ord(info_en[ i ] ) − o r d ( i])-ord( i])ord(info_de[$p])); // 密匙 = 加密后 - 加密前 } return $key;}
逆向密匙的算法已经搞定了,但是我们还需要 加密前和加密后的信息,并且该信息我们可以直接获得,而且存在共性,也就是在该程序中固有的,

直接用本地调试的办法,获取本地的cookie,使用解密函数直接解密,因为知道密匙可以直接解密。

a:3:{s:9:“sessionid”;s:32:“68769deac60feeeef448e67e1d6f6ace”;s:9:“sessionip”;s:9:“127.0.0.1”;s:16:“sessiontimelimit”;i:1706884249;}
密匙的长度固定为32位 所以要获取固定的 32位,因为存在取余的情况,起始最好的显示结果为 32的整数倍,其他的显示结果需要拼接。

那么我们在分析由哪些方法设置了cookie即可。

在之前的session类中getSessionId方法,就存在设置cookie的操作,并且在设置cookie前 还进行了加密。

在这里插入图片描述
在这里插入图片描述

由此可知,向cookie中储存了 sessionid的id和ip信息,还有创建时间,然后代码审计可得:该程序的sessionid储存在cookie的作用是:用于数据库查询 表名为:x2_session

在这里插入图片描述
可控部分为:

";s:9:“sessionip”;s:9:“127.0.0.1”;s:16:“sessiontimelimit”;i:17068
取32的整数倍 为64后 :”sessionip”;s:9:”127.0.0.1″;s:1刚刚好都是可控的,那么就直接使用函数进行逆向密匙结果:

完整代码为:

function getkey( i n f o e n , info_en, infoen,info_de){ i l = s t r l e n ( il = strlen( il=strlen(info_en); $kl = 32; //密匙长度固定且为 32 k e y = " " ; f o r ( key = ""; for( key="";for(i = 0; $i < $il; $i++) { $p = i i% ikl; k e y . = c h r ( o r d ( key .= chr(ord( key.=chr(ord(info_en[ i ] ) − o r d ( i])-ord( i])ord(info_de[$p])); // 密匙 = 加密后 - 加密前 } return KaTeX parse error: Expected 'EOF', got '}' at position 5: key;}̲info_en = “%2592%25A2%25A4%25A0%25F3%25A9%25AE%25A2%259D%2599%25C5%25DD%25E7%25D9%25DF%25D8%25C2%25D9%259DVk%25E9%25A8%259AS%25B3e%25BF%25B3%2584%25C2f%2592%25CD%25A9%25CC%25DE%259A%25A6%25A1%259C%25A7%2583%25DD%25D5%25C8%25DB%259C%2586%25D5l%2599e%25AD%25A1%259FX%25AF%257C%2580%258C%25BE%2598ok%258A%25E4%25CB%25EB%25A9%25DD%25D8%25D1%25E0%25C2%259A%25AF%25D9%25B0%25A2%258E%2592jfg%25A4%259E%2595Q%25A7t%2580%258C%25BE%2598gg%25A2%2593%25D9%25DD%25A9%25E7%25D2%25D2%25E5%25C6%25E1%25E1%25CB%25E2%25D2%25C1%25D9%25ADVk%25DF%25A8%2598X%25A9y%2597%2581%257C%2593oi%25A3%25EE”; i n f o e n = u r l d e c o d e ( info_en = urldecode( infoen=urldecode(info_en); i n f o e n = u r l d e c o d e ( info_en = urldecode( infoen=urldecode(info_en); i n f o d e = ′ a : 3 : s : 9 : " s e s s i o n i d " ; s : 32 : " 68769 d e a c 60 f e e e e f 448 e 67 e 1 d 6 f 6 a c e " ; s : 9 : " s e s s i o n i p " ; s : 9 : " 127.0.0.1 " ; s : 16 : " s e s s i o n t i m e l i m i t " ; i : 1706884249 ; ′ ; info_de = 'a:3:{s:9:"sessionid";s:32:"68769deac60feeeef448e67e1d6f6ace";s:9:"sessionip";s:9:"127.0.0.1";s:16:"sessiontimelimit";i:1706884249;}'; infode=a:3:s:9:"sessionid";s:32:"68769deac60feeeef448e67e1d6f6ace";s:9:"sessionip";s:9:"127.0.0.1";s:16:"sessiontimelimit";i:1706884249;;info_en = substr( i n f o e n , 64 , 32 ) ; info_en,64,32); infoen,64,32);info_de = substr($info_de,64,32);echo i n f o d e . " < / b r > " ; e c h o g e t k e y ( info_de."</br>";echo getkey( infode."</br>";echogetkey(info_en,$info_de);
两次urldecode是因为 一次在cookie中自动编码转换了,还有一次是在加密的时候进行了一次编码。

在这里插入图片描述
也可以取不是32的整数倍作为起始,那么得到的结果需要进行相应的拼接操作:
在这里插入图片描述
3、反序列化可用方法分析
在app/content/cls/api.cls.php中存在多个eval方法,但是引入这个类的方法都是需要登录操作,没办法利用。

在lib/pepdo.cls.php类中,存在多个执行数据库语句的方法。由此可以有限考虑利用

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

(十八)springboot实战——spring securtity注解方式的授权流程源码解析

前言 在上一节内容中&#xff0c;我们介绍了如何在FilterSecurityInterceptor过滤器中处理用户的授权流程&#xff0c;并分析了其源码&#xff0c;spring security还提供了方法级别的授权方式&#xff0c;通过EnableMethodSecurity注解启用权限认证流程&#xff0c;只需要在方…

SpringBoot 事务管理Transactional 数据回滚 数据一致性

SpringBoot 事务的属性rollbackFor 与 propagetion 介绍 SpringBoot当中的事物他保证了一致性&#xff0c;要么全部一起成功&#xff08;提交&#xff09;&#xff0c;要么一起失败&#xff0c;失败&#xff08;回滚&#xff09;后数据会回到当初的样子&#xff0c;是一组操…

No matching client found for package name ‘com.unity3d.player‘

2024年2月6日更新 使用Unity插件包方式接入&#xff08;Unity方式&#xff09;&#xff0c;且必须使用EDM(ExternalDependencyManager)&#xff0c;若已有ExternalDependencyManager文件夹&#xff08;其他SDK也可能带有&#xff09;则选用最新的即可。 工程Assets- E…

Qt网络编程-写一个简单的网络调试助手

环境 Windows&#xff1a;Qt5.15.2&#xff08;VS2022&#xff09; Linux&#xff1a;Qt5.12.12&#xff08;gcc) 源代码 TCP服务器 头文件&#xff1a; #ifndef TCPSERVERWIDGET_H #define TCPSERVERWIDGET_H #include <QWidget> namespace Ui { class TCPServerW…

Linux文件和目录管理

目录基础 Linux操作系统以目录的方式来组织和管理系统中的所有文件。所谓的目录&#xff0c;就是将所有文件的说明信息采用树状结构组织起来。每个目录节点之下会有文件和子目录。 所有一切都从 ‘根’ 开始&#xff0c;用 ‘/’ 代表, 并且延伸到子目录。 bin&#xff1a;B…

【RT-DETR有效改进】利用SENetV1重构化网络结构 (ILSVRC冠军得主)

👑欢迎大家订阅本专栏,一起学习RT-DETR👑 一、本文介绍 本文给大家带来的改进机制是SENet(Squeeze-and-Excitation Networks)其是一种通过调整卷积网络中的通道关系来提升性能的网络结构。SENet并不是一个独立的网络模型,而是一个可以和现有的任何一个模型相结合…

R语言学习case10:ggplot基础画图Parallel Coordinate Plot 平行坐标图

step1: 导入ggplot2库文件 library(ggplot2)step2&#xff1a;带入自带的iris数据集 iris <- datasets::irisstep3&#xff1a;查看数据信息 dim(iris)维度为 [150,5] head(iris)查看数据前6行的信息 step4&#xff1a;利用ggplot工具包绘图 plot5 <- ggparcoord(…

【ArcGIS微课1000例】0101:删除冗余节点或折点

文章目录 一、实验描述二、实验数据三、实验过程1. 手动删除2. 简化线工具四、注意事项一、实验描述 矢量数据获取通常来源于手动或者ArcScan自动采集,其基本存储方式就是记录每个要素的点坐标,如点要素就是一个坐标、线要素由多个点要素连接形成。当某段线要素被过多的节点…

单片机学习笔记---蜂鸣器工作原理

目录 蜂鸣器介绍 蜂鸣器的驱动方式 ULN2003D芯片工作原理 实战预备知识&#xff1a;基础乐理 音名的分组 全音和半音的关系 音高的表示 五线谱中的符号定义 简谱上的符号定义 C调音符与频率对照表 相关计算 蜂鸣器介绍 蜂鸣器是一种将电信号转换为声音信号的器件&a…

SaperaCamExpert(相机专家)中文使用指南

参考&#xff1a;SaperaCamExpert中文使用指南.PDF 文章目录 软件介绍安装首次打开资源占用率功能主界面布局菜单栏FileViewPre-Processing&#xff1a;预处理 Tools&#xff1a; 快捷键&#xff1a;新建&#xff1b;打开&#xff1b;保存&#xff1b;帮助Device窗体属性树图像…

Bytebase 签约 Vianova,助力欧洲城市交通智能平台中 Snowflake 和 PG 的变更自动化及版本控制

在数字化发展的浪潮中&#xff0c;自动化数据库变更管理成为提升产品上线效率、降低人为失误风险的关键工具&#xff0c;同时促进流程的一致性与标准化&#xff0c;确保合规性和变更的可追溯性。近日&#xff0c;数据库 DevOps 团队协同管理工具 Bytebase 签约欧洲交通数据管理…

网站被攻击有什么办法呢?

最近&#xff0c;德迅云安全遇到不少网站用户遇到攻击问题&#xff0c;来咨询安全解决方案。目前在所有的网络攻击方式中&#xff0c;DDoS是最常见&#xff0c;也是最高频的攻击方式之一。不少用户网站上线后&#xff0c;经常会遭受到攻击的困扰。有些攻击持续时间比较短影响较…

股票均线的使用方法和实战技术,看涨看空的均线形态与案例教学

一、教程描述 本套教程讲解了14种均线的特殊形态&#xff0c;通过直观图形以及大量案例的教学&#xff0c;将深奥、繁琐的均线变得生动与具体&#xff0c;广大投资者在认真学习以后&#xff0c;可以学会均线的使用方法&#xff0c;掌握最强的均线应用实战技术。本套教程不仅适…

Electron+Vue实现仿网易云音乐实战

前言 这个项目是我跟着官方文档的那个Electron入门教程大致跑了一遍,了解了下Electron开发流程之后的实战项目,所以中间应该是会有很多写法不是很规范,安全性有可能也没考虑到,可实现的各种api也不是很了解,适合初学者。 必须感谢 https://github.com/Binaryify/NeteaseC…

Postman接口与压力测试实例

Postman是一款功能强大的网页调试与发送网页HTTP请求的Chrome插件。它提供功能强大的 Web API & HTTP 请求调试。 1、环境变量和全局变量设置 环境变量可以使用在以下地方&#xff1a; URLURL paramsHeader valuesform-data/url-encoded valuesRaw body contentHelper fi…

工信部颁发的《计算机视觉处理设计开发工程师》中级证书

计算机视觉&#xff08;Computer Vision&#xff09;是一门研究如何让计算机能够理解和分析数字图像或视频的学科。简单来说&#xff0c;计算机视觉的目标是让计算机能够像人类一样对视觉信息进行处理和理解。为实现这个目标&#xff0c;计算机视觉结合了图像处理、机器学习、模…

[VulnHub靶机渗透] Misdirection: 1

&#x1f36c; 博主介绍&#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 hacker-routing &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【应急响应】 【python】 【VulnHub靶场复现】【面试分析】 &#x1f389;点赞➕评论➕收藏…

关于数字图像处理考试

我们学校这门科目是半学期就完结哦&#xff0c;同学们学习的时候要注意时间哦。 选择题不用管&#xff0c;到时候会有各种版本的复习资料的。 以下这些东西可能会是大题的重点&#xff1a; 我根据平时代码总结的&#xff0c;供参考 基本操作&#xff1a; 1.读图&#xff1a;…

HTTP和HTTPS区别!

http 是我们几乎天天都要打交道的东西&#xff0c;相关知识点有点多&#xff0c;所以也有不少面试必问的点&#xff0c;这里做了一些整理&#xff0c;帮且大家树立完整的 http 知识体系&#xff0c;对面试官说 so easy HTTP 的特点和缺点 特点&#xff1a;无连接、无状态、灵…

【Git版本控制 01】基本操作

目录 一、初始配置 二、添加文件 三、查看日志 四、修改文件 五、版本回退 六、撤销修改 七、删除文件 一、初始配置 Git版本控制器&#xff1a;记录每次的修改以及版本迭代的一个管理系统。 # 初始化本地仓库&#xff1a;git init(base) [rootlocalhost gitcode]# gi…