PHP反序列化CTF例题

article/2025/6/5 12:36:27

渗透学习

不安全的反序列化之PHP反序列化


文章目录

  • 渗透学习
  • 前言
    • *本文只做学习用途,严禁利用本文提到的技术进行非法攻击,否则后果自负,本人不承担任何责任。*
  • 一、CTF例题
  • 二、PHP反序列化漏洞和XSS跨站脚本
  • 总结


前言

本系列用于记录本人渗透学习的过程,主要内容围绕Owasp TOP 10展开。

接上篇不安全的反序列化之反序列化基础用简单案例接触了PHP反序列化,但对该漏洞的利用和实际场景浅尝辄止 。这篇将会用代码审计的方式分析一道典型的存在PHP反序列化漏洞的案例,加深对魔术方法等相关知识的理解。另外,还会和xss跨站脚本的知识进行融合。

本文只做学习用途,严禁利用本文提到的技术进行非法攻击,否则后果自负,本人不承担任何责任。

一、CTF例题

学习案例

class SoFun{ protected $file='index.php';function __destruct(){ if(!empty($this->file)) {if(strchr($this-> file,"\\")===false &&  strchr($this->file, '/')===false)show_source(dirname (__FILE__).'/'.$this ->file);else      die('Wrong filename.');}}  function __wakeup(){ $this-> file='index.php'; } public function __toString(){return '' ;}}     if (!isset($_GET['file'])){ show_source('index.php'); } else{ $file=base64_decode( $_GET['file']); echo unserialize($file ); } 
?>   #<!--key in flag.php-->

代码审计:
根据提示,key在flag.php中,而想要获得文件中内容,只能靠语句show_source(dirname (__FILE__).'/'.$this ->file);
发现该题用到了__destruct等魔术方法,可以根据其性质进行漏洞利用(详见上一篇文章)
常规思路是利用反序列化的方式POST"file"参数将读取的文件从index.php替换成flag.php,然后利用__destruct的自动执行读取flag.php中的内容。
但是在反序列化执行时会自动执行__wakeup,其作用是将文件再设为index.php
解决方案:
显然我们需要利用一种方法绕过__wakeup方法,而当序列化字符串中,表示对象属性个数的值大于实际属性个数时,那么就会跳过wakeup方法的执行。比如:
实际情况:O:7:”Student”:1:{S:4:”name”;s:8:”zhangsan”;}
Payload:O:7:”Student”:2:{S:4:”name”;s:8:”zhangsan”;}
Payload对象属性个数为2,而实际属性个数为1,那么就会掉入漏洞,从而跳过wakeup()方法。
Payload
根据上篇文章所学,易得反序列化语句为O:5:”SoFun”:2:{S:7:”\00*\00file”;s:8:”flag.php”;}
值得注意的是,file是protected属性,因此需要用\00*\00来表示,\00代表ascii为0的值。
此题还需要一次Base64编码,结果为:
Tzo1OiJTb0Z1biI6Mjp7Uzo3OiJcMDAqXDAwZmlsZSI7czo4OiJmbGFnLnBocCI7fQ==
在这里插入图片描述
该PHP反序列化漏洞的案例其实来源于16年SugarCRM v6.5.23中
SugarCRM(http://www.sugarcrm.com/ )是一套开源的客户关系管理系统。研究者发现在其<=6.5.23的版本中存在反序列化漏洞,程序对攻击者恶意构造的序列化数据进行了反序列化的处理,从而使攻击者可以在未授权状态下执行任意代码。
有兴趣的可以点击了解

二、PHP反序列化漏洞和XSS跨站脚本

当尝试序列化一段xss代码的时候,当它进行反序列化的时候会自动执行xss

<?php$a="test"; //字符串$arr = array('j' => 'jack' ,'r' => 'rose'); //数组class A{public $test="<img src=1 οnerrοr=alert(1)>";}echo "序列化:";echo "</br>";$aa=serialize($a);print_r($aa);echo "</br>";$arr_a=serialize($arr);print_r($arr_a);echo "</br>";$class1 = new A(); //对象$class_a=serialize($class1);print_r($class_a);echo "<br/>";echo "反序列化:";echo "<br/>";print_r(unserialize($aa));echo "</br>";print_r(unserialize($arr_a));echo "</br>";print_r(unserialize($class_a));
?>

执行结果:
在这里插入图片描述
在__wakeup中一样存在类似的漏洞:

<?php
class A{var $test = "demo";function __wakeup(){echo $this->test;}
}
$a = $_GET['test'];
$a_unser = unserialize($a);
?>

使用payload:O:1:"A":1:{s:4:"test";s:28:"<img src=1 onerror=alert(1)>";}一样会造成XSS攻击

而如果__wakeup中不是echo $this->test; ,是eval(*)那么就是任意代码执行则会造成更严重的后果。
比如:

<?php
class A{var $test = "demo";function __wakeup(){eval($this->test);}
}
$b = new A();
$c = serialize($b);
echo $c;
$a = $_GET['test'];
$a_unser = unserialize($a);
?>

构造payload:O:1:"A":1:{s:4:"test";s:10:"phpinfo();";}即可获得php内置信息


总结

以上介绍了一道比较综合的CTF题目对PHP反序列化漏洞有一个更清晰化的认识,这道题难度不算高,但对代码审计能力有着一定的要求。


http://chatgpt.dhexx.cn/article/RLp6WnwT.shtml

相关文章

php反序列化漏洞

php反序列化漏洞 关于php面向对象编程&#xff1a; 对象&#xff1a;可以对其做事情的一些东西。一个对象有状态、行为和标识三种属性。 类&#xff1a;一个共享相同结构和行为的对象的集合。 每个类的定义都以关键字class开头&#xff0c;后面跟着类的名字。一个类可以包含有…

PHP反序列化漏洞总结

文章目录 一、 基础知识1、什么是反序列化漏洞:序列化与反序列化&#xff1a;1、序列化&#xff1a;2、反序列化&#xff1a; 二、PHP魔法函数1、常见方法:2、安全问题&#xff1a; 三、CTF中的反序列化例题一&#xff1a;例题二&#xff1a; 四、靶场练习1、反序列化触发XSS&a…

通过简单案例接触PHP反序列化

渗透学习 不安全的反序列化之反序列化基础 文章目录 渗透学习前言*本文只做学习用途&#xff0c;严禁利用本文提到的技术进行非法攻击&#xff0c;否则后果自负&#xff0c;本人不承担任何责任。* 一、序列化和反序列化二、PHP反序列化漏洞1.serialize()2.unserialize()3.反序…

php反序列化--字符串逃逸

php反序列化–字符串逃逸 PHP反序列化的字符串逃逸&#xff0c;一共分有两种情况&#xff0c;情况一&#xff1a;过滤后字符串变多&#xff0c;情况二&#xff1a;过滤后字符变少(本篇文章默认已有反序列化相关知识基础) 过滤后字符串变多 以ctfshow-web262为例讲解&#xf…

php反序列化漏洞(一)

PHP反序列化漏洞就是PHP对象注入 序列化&#xff1a;serialize 反序列化&#xff1a;unserialize 序列化其实就是将数据转换成可逆的数据结构&#xff0c;这种数据结构可认为是字符串。可逆的过程则为反序列化。 那么序列化有什么作用&#xff1f; 方便储存和传输。在PHP中…

php反序列化字符逃逸

前言 在了解php反序列化漏洞后&#xff0c;我又进一步学习了字符逃逸的相关内容。这一部分相对来说是比较难理解的。我也是在网上看了很多篇文章&#xff0c;再次自己总结一下究竟什么是字符逃逸&#xff0c;也方便日后复习。 字符逃逸的原理 什么是字符逃逸&#xff0c;从字…

php反序列化[基础]

基础 概述 序列化:把复杂的数据类型压缩到一个字符串中 数据类型可以是数组&#xff0c;字符串&#xff0c;对象等 函数 : serialize() 反序列化:恢复原先被序列化的变量 函数: unserialize() serialize()函数用于序列化对象或数组&#xff0c;并返回一个字符串 据访问修饰…

PHP中序列化与反序列化

PHP序列化&#xff1a;serialize 序列化是将变量或对象转换成字符串的过程。 举例&#xff1a; <?php class man{public $name;public $age;public $height;function __construct($name,$age,$height){ //_construct&#xff1a;创建对象时初始化$this->name …

(37)【PHP反序列化】PHP反序列化原理、函数、利用过程

目录 一、简介&#xff1a; 二、原理&#xff1a; 2.1、函数&#xff1a; 2.1.1、serialize()序列化 2.1.2、unserialize()反序列化 三、常见的序列化格式&#xff1a; 四、产生的原因&#xff1a; 4.1、无类&#xff1a; 4.2、有类&#xff1a; 五、魔术方法&#x…

php反序列化总结

php反序列化总结 基础知识 序列化 序列化就是将 对象object、字符串string、数组array、变量 转换成具有一定格式的字符串&#xff0c;方便保持稳定的格式在文件中传输&#xff0c;以便还原为原来的内容。 serialize ( mixed $value ) : stringserialize() 返回字符串&…

PHP反序列化入门手把手详解

PHP反序列化入门手把手详解 前言:文章内容大致可分为原理详解-漏洞练习- 防御方法。文章内容偏向于刚接触PHP反序列化的师傅,是一篇对PHP反序列化入门的手把手教学文章。文章特色在于对PHP反序列化原理的详细分析以及一系列由简入深的PHP反序列化习题练习和分析讲解。文章写作初…

[CTF]PHP反序列化总结

文章目录 PHP反序列化这一篇就够了简介常见的序列化格式案例引入反序列化中常见的魔术方法反序列化绕过小Trickphp7.1反序列化对类属性不敏感绕过__wakeup(CVE-2016-7124)绕过部分正则利用引用16进制绕过字符的过滤PHP反序列化字符逃逸情况1&#xff1a;过滤后字符变多情况2&am…

测试用例介绍

测试用例 用例介绍 定义 为某个业务目标而编制的一组由测试输入&#xff0c;执行条件以及预期结果组成的案例。 为什么要学习测试用例&#xff1f; 再开始测试之前设计好测试用例&#xff0c;可以避免盲目测试并提高测试效率。测试用例的使用令软件测试的实施突出重点、目…

软件测试的测试用例应该怎么编写和模板

这个是软件测试的模板下面是软件测试的一些测试点和测试方法 硬件测试方法: 1.界面测试 2.性能测试(压力测试、稳定性测试) 3.恢复性测试 4.兼容性测试 5.安全性测试 6.破坏性测试 7.可用性测试 8.易用性测试 9.功能操作测试 软件测试: loading:加载中。 可视化页面可操作元素…

测试用例模板

测试用例模板 文章目录 前言1.文件原地址2.测试用例模板1.测试用例模板012.测试用例模板023.测试用例模板034.测试用例模板045.测试用例模板05 2上线回归测试1.回归测试检查表01 3.其他见过的模型参考关键词链接 前言 这个是模仿别人的模板来进行补充的。有些是不需要的&…

测试用例模板及测试报告分析

文章目录 前言一、等价类划分二、边界值三、错误推测法四、因果图法判定表驱动法设计步骤设计策略 前言 文章主要介绍常见测试用例的设计方法 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、等价类划分 等价类划分主要适用于单个输入条件&#x…

测试 - 用例篇

文章目录 测试用例的基本要素基于需求设计的测试用例接下来就是针对一个功能的不同输入,对应着不同的输出功能之间的交互性异常信息的处理 等价类边界值错误猜测法 美团面试题:水杯测试用例场景法因果图法 复习 因为这篇博客是关于如何写测试用例,尽可能多的涵盖测试用例,所以我…

软件测试当中的测试用例模板,仅供参考

测试用例这块知识、经验&#xff0c;小酋在前面陆续都讲完了。这章提供几种用例模板&#xff0c;作为这块知识的收尾。 - 1 - 测试用例&#xff08;主指功能测试用例模板&#xff09;的内容通常包括测试目标&#xff08;目的&#xff09;&#xff0c;需求标示&#xff08;一般…

测试用例分析及编写

文章目录 1.测试用例1.1 用例与测试用例1.2 测试用例的作用1.3 测试用例的编写格式 2. 测试点的设计方法2.1 等价类划分法2.1.1 定义2.1.2 分类2.1.3 划分规则2.1.4 步骤2.1.5 适用场景2.1.6 案例2.1.6.1 验证QQ帐号的合法性2.1.6.2 验证某城市号码的正确性 2.2 边界值划分法2.…

测试用例,怎么写 ?

本文的测试用例主要针对功能测试。 软件测试中最重要的因素是设计和生成有效的测试用例。 穷举的测试是不可能的&#xff0c;合理的测试策略是通过使用特定的面向黑盒测试的测试用例设计方法&#xff0c;而后使用白盒测试方法对程序的逻辑结构进行检查以补充这些测试用例&…