web渗透PHP反序列化漏洞

web渗透PHP反序列化漏洞

1)PHP反序列化漏洞

反序列我们可以控制对象中的值进行攻击

O:1:"C":1:{s:3:"cmd";s:8:"ipconfig";}

http://127.0.0.1/1.php?x=O:1:"C":1:{s:3:"cmd";s:3:"ver";}

常见的反序列化

魔术方法:PHP 中特殊方法(如__construct、__destruct、__wakeup等)在对象生命周期自动调用,若方法中存在危险操作(如命令执行),可被反序列化触发。

漏洞绕过:如 CVE-2016-7124(PHP 5.6.25 前的__wakeup方法绕过,通过修改对象属性数量使__wakeup失效)。

原生类:利用 PHP 内置类(如DirectoryIterator、SimpleXMLElement)实现文件遍历、XXE 等攻击。

Phar 文件:Phar 文件包含序列化元数据,即使无unserialize函数,通过文件操作函数(如file_exists)也可触发反序列化。

字符串逃逸:当程序对序列化字符串进行过滤 / 替换时,可通过构造特殊字符串改变序列化结构,实现属性注入。

黑盒查看漏洞:

功能关联:观察功能是否涉及对象存储 / 传输(如用户配置、会话管理、数据备份),此类功能可能使用序列化。

参数测试:对疑似传入序列化数据的参数(如data、payload、user)传入畸形序列化字符串,观察是否返回 PHP 错误(如unserialize()错误)。

白盒代码审计:

关键词搜索:查找unserialize()函数,确认其参数是否可控(如来自用户输入的_GET、_POST、$_COOKIE)。

跟踪变量:确认可控变量是否直接传入unserialize(),且未经过严格过滤。

分析类结构:检查反序列化涉及的类是否包含危险魔术方法或函数调用(如system()、exec())。

2)反序列检查方法

黑盒测试:

参数探测:收集所有用户可控参数(GET/POST/COOKIE/ 请求体),尝试传入基础序列化字符串(如O:0:{}),观察响应差异。

畸形测试:传入不完整 / 错误的序列化数据(如O:1:"A":),若返回unserialize()相关错误(如Error at offset),说明存在反序列化操作。

功能触发:结合业务功能(如提交配置、恢复数据),在关键步骤传入恶意序列化字符串,观察是否执行预期操作(如文件生成、命令输出)。

白盒测试:

函数定位:全局搜索unserialize(),标记所有调用位置。

数据流分析:确认unserialize()的参数是否来自用户输入,是否经过过滤(如preg_replace、htmlspecialchars等),过滤规则是否可绕过。

类与方法审计:分析反序列化涉及的类及其魔术方法,判断是否存在可利用的危险操作(如调用eval()、文件写入等)。

3)反序列工具

PHPGGC:PHP 反序列化漏洞利用工具,包含多种框架(如 Laravel、ThinkPHP、Yii)的 Gadget 链,可直接生成恶意序列化字符串。

Burp Suite 插件:如Deserialization Scanner,可自动检测请求中可能存在的反序列化参数并尝试注入测试 payload。

手动构造工具:Python 脚本(如通过pickle模块辅助生成符合格式的序列化字符串)、在线 PHP 序列化 / 反序列化工具(用于验证 payload 格式)。

漏洞扫描器:Nessus、AWVS 等包含反序列化漏洞检测模块,可批量扫描目标是否存在相关漏洞。

4)靶场

DVWA(Damn Vulnerable Web Application):包含反序列化漏洞模块,适合入门学习基础利用。

CTF 平台:CTFtime、XCTF 等平台的 Web 题目中常见反序列化考点(如 "安恒杯""西湖论剑" 相关题目)。

VulnHub 靶机:如Mutillidae II(包含反序列化漏洞场景)、Metasploitable 3(集成多种 Web 漏洞)。

框架漏洞环境:通过Vulhub搭建特定框架漏洞环境(如 ThinkPHP 5.x 反序列化漏洞、Laravel deserialization RCE)。

自定义环境:手动编写含漏洞的 PHP 代码(如调用unserialize($_GET['x'])且类中包含__destruct方法执行system()),本地测试验证。

<?php

// 一个简单的文件操作类

class FileHandler {

private $filename;

private $content;

public function __construct($filename = '') {

this-\>filename = filename;

}

// 魔术方法:当对象被反序列化时调用

public function __wakeup() {

// 危险操作:直接使用成员变量作为命令执行

if (!empty($this->filename)) {

// 这里存在命令注入漏洞

exec("type " . this-\>filename, output);

this-\>content = implode("\\n", output);

}

}

public function getContent() {

return $this->content;

}

}

// 接收用户输入的序列化数据

if (isset($_GET['data'])) {

data = _GET['data'];

// 反序列化操作,存在安全风险

fileHandler = unserialize(data);

if ($fileHandler instanceof FileHandler) {

echo "<pre>文件内容:\n" . $fileHandler->getContent() . "</pre>";

} else {

echo "无效的数据格式";

}

} else {

echo "请通过data参数提交数据";

}

?>

相关推荐
前端若水13 分钟前
会话管理:创建、切换、删除对话历史
前端·人工智能·python·react.js
Bigger22 分钟前
mini-cc:一个轻量级 AI 编程助手的诞生
前端·ai编程·claude
涵涵(互关)36 分钟前
Naive-ui树型选择器只显示根节点
前端·ui·vue
BY组态1 小时前
Ricon组态系统最佳实践:从零开始构建物联网监控平台
前端·物联网·iot·web组态·组态
BY组态1 小时前
Ricon组态系统vs传统组态软件:为什么选择新一代Web组态平台
前端·物联网·iot·web组态·组态
SoaringHeart1 小时前
Flutter进阶:OverlayEntry 插入图层管理器 NOverlayZIndexManager
前端·flutter
放下华子我只抽RuiKe51 小时前
React 从入门到生产(四):自定义 Hook
前端·javascript·人工智能·深度学习·react.js·自然语言处理·前端框架
YMWM_2 小时前
UDP协议详解:从原理到Python实践
网络·网络协议·udp
IT_陈寒3 小时前
Redis缓存击穿把我整不会了,原来还有这手操作
前端·人工智能·后端
pengyi8710153 小时前
共享 IP 与独享 IP 怎么选?被封后升级方案避坑
网络·网络协议·tcp/ip