BUU40 [安洵杯 2019]easy_serialize_php

news/2025/2/23 2:39:54

题目源代码

php"><?php

$function = @$_GET['f'];

function filter($img){
    $filter_arr = array('php','flag','php5','php4','fl1g');
//implode 函数将数组 $filter_arr 中的元素用 | 连接成一个字符串。
// |在正则表达式中表示或的关系,所以连接后的字符串类似于 php|flag|php5|php4|fl1g。
// 前后的 / 表示正则表达式的定界符,末尾的i表示不区分大小写匹配
//最终的效果就是正则表达式匹配字符串中出现的任意一个过滤词
    $filter = '/'.implode('|',$filter_arr).'/i';
    return preg_replace($filter,'',$img);
}


if($_SESSION){
//unset()销毁整个会话数组
    unset($_SESSION);
}
//将user会话设置为guest表示当前用户为访客
$_SESSION["user"] = 'guest';
$_SESSION['function'] = $function;

//将 $_POST 数组中的元素提取出来,使其成为单独的变量。
//如果 $_POST 中有一个键为 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']));
}

源代码中提示我们在phpinfo里面有好东西,去看看

 这个意思也就是说会在php解析完了以后包含d0g3_f1ag.php,大概率flag在这里

先从头捋一下:

在$GET['img_path']不存在的时候---$_SESSION['img']=base64-en("guest_img.png")

正常的逻辑就是,你这里$_SESSION['img']的值是guest_img.png定死了的,不会读取到flag文件

那怎么办呢,有两条路,第一条路是前面POST提交一个img是flag的值【这里提交变量为_SESSION这样进去就变成了$_SESSION就能混进本来的超级全局变量里头去了,好好好这么玩是吧】,第二条路就是利用php的反序列化字符串逃逸减少的情况,将原本的$_SESSION['img']=base64-en("guest_img.png")吞掉(变成前一个键的值),然后后面顺理成章接着我们构造的新的$_SESSION['img']的值

很明显第一条路中后面 $_SESSION['img'] = base64_encode('guest_img.png');还会再赋值一次,这样就覆盖了之前提交的img值,不行,所以利用字符串逃逸减少

先写个序列化php,但是像原来那么写死活编译不出来,应该就是变量名不能是_SESSION的事

这样不对!!

php"><?php
class _SESSION
{
    $public img='Z3Vlc3RfaW1nLnBuZw==';//guest_image.png
    $public user='guest';
    $public function='show_image';
}
$a=new _SESSION();
echo serialize($a);
?>

学习到个新的写法,就是直接写$_SESSION['xxx']

php"><?php
$_SESSION["user"] = 'kkk';
$_SESSION['function'] = 'show_image';
$_SESSION['img'] = base64_encode('guest_img.png');
echo serialize($_SESSION);

//a:3:{s:4:"user";s:3:"kkk";s:8:"function";s:10:"show_image";s:3:"img";s:20:"Z3Vlc3RfaW1nLnBuZw==";}
?>

(后来发现这里头function的值可以随便取。。。)

就先试试user的值为n*php,function的值为;s:3:"img";s:20:"ZDBnM19mMWFnLnBocA==
 

 原本想这么构造,但是又发现一个很傻的问题就是,序列化前面有三个属性,对应不上

然后改成这样 

 这样做了还是不行,后来发现好像是顺序错了.......

.....

换个顺序重新来

过滤后的字符串,标蓝的是php以为的user的字符串,标黄的是实际输入的function的值

再将/d0g3_fllllllag编码后提交,长度都是20不用改 

 

拿到flag 


http://www.niftyadmin.cn/n/5862913.html

相关文章

Eclipse 透视图 (Perspective)

Eclipse 透视图 (Perspective) Eclipse 是一款强大的集成开发环境(IDE),广泛应用于 Java 开发领域。其中,透视图(Perspective)是 Eclipse 中的一个核心概念,它将不同的工具和视图组合在一起,以便开发者能够更高效地完成特定的开发任务。本文将详细介绍 Eclipse 透视图…

什么是手机9008模式?如何进入9008

之前给大家分享了一些有关手机刷机的知识&#xff0c;今天给大家讲一讲如果刷机过程中不慎变砖应该如何应对&#xff08;当然了&#xff0c;希望大家都不会遇到&#xff09;&#x1f602;&#x1f604; 在给手机 Root 或刷机时&#xff0c;线刷 9008 指的是利用 高通 9008 模式…

Unity游戏制作中的C#基础(3)加减乘除算术操作符,比较运算符,逻辑与,或运算符

1. 基本算术运算符 算术运算符主要用于对数值类型&#xff08;整型和浮点型&#xff09;进行基本的数学运算。以下是常见的算术运算符及其说明&#xff1a; 运算符描述示例结果加法运算符&#xff0c;用于两个数相加&#xff0c;也可用于字符串连接int a 5 3; string str &…

Node.js中不支持require和import两种导入模块的混用

最近在整理Node.js相关的知识点&#xff0c;发现通过Node.js支持的两个模块导入语句require和import在同时使用时会发生错误&#xff0c;而且错误非常诡异。 例如&#xff0c;在先使用require导入模块&#xff0c;在使用import导入模块时&#xff0c;出现require无法识别&#…

从网络延迟到纯净IP,TikTok直播运营专线如何提升直播体验

随着TikTok在美国市场的全面恢复&#xff0c;越来越多的企业开始关注如何通过TikTok直播实现业务增长。然而&#xff0c;跨境直播运营中常常面临网络延迟、IP限制等问题&#xff0c;这直接影响直播效果和用户体验。针对这一痛点&#xff0c;TikTok直播运营专线应运而生&#xf…

Linux 内核中关于 CPU 编号和拓扑管理

CPU 拓扑结构定义 // topology.h struct cpu_topology {int thread_id; // SMT IDint core_id; // 核心 IDint package_id; // 物理 CPU IDint die_id; // Die IDcpumask_t thread_sibling; // SMT 线程掩码cpumask_t core_sibling; // 核心掩码 };CPU 在线…

php session数据存储位置选择

PHP session 数据的存储位置可以通过配置文件或者代码来进行设置。默认情况下&#xff0c;session 数据是存储在服务器的文件系统中的。你可以将 session 数据存储在其他地方&#xff0c;例如数据库、缓存等。 基础概念 PHP session默认情况下将数据存储在服务器端的临时文件中…

DEMF模型赋能多模态图像融合,助力肺癌高效分类

目录 论文创新点 实验设计 1. 可视化的研究设计 2. 样本选取和数据处理 3. 集成分类模型 4. 实验结果 5. 可视化结果 图表总结 可视化知识图谱 在肺癌早期筛查中,计算机断层扫描(CT)和正电子发射断层扫描(PET)作为两种关键的影像学手段,分别提供了丰富的解剖结构…