web漏洞-PHP反序列化

目录

  • PHP反序列化
    • 序列化
    • 反序列化
    • 原理
    • 涉及技术
    • 利用
    • 危害
    • CTF靶场

PHP反序列化

序列化

将对象转换成字符串

反序列化

相反,将字符串转换成对象。

数据格式的转换对象的序列化有利于对象的保存和传输,也可以让多个文件共享对象。

原理

未对用户输入的序列化字符串进行检测,导致攻击者可以控制反序列化过程,从而导致代码执行,SQL注入,目录遍历等不可控后果。在反序列化的过程中自动触发了某些魔术方法。当进行反序列化的时候就有可能会触发对象中的一些魔术方法。

serialize() //将一个对象转换成一个字符串

unserialize() //将字符串还原成一个对象

image-20231003194425283

//例如:
//无类,序列化和反序列化
<?php$key="rumilc";
echo serialize($key);echo "</br>";
$key2 = 's:6:"rumilc";';
echo unserialize($key2);

image-20231003201350953

涉及技术

有类和无类

有类和无类区别:有无class定义

基本概念

有类:触发魔术方法

魔术方法具体参考

触发:
unserialize函数的变量可控,文件中存在可利用的类,类中有魔术方法:
__construct()//创建对象时触发
__destruct() //对象被销毁时触发
__call() //在对象上下文中调用不可访问的方法时触发
__callStatic() //在静态上下文中调用不可访问的方法时触发
__get() //用于从不可访问的属性读取数据
__set() //用于将数据写入不可访问的属性
__isset() //在不可访问的属性上调用isset()或empty()触发
__unset() //在不可访问的属性上使用unset()时触发
__invoke() //当脚本尝试将对象调用为函数时触发
......

image-20231003194540134

利用

真实应用下

CTF中常见

危害

SQL注入

目录遍历

代码执行

CTF靶场

题目地址

image-20231003201933892

进入环境:

image-20231003201958395

给了php代码,进行分析

根据题目以及代码,向下发现了unserialize

思路:
第一:获取flag存储flag.php
第二:两个魔术方法__destruct和 __construct
第三:传输str参数数据后触发destruct,存在is_valid过滤
第四:__destruct中会调用process,其中op=1写入及op=2读取
第五:涉及对象FileHandler,变量op及filename,content,进行构造输出

image-20231003202509676

image-20231003202718707

进行构造,序列化处理:

<?php
class FileHandler
{public $op = '2.0'; //源码观察发现,op为1时候是执行写入,为2时执行读//使用 ' 2'也可以绕过op的值public $filename="flag.php"; //文件开头调用的是flag.phppublic $content; //可以不用写,或者任意
}
$flag = new FileHandler();
echo serialize($flag);
?>

执行完成后,得到:

O:11:“FileHandler”:3:{s:2:“op”;s:3:“2.0”;s:8:“filename”;s:8:“flag.php”;s:7:“content”;N;}

image-20231003202816043

将此作为参数值,赋值给str进行请求

发现有返回,查看源码

image-20231003202938404

源码当中:

得到答案

image-20231003203006999

$FLAG = "ctfhub{2edb689c4de533b460e6c2af}";

还可以将其还原成对象:

<?php$key = 'O:11:"FileHandler":3:{s:2:"op";s:3:"2.0";s:8:"filename";s:8:"flag.php";s:7:"content";N;}';var_dump(unserialize($key));
?>

image-20231003210220260还原的对象结果:

object(__PHP_Incomplete_Class)#1 (4) {["__PHP_Incomplete_Class_Name"]=>string(11) "FileHandler"["op"]=>string(3) "2.0"["filename"]=>string(8) "flag.php"["content"]=>NULL
}

反序列化魔术方法调用,弱类型绕过,ascii绕过

== :弱等于。在比较前会先把两种字符串类型转成相同的再进行比较。

=== :强等于。在比较前会先判断两种字符串类型是否相同再进行比较,如果类型不同直接返回不相等。既比较值也比较类型。

使用该类对flag进行读取,这里面能利用的只有__destruct函数(析构函数)。

__destruct函数对$this->op进行了===判断并内容在2字符串时会赋值为1,

process函数中使用==对$this->op进行判断(为2的情况下才能读取内容),

因此这里存在弱类型比较,可以使用数字2或字符串’ 2’绕过判断。

is_valid函数还对序列化字符串进行了校验,因为成员被protected修饰,

因此序列化字符串中会出现ascii为0的字符。经过测试,在PHP7.2+的环境中,

使用public修饰成员并序列化,反序列化后成员也会被public覆盖修饰。

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

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

相关文章

【Stm32-F407】Keil uVision5 的安装

文章内容如下&#xff1a; 1&#xff09;Keil uVision5 安装包的获取2&#xff09;Keil uVision5 的安装3&#xff09;Keil uVision5 中 Stm32-F407 芯片包的获取与安装4&#xff09;注册 Keil uVision5 1&#xff09;Keil uVision5 安装包的获取 Keil uVision5 安装包链接: h…

OpenCV报错:AttributeError: module ‘cv2.cv2‘ has no attribute ‘SIFT_create‘

报错位置&#xff1a; sift cv2.SIFT_create()报错原因&#xff1a;opencv将SIFT等算法整合到xfeatures2d集合里面了。 改为&#xff1a; sift cv2.xfeatures2d.SIFT_create()

sheng的学习笔记-【中文】【吴恩达课后测验】Course 1 - 神经网络和深度学习 - 第二周测验

课程1_第2周_测验题 目录&#xff1a;目录 第一题 1.神经元计算什么&#xff1f; A. 【  】神经元计算激活函数后&#xff0c;再计算线性函数&#xff08;zWxb&#xff09; B. 【  】神经元计算一个线性函数&#xff08;zWxb&#xff09;&#xff0c;然后接一个激活函数…

打字速度测试,生成您的打字速度证书?

趁着十一国庆之际&#xff0c;开发完成了打字侠的速度测试功能。我自己的打字速度约为56字/分钟&#xff0c;算是盲打中速度比较快的。下面是我的打字荣誉证书&#xff0c;欢迎大家免费测试自己的打字速度。 你也想来测试一下自己的打字速度吗&#xff1f; 打字侠速度测试地址…

一键智能视频编辑与视频修复算法——ProPainter源码解析与部署

前言 视频编辑和修复确实是随着电子产品的普及变得越来越重要的技能。有许多视频编辑工具可以帮助人们轻松完成这些任务如&#xff1a;Adobe Premiere Pro&#xff0c;Final Cut Pro X&#xff0c;Davinci Resolve&#xff0c;HitFilm Express&#xff0c;它们都提供一些视频修…

OpenCV 13(模版匹配和霍夫变换)

一、模版匹配 所谓的模板匹配&#xff0c;就是在给定的图片中查找和模板最相似的区域&#xff0c;该算法的输入包括模板和图片&#xff0c;整个任务的思路就是按照滑窗的思路不断的移动模板图片&#xff0c;计算其与图像中对应区域的匹配度&#xff0c;最终将匹配度最高的区域…

Qt扩展-QCustomPlot绘图基础概述

QCustomPlot绘图基础概述 一、概述二、改变外观1. Graph 类型2. Axis 坐标轴3. 网格 三、案例1. 简单布局两个图2. 绘图与多个轴和更先进的样式3. 绘制日期和时间数据 四、其他Graph&#xff1a;曲线&#xff0c;条形图&#xff0c;统计框图&#xff0c;… 一、概述 本教程使用…

【C语言】函数的定义、传参与调用(二)

&#x1f497;个人主页&#x1f497; ⭐个人专栏——C语言初步学习⭐ &#x1f4ab;点击关注&#x1f929;一起学习C语言&#x1f4af;&#x1f4ab; 目录 导读&#xff1a; 1. 函数的嵌套调用 1.1 什么是嵌套调用 1.2 基础实现 1.3 调用流程解析 2. 函数的链式访问 2.1 …

《深度不确定条件下的决策:从理论到实践》PDF

制定未来计划时需要预测变化&#xff0c;尤其是制定长期计划或针对罕见事件的计划时。当这些变化存在高度不确定性的时候&#xff0c;这种预期就变得越来越困难。 今天给大家介绍的这本《深度不确定条件下的决策&#xff1a;从理论到实践》正是解决以上问题的良方。完整书籍文…

聊聊分布式架构——Http到Https

目录 HTTP通信协议 请求报文 响应报文 持久连接 状态管理 HTTPS通信协议 安全的HTTPS HTTP到HTTPS的演变 对称加密 非对称加密 混合加密机制 证书机构 SSL到底是什么 HTTPS是身披SSL外壳的HTTP HTTP通信协议 一次HTTP请求的通信流程&#xff1a;客户端浏览器通过…

GET 和 POST的区别

GET 和 POST 是 HTTP 请求的两种基本方法&#xff0c;要说它们的区别&#xff0c;接触过 WEB 开发的人都能说出一二。 最直观的区别就是 GET 把参数包含在 URL 中&#xff0c;POST 通过 request body 传递参数。 你可能自己写过无数个 GET 和 POST 请求&#xff0c;或者已经看…

【生物信息学】使用谱聚类(Spectral Clustering)算法进行聚类分析

目录 一、实验介绍 二、实验环境 1. 配置虚拟环境 2. 库版本介绍 3. IDE 三、实验内容 0. 导入必要的工具 1. 生成测试数据 2. 绘制初始数据分布图 3. 循环尝试不同的参数组合并计算聚类效果 4. 输出最佳参数组合 5. 绘制最佳聚类结果图 6. 代码整合 一、实验介绍…