php反序列化及__toString()

article/2025/4/8 14:44:48

思路:
1./?s=data://text/plain,XXXXXX
2.include …php
3._tostring() echo unserialize(pass)
echo file_get_content($this-file)
把反序列化属性的值读取并输出

主要两个文件

index.php

<?php
$user = $_GET["user"];
$file = $_GET["file"];
$pass = $_GET["pass"];if(isset($user)&&(file_get_contents($user,'r')==="the user is admin")){echo "hello admin!<br>";if(preg_match("/f1a9/",$file)){exit();}else{include($file); //class.php$f = new Read();var_dump($f);echo serialize($f);echo "\n";$pass = unserialize($pass);echo $pass;}
}else{echo "you are not admin ! ";
}
<?phpclass Read{//f1a9.phppublic $file;public function __toString(){if(isset($this->file)){echo file_get_contents($this->file);    }return "__toString was called!";}
}

题目的意思很明显,是通过get传入的三个参数来控制获取到f1a9.php文件里的flag。

第一个条件,通过file_get_contents( u s e r , ′ r ′ ) 获 取 user,'r')获取 user,r)user参数传来的值,三等于,基本不存在什么弱比较类型的绕过,但我们知道该函数里是支持伪协议的,这里可以用php伪协议php://input,来使得其获取的值为我们post传递过去的值,如下:

data://text/plain,xxxx(要执行的php代码)
data://text/plain;base64,xxxx(base64编码后的数据)
php://input,用于执行php代码,需要post请求提交数据。

?text=data://text/plain;base64,d2VsY29tZSB0byB0aGUgempjdGY=&file=php://filter/read=convert.base64-encode/resource=useless.php

在这里插入图片描述

接下来,看到后面有一个文件包含,利用该漏洞。可以把文件源码读下来,如下:

?text=data://text/plain;base64,d2VsY29tZSB0byB0aGUgempjdGY=&file=php://filter/read=convert.base64-encode/resource=useless.php

然后base64解密即可得到源码。但我们发现这里是不能直接读到flag文件的值的,做了过滤,再看看class.php文件:

里面是一个类,并且类里只有一个__toString()方法,我们看看__toString()方法的作用

__toString()是快速获取对象的字符串信息的便捷方式,似乎魔术方法都有一个“自动“的特性,如自动获取,自动打印等,__toString()也不例外,它是在直接输出对象引用时自动调用的方法。当我们调试程序时,需要知道是否得出正确的数据。比如打印一个对象时,看看这个对象都有哪些属性,其值是什么,如果类定义了toString方法,就能在测试时,echo打印对象体,对象就会自动调用它所属类定义的toString方法,格式化输出这个对象所包含的数据。

简单的说,就是当类对象被输出引用时,就会自动调用该方法

我们看到class源文件的__toString()方法有一个file_get_contents()函数,而之前index文件还有一个pass参数还没用到

    $pass = unserialize($pass);echo $pass;

于是我们构造Read类的序列化对象,然后经过这里的反序列化,在echo输出时,不就会自动加载__toString()方法吗,就好读取到file中文件的内容,并输出了然后就可以达到我们获取flag的目的了

当类对象被输出引用时,就会自动调用该方法

类对象被输出 echo $pass;(经过反序列化的,说明输入的时候应该是被序列化的)

就会自动调用该方法

function __toString(){if(isset($this->file)){ 把反序列化的里面file这个属性要有值echo file_get_contents($this->file);  把反序列化的里面file这个属性的值读取并打印出来,如果这个值是flag.php就好了呀,而且作为file里面的值最开始是序列化的,前面可以绕过过滤,在这里才打印出来

在这里插入图片描述

text=data://text/plain,welcome to the zjctf&file=useless.php&password=O:4:"Flag":1:{s:4:"file";s:8:"flag.php";}

思路总结几个点:
1.(file_get_contents($user,‘r’)===“the user is admin”

data://text/plain,xxxx(要执行的php代码)
data://text/plain;base64,xxxx(base64编码后的数据)
php://input,用于执行php代码,需要post请求提交数据。

2.include()函数 以及一个暗示的 anshi.php文件,,读取源码

=php://filter/read=convert.base64-encode/resource=ansh.php

3.__toString() 当类对象被输出引用时,就会自动调用该方法
执行echo 被反序列化的对象 同时执行__toString()函数,让反序列化中属性file的属性值被提纯出来,输出,也就是我们想要的flag.php

类对象被输出 echo $pass;(经过反序列化的,说明输入的时候应该是被序列化的)

就会自动调用该方法

function __toString(){if(isset($this->file)){ 把反序列化的里面file这个属性要有值echo file_get_contents($this->file);  把反序列化的里面file这个属性的值读取并打印出来,如果这个值是flag.php就好了呀,而且作为file里面的值最开始是序列化的,前面可以绕过过滤,在这里才打印出来

4.php类型文件的源码很重要,flag.php里面会有答案,一般的php会有代码审计


http://chatgpt.dhexx.cn/article/Jod1LS7m.shtml

相关文章

PHP反序列化字符串逃逸

例题可看&#xff1a;https://www.cnblogs.com/v2ish1yan/articles/16118319.html 今天才学的&#xff0c;做个记录。 字符串逃逸分为两种&#xff0c;减少和增多。 主要是通过一个preg_replace()函数来进行字符串的减少和增多。 首先要知道逃逸的原理&#xff0c;就是反序…

浅析php反序列化原生类的利用

浅析php反序列化原生类的利用 如果在代码审计或者ctf中&#xff0c;有反序列化的功能点&#xff0c;但是却不能构造出完整的pop链&#xff0c;那这时我们应该如何破局呢&#xff1f;我们可以尝试一下从php原生类下手&#xff0c;php有些原生类中内置一些魔术方法&#xff0c;如…

CTF php反序列化总结

前言&#xff1a;本⼈⽔平不⾼&#xff0c;只能做⼀些类似收集总结这样的⼯作&#xff0c;本篇文章是我自己在学php反序列化写的一篇姿势收集与总结&#xff0c;有不对的地方欢迎师傅们批评指正~ php反序列化 定义&#xff1a;序列化就是将对象转换成字符串。反序列化相反&am…

PHP反序列化命令执行及防范

PHP反序列化命令执行 1、 序列化与反序列化原理 序列化&#xff08;serialization&#xff09;在计算机科学的数据处理中&#xff0c;是指将数据结构或对象状态转换成可取用格式&#xff08;例如存成文件&#xff0c;存于缓冲&#xff0c;或经由网络中发送&#xff09;&#…

PHP反序列化魔术方法

目录 __construct __destruct __call __get __set __isset __unset __sleep __wakeup __toString __invoke PHP讲以双下划线__保留为魔术方法&#xff0c;所有的魔术方法 必须 声明为 public。 __construct()&#xff0c;类的构造函数 __destruct()&#xff0c;类的析…

PHP反序列化详解(一)——反序列化基础

今天继续给大家介绍渗透测试相关知识&#xff0c;本文主要内容是PHP反序列化详解&#xff08;一&#xff09;——反序列化基础。 免责声明&#xff1a; 本文所介绍的内容仅做学习交流使用&#xff0c;严禁利用文中技术进行非法行为&#xff0c;否则造成一切严重后果自负&#x…

php反序列化姿势学习

php反序列化姿势学习 1.__wakeup()函数绕过2./[oc]:\d:/i研究php反序列化逃逸1.替换后字符串增加2.替换后字符串减少 1.__wakeup()函数绕过 wakeup函数作为php反序列化中的一个函数&#xff0c;也经常被拿来当做考点&#xff0c;比如这样 function __wakeup() { if ($this->…

【web漏洞】PHP反序列化

目录 知识点反序列化常用方法&#xff1a;序列化的&#xff08;构造payload&#xff09;运行顺序反序列化的&#xff08;实现payload&#xff09;运行顺序绕过__wakeup()__tostring() 知识点 序列化&#xff08;serialize&#xff09;&#xff1a; 对象的状态信息转换为可以存…

PHP反序列化CTF例题

渗透学习 不安全的反序列化之PHP反序列化 文章目录 渗透学习前言*本文只做学习用途&#xff0c;严禁利用本文提到的技术进行非法攻击&#xff0c;否则后果自负&#xff0c;本人不承担任何责任。* 一、CTF例题二、PHP反序列化漏洞和XSS跨站脚本总结 前言 本系列用于记录本人渗…

php反序列化漏洞

php反序列化漏洞 关于php面向对象编程&#xff1a; 对象&#xff1a;可以对其做事情的一些东西。一个对象有状态、行为和标识三种属性。 类&#xff1a;一个共享相同结构和行为的对象的集合。 每个类的定义都以关键字class开头&#xff0c;后面跟着类的名字。一个类可以包含有…

PHP反序列化漏洞总结

文章目录 一、 基础知识1、什么是反序列化漏洞:序列化与反序列化&#xff1a;1、序列化&#xff1a;2、反序列化&#xff1a; 二、PHP魔法函数1、常见方法:2、安全问题&#xff1a; 三、CTF中的反序列化例题一&#xff1a;例题二&#xff1a; 四、靶场练习1、反序列化触发XSS&a…

通过简单案例接触PHP反序列化

渗透学习 不安全的反序列化之反序列化基础 文章目录 渗透学习前言*本文只做学习用途&#xff0c;严禁利用本文提到的技术进行非法攻击&#xff0c;否则后果自负&#xff0c;本人不承担任何责任。* 一、序列化和反序列化二、PHP反序列化漏洞1.serialize()2.unserialize()3.反序…

php反序列化--字符串逃逸

php反序列化–字符串逃逸 PHP反序列化的字符串逃逸&#xff0c;一共分有两种情况&#xff0c;情况一&#xff1a;过滤后字符串变多&#xff0c;情况二&#xff1a;过滤后字符变少(本篇文章默认已有反序列化相关知识基础) 过滤后字符串变多 以ctfshow-web262为例讲解&#xf…

php反序列化漏洞(一)

PHP反序列化漏洞就是PHP对象注入 序列化&#xff1a;serialize 反序列化&#xff1a;unserialize 序列化其实就是将数据转换成可逆的数据结构&#xff0c;这种数据结构可认为是字符串。可逆的过程则为反序列化。 那么序列化有什么作用&#xff1f; 方便储存和传输。在PHP中…

php反序列化字符逃逸

前言 在了解php反序列化漏洞后&#xff0c;我又进一步学习了字符逃逸的相关内容。这一部分相对来说是比较难理解的。我也是在网上看了很多篇文章&#xff0c;再次自己总结一下究竟什么是字符逃逸&#xff0c;也方便日后复习。 字符逃逸的原理 什么是字符逃逸&#xff0c;从字…

php反序列化[基础]

基础 概述 序列化:把复杂的数据类型压缩到一个字符串中 数据类型可以是数组&#xff0c;字符串&#xff0c;对象等 函数 : serialize() 反序列化:恢复原先被序列化的变量 函数: unserialize() serialize()函数用于序列化对象或数组&#xff0c;并返回一个字符串 据访问修饰…

PHP中序列化与反序列化

PHP序列化&#xff1a;serialize 序列化是将变量或对象转换成字符串的过程。 举例&#xff1a; <?php class man{public $name;public $age;public $height;function __construct($name,$age,$height){ //_construct&#xff1a;创建对象时初始化$this->name …

(37)【PHP反序列化】PHP反序列化原理、函数、利用过程

目录 一、简介&#xff1a; 二、原理&#xff1a; 2.1、函数&#xff1a; 2.1.1、serialize()序列化 2.1.2、unserialize()反序列化 三、常见的序列化格式&#xff1a; 四、产生的原因&#xff1a; 4.1、无类&#xff1a; 4.2、有类&#xff1a; 五、魔术方法&#x…

php反序列化总结

php反序列化总结 基础知识 序列化 序列化就是将 对象object、字符串string、数组array、变量 转换成具有一定格式的字符串&#xff0c;方便保持稳定的格式在文件中传输&#xff0c;以便还原为原来的内容。 serialize ( mixed $value ) : stringserialize() 返回字符串&…

PHP反序列化入门手把手详解

PHP反序列化入门手把手详解 前言:文章内容大致可分为原理详解-漏洞练习- 防御方法。文章内容偏向于刚接触PHP反序列化的师傅,是一篇对PHP反序列化入门的手把手教学文章。文章特色在于对PHP反序列化原理的详细分析以及一系列由简入深的PHP反序列化习题练习和分析讲解。文章写作初…