反序列化逃逸 [安洵杯 2019]easy_serialize_php1

打开题目

题目源码:

<?php$function = @$_GET['f'];function filter($img){$filter_arr = array('php','flag','php5','php4','fl1g');$filter = '/'.implode('|',$filter_arr).'/i';return preg_replace($filter,'',$img);
}if($_SESSION){unset($_SESSION);
}$_SESSION["user"] = 'guest';
$_SESSION['function'] = $function;extract($_POST);if(!$function){echo '<a href="index.php?f=highlight_file">source_code</a>';
}if(!$_GET['img_path']){$_SESSION['img'] = base64_encode('guest_img.png');
}else{$_SESSION['img'] = sha1(base64_encode($_GET['img_path']));
}$serialize_info = filter(serialize($_SESSION));if($function == 'highlight_file'){highlight_file('index.php');
}else if($function == 'phpinfo'){eval('phpinfo();'); //maybe you can find something in here!
}else if($function == 'show_image'){$userinfo = unserialize($serialize_info);echo file_get_contents(base64_decode($userinfo['img']));
}

我们简单代码审计一下

$function = @$_GET['f'];  //从 GET 请求中获取名为 'f' 的参数,并赋值给 $function 变量。使用 @ 符号来抑制可能的未定义变量警告,

function filter($img){   //定义了一个名为 filter 的函数,接受一个参数 $img
    $filter_arr = array('php','flag','php5','php4','fl1g');  //$filter_arr 数组包含了需要过滤掉的关键词列表,如 'php', 'flag', 'php5', 'php4', 'fl1g'。
    $filter = '/'.implode('|',$filter_arr).'/i';  //将关键词数组连接成一个以竖线 | 分隔的字符串,形成一个正则表达式模式,如 (php|flag|php5|php4|fl1g)。/.../i 是一个正则表达式模式,用于在 preg_replace() 函数中替换匹配到的内容。这里的 i 标志表示不区分大小写
    return preg_replace($filter,'',$img);  //将匹配到的字符串替换为空字符串,实现了过滤功能。

if($_SESSION){
    unset($_SESSION);  //用 unset($_SESSION) 将整个会话数据清除
}

$_SESSION["user"] = 'guest';  //将 $_SESSION['user'] 设置为字符串 'guest'
$_SESSION['function'] = $function; //将 $_SESSION['function'] 设置为从 $_GET 或者其他地方获得的值 $function

extract($_POST); //使用 extract() 函数将 $_POST 数组中的键值对提取到当前的符号表中,使得这些键名变成了当前作用域的变量名,对应的值变成了这些变量的值

if(!$function){
    echo '<a href="index.php?f=highlight_file">source_code</a>';  //如果 $function 为空,则输出一个链接到 index.php?f=highlight_file<a> 标签,显示为 "source_code"
}

if(!$_GET['img_path']){           //$_GET['img_path']如果为空
    $_SESSION['img'] = base64_encode('guest_img.png');  //则将 $_SESSION['img'] 设置为经 base64 编码后的 'guest_img.png'。
}else{   //如果不为空
    $_SESSION['img'] = sha1(base64_encode($_GET['img_path']));  //将 $_GET['img_path'] 进行 base64 编码,并用 sha1 编码,将结果存储到 $_SESSION['img']
}

$serialize_info = filter(serialize($_SESSION));  //serialize() 函数将 $_SESSION 数组序列化,并将结果传递给 filter() 函数进行过滤。

if($function == 'highlight_file'){  //如果 $function 的值为 'highlight_file'
    highlight_file('index.php');  //highlight_file() 函数来显示 'index.php' 文件的代码
}else if($function == 'phpinfo'){  //如果 $function 的值为 'phpinfo',则使用 eval() 函数执行 phpinfo()
    eval('phpinfo();'); //maybe you can find something in here!
}else if($function == 'show_image'){  如果 $function 的值为 'show_image'
    $userinfo = unserialize($serialize_info);   //通过 unserialize() 函数尝试将 $serialize_info 字符串反序列化为 PHP 数据结构,并将结果存储在 $userinfo 变量
    echo file_get_contents(base64_decode($userinfo['img']));  //使用 file_get_contents() 读取并输出对应图像文件的内容
}

做题

首先题目给了我们提示

那我们就get传参一个f(就相当于function),让f=phpinfo看看提示

在页面里面看到了flag文件的名字

知识点:

implode函数

implode() 函数,把数组元素组合为字符串。

语法

implode(separator,array)
参数描述
separator可选。规定数组元素之间放置的内容。默认是 ""(空字符串)。
array必需。要组合为字符串的数组。

例子:

<?php
$arr = array('Hello','World!','I','love','Shanghai!');
echo implode(" ",$arr);
?>

运行结果为:

Hello World! I love Shanghai!

extract函数

定义和用法

extract() 函数从数组中将变量导入到当前的符号表。

该函数使用数组键名作为变量名,使用数组键值作为变量值。针对数组中的每个元素,将在当前符号表中创建对应的一个变量。

第二个参数 type 用于指定当某个变量已经存在,而数组中又有同名元素时,extract() 函数如何对待这样的冲突。

该函数返回成功导入到符号表中的变量数目。

语法

extract(array,extract_rules,prefix)
参数描述
array必需。规定要使用的数组。
extract_rules

可选。extract() 函数将检查每个键名是否为合法的变量名,同时也检查和符号表中已存在的变量名是否冲突。对不合法和冲突的键名的处理将根据此参数决定。

可能的值:

  • EXTR_OVERWRITE - 默认。如果有冲突,则覆盖已有的变量。
  • EXTR_SKIP - 如果有冲突,不覆盖已有的变量。
  • EXTR_PREFIX_SAME - 如果有冲突,在变量名前加上前缀 prefix
  • EXTR_PREFIX_ALL - 给所有变量名加上前缀 prefix
  • EXTR_PREFIX_INVALID - 仅在不合法或数字变量名前加上前缀 prefix
  • EXTR_IF_EXISTS - 仅在当前符号表中已有同名变量时,覆盖它们的值。其它的都不处理。
  • EXTR_PREFIX_IF_EXISTS - 仅在当前符号表中已有同名变量时,建立附加了前缀的变量名,其它的都不处理。
  • EXTR_REFS - 将变量作为引用提取。导入的变量仍然引用了数组参数的值。
prefix

可选。请注意 prefix 仅在 extract_type 的值是 EXTR_PREFIX_SAME,EXTR_PREFIX_ALL,EXTR_PREFIX_INVALID 或 EXTR_PREFIX_IF_EXISTS 时需要。如果附加了前缀后的结果不是合法的变量名,将不会导入到符号表中。

前缀和数组键名之间会自动加上一个下划线

参考下面这个实例就能很清楚看明白如果变量有冲突,该怎么设置

实例

<?php
$a = "Original";
$my_array = array("a" => "Cat", "b" => "Dog", "c" => "Horse");extract($my_array, EXTR_PREFIX_SAME, "dup");echo "\$a = $a; \$b = $b; \$c = $c; \$dup_a = $dup_a";
?>

运行结果为:$a = Original; $b = Dog; $c = Horse; $dup_a = Cat

unset函数

unset() 函数用于销毁给定的变量。

PHP Filter

PHP 过滤器用于对来自非安全来源的数据(比如用户输入)进行验证和过滤。

具体使用见:

PHP Filter 函数 | 菜鸟教程

 

反序列化字符串逃逸

知识点的参考文章:

PHP extract() 函数

PHP implode() 函数

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

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

相关文章

巧【二叉搜索树的最近公共祖先】【二叉搜索树的性质】Leetcode 235. 二叉搜索树的最近公共祖先

【二叉搜索树的最近公共祖先】【二叉搜索树性质】Leetcode 235. 二叉搜索树的最近公共祖先 【巧】解法1 利用二叉搜索树有序的性质解法2 采用二叉树求最近公共祖先的方法——后序遍历 ---------------&#x1f388;&#x1f388;235. 二叉搜索树的最近公共祖先 题目链接&#x…

[通用] iPad 用于 Windows 扩展屏解决方案 Moonlight + Sunshine + Easy Virtual Display

文章目录 前言推流端 Sunshine 安装设置接收端安装 Moonlight安装虚拟屏幕软件 Easy Virtual Display 前言 上期博客讲了如何利用原生的 NVIDIA’s GameStream 传输协议实现 iPad 当作 Windows 副屏&#xff0c;对于非N卡用户&#xff0c;有一个软件 Sunshine 可以代替 Nvidia…

Verilog Constructs、Verilog系统任务和功能

下表列出了Verilog构造在Vivado合成中的支持状态。 Verilog系统任务和功能 Vivado合成支持系统任务或功能&#xff0c;如下表所示。Vivado合成会忽略不支持的系统任务。 使用转换函数 使用以下语法对任何表达式调用$signed和$unsigned系统任务。 $signed&#xff08;expr&am…

鸿蒙学习day1基础语法 基础变量类型

在这里插入图片描述 什么是变量&#xff1a;变量就是一些数据 如125&#xff0c;‘字符串数据’ 通过一个符号来表示 变量的定义 方法 let 变量名&#xff1a;变量类型 ’ 各种数据’ ,let是关键字&#xff0c;系统给的用来定义变量的 let name: string 张亚洲; let age: …

安卓使用okhttpfinal下载文件,附带线程池下载使用

1.导入okhttp包 implementation cn.finalteam:okhttpfinal:2.0.7 2.单个下载 package com.example.downloading;import androidx.appcompat.app.AppCompatActivity;import android.os.Bundle; import android.util.Log; import android.view.View;import java.io.File;import c…

今日学习总结2024.3.3

今天也是全天自习的一天&#xff0c;非常充实 早上八点开始接着晚上的docker配置&#xff0c;并一边同步博客&#xff0c;还是遇到了卡壳 【未完结】nginxhexo搭建个人网站真实体验&#xff01;https://blog.csdn.net/m0_62742402/article/details/136425066 看了一个视频&…

SpringCloud-MQ消息队列

一、消息队列介绍 MQ (MessageQueue) &#xff0c;中文是消息队列&#xff0c;字面来看就是存放消息的队列。也就是事件驱动架构中的Broker。消息队列是一种基于生产者-消费者模型的通信方式&#xff0c;通过在消息队列中存放和传递消息&#xff0c;实现了不同组件、服务或系统…

平台工程: 用Backstage构建开发者门户 - 2

本文介绍了如何使用开源Backstage构建自己的开发者门户&#xff0c;并基于此实践平台工程。本系列共两篇文章&#xff0c;这是第二篇。原文: Platform Engineering: Building Your Developer Portal with Backstage — Part 2 在本教程第一部分中我们了解了Backstage这个用于构…

qsort使用

qsort 是用来排序的数据的库函数,底层使用的是快速排序的方式 排序方式有:选择,冒泡,插入,快速, 希尔...... 对于qsort这个库函数: void qsort(void* base,size_t num,size_t size,int (*compar)(const void*,const void*) 其中 void* base 是指针,指向的是待排序的数组的第…

强大的Docker入门知识

目录 一、Docker简介 1.1、Docker是 1.2、Docker通常会在以下情况下使用&#xff1a; 1.3、Docker和VMware区别 1.4、Docker 的优点 二、环境配置 2.1、代码操作 2.2、效果演示 2.3、配置镜像仓库 开始配置 三、基本命令 3.1、Docker基本命令 3.2、Docker镜像常用…

.idea文件详解

.idea文件的作用&#xff1a; .idea文件夹是存储IntelliJ IDEA项目的配置信息&#xff0c;主要内容有IntelliJ IDEA项目本身的一些编译配置、文件编码信息、jar包的数据源和相关的插件配置信息。一般用git做版本控制的时候会把.idea文件夹排除&#xff0c;因为这个文件下保存的…

JS进阶——深入对象

版权声明 本文章来源于B站上的某马课程&#xff0c;由本人整理&#xff0c;仅供学习交流使用。如涉及侵权问题&#xff0c;请立即与本人联系&#xff0c;本人将积极配合删除相关内容。感谢理解和支持&#xff0c;本人致力于维护原创作品的权益&#xff0c;共同营造一个尊重知识…

数据挖掘:航空公司的客户价值分析

需求分析 理解并掌握聚类分析方法&#xff0c;掌握数据的标准化&#xff0c;掌握寻找最佳聚类数&#xff0c;掌握聚类的绘图&#xff0c;掌握聚类分析的应用场景。 系统实现 实验流程分析 借助航空公司数据&#xff0c;对客户进行分类对不同类别的客户进行特征分析&#xf…

聊聊 HTTP 性能优化

作为用户的我们在 "上网冲浪" 的时候总是希望快一点&#xff0c;尤其是抢演唱会门票的时候&#xff0c;但是现实并非如此&#xff0c;有时候我们会遇到页面加载缓慢、响应延迟的情况。 而 HTTP 协议作为互联网世界的基础&#xff0c;从网站打开速度到移动应用的响应…

uniapp:使用DCloud的uni-push推送消息通知(在线模式)java实现

uniapp:使用DCloud的uni-push推送消息通知&#xff08;在线模式&#xff09;java实现 1.背景 今天开发app的时候遇到一个需求&#xff1a; 业务在出发特定条件的时候向对应的客户端推送消息通知。 为什么选择在线模式&#xff0c;因为我们使用的是德邦类似的手持终端&#xf…

一文带你了解MySQL之B+树索引的原理

前言 学完前面我们讲解了InnoDB数据页的7个组成部分&#xff0c;知道了各个数据页可以组成一个双向链表&#xff0c;而每个数据页中的记录会按照主键值从小到大的顺序组成一个单向链表&#xff0c;每个数据页都会为存储在它里边儿的记录生成一个页目录&#xff0c;在通过主键查…

Java ZooKeeper-RocketMQ 面试题

Java ZooKeeper-RocketMQ 面试题 前言1、谈谈你对ZooKeeper的理解 &#xff1f;2、Zookeeper的工作原理&#xff08;Zab协议&#xff09;3、谈谈你对分布式锁的理解&#xff0c;以及分布式锁的实现&#xff1f;4、 zookeeper 是如何保证事务的顺序一致性的&#xff1f;5、 zook…

LeetCode --- 三数之和

题目描述 三数之和 代码解析 暴力 在做这一道题的时候&#xff0c;脑海里先想出来的是暴力方法&#xff0c;一次排序&#xff0c;将这个数组变为有序的&#xff0c;再通过三次for循环来寻找满足条件的数字&#xff0c;然后将符合条件的数组与之前符合条件的数组进行一一对比…

进来吧,给自己10分钟,这篇文章带你直接学会python

Python的语言特性 Python是一门具有强类型(即变量类型是强制要求的)、动态性、隐式类型(不需要做变量声明)、大小写敏感(var和VAR代表了不同的变量)以及面向对象(一切皆为对象)等特点的编程语言。 获取帮助 你可以很容易的通过Python解释器获取帮助。如果你想知道一个对象(o…

ZYNQ--MIG核配置

文章目录 MIG核配置界面多通道AXI读写DDR3MIG核配置界面 Clock Period: DDR3 芯片运行时钟周期,这个参数的范围和 FPGA 的芯片类型以及具体类型的速度等级有关。本实验选择 1250ps,对应 800M,这是本次实验所采用芯片可选的最大频率。注意这个时钟是 MIG IP 核产生,并输出给…