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

[安洵杯 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';
    return preg_replace($filter,'',$img);

知识点:

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

知识点的参考文章:

PHP extract() 函数

PHP implode() 函数

http://www.lryc.cn/news/308728.html

相关文章:

  • 【前端素材】推荐优质在线通用果蔬商城电商网页eStore平台模板(附源码)
  • 开源软件的商业模式探析:开放与盈利的平衡
  • 使用全局事件总线实现任意组件间的通讯
  • 文件基础和文件fd
  • 3dgs学习(二)—— 3d高斯与协方差矩阵及其几何意义
  • ZStack Cube超融合入选IDC《中国超融合基础架构市场评估》报告
  • 每日一题——LeetCode1556.千位分隔符
  • 8.网络游戏逆向分析与漏洞攻防-游戏网络架构逆向分析-游戏底层功能对接类GameProc的实现
  • Redis冲冲冲——事务支持,AOF和RDB持久化
  • 路由菜单路径匹配方法
  • 设计模式浅析(九) ·模板方法模式
  • 无用工作、UBI与AI
  • 【监控】grafana图表使用快速上手
  • Django常用命令
  • 【center-loss 中心损失函数】 原理及程序解释(更新中)
  • 什么是 HTTPS 证书?作用是什么?
  • 为什么软考报名人数越来越多?
  • 【投稿优惠|快速见刊】2024年图像,机器学习和人工智能国际会议(ICIMLAI 2024)
  • html2canvas 将DOM节点转成图片
  • 【多线程】常见锁策略详解(面试常考题型)
  • Python列表操作函数
  • Qt注册类对象单例与单类型区别
  • Rocky Linux 运维工具yum
  • linux下的ollama
  • YOLOv9详细解读,改进提升全面分析(附YOLOv9结构图)
  • html基础操练和进阶修炼宝典
  • 从Mysql 数据库删除重复记录只保留其中一条(删除id最小的一条)
  • 从http到websocket
  • UE5 C++ Widget练习 Button 和 ProgressBar创建血条
  • 抖店无货源违规频发,不能入驻?这个是真的吗?