浅析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 session和cookie使用说明
Apr 07 PHP
PHP优于Node.js的五大理由分享
Sep 15 PHP
PHP基于GD库的缩略图生成代码(支持jpg,gif,png格式)
Jun 19 PHP
php实现MySQL数据库备份与还原类实例
Dec 09 PHP
php+html5使用FormData对象提交表单及上传图片的方法
Feb 11 PHP
利用PHP如何实现Socket服务器
Sep 23 PHP
浅析php静态方法与非静态方法的用法区别
May 17 PHP
PHP微信开发之根据用户回复关键词\位置返回附近信息
Jun 24 PHP
php compact 通过变量创建数组
Nov 15 PHP
PHP中file_put_contents追加和换行的实现方法
Apr 01 PHP
Laravel 对某一列进行筛选然后求和sum()的例子
Oct 10 PHP
PHP中strval()函数实例用法
Jun 07 PHP
php 函数中静态变量使用的问题实例分析
Mar 05 #PHP
php多进程中的阻塞与非阻塞操作实例分析
Mar 04 #PHP
php 中的信号处理操作实例详解
Mar 04 #PHP
php libevent 功能与使用方法详解
Mar 04 #PHP
php+iframe 实现上传文件功能示例
Mar 04 #PHP
php实现文件上传基本验证
Mar 04 #PHP
PHP实现文件上传操作和封装
Mar 04 #PHP
You might like
解决dede生成静态页和动态页转换的一些问题,及火车采集入库生成动态的办法
2007/03/29 PHP
初步介绍PHP扩展开发经验分享
2012/09/06 PHP
解决更换PHP5.4以上版本后Dedecms后台登录空白问题的方法
2015/10/23 PHP
PHP通过GD库实现验证码功能示例
2019/02/23 PHP
网页的标准,IMG不支持onload标签怎么办
2006/06/29 Javascript
又一个小巧的图片预加载类
2007/05/05 Javascript
js 全兼容可高亮二级缓冲折叠菜单
2010/06/04 Javascript
javascript与CSS复习(《精通javascript》)
2010/06/29 Javascript
jquery取消选择select下拉框示例代码
2014/02/22 Javascript
浅谈JavaScript中小数和大整数的精度丢失
2016/05/31 Javascript
js在ie下打开对话窗口的方法小结
2016/10/24 Javascript
浅谈EasyUi ComBotree树修改 父节点选择的问题
2016/11/07 Javascript
js实现图片左右滚动效果
2017/02/27 Javascript
Vue Transition实现类原生组件跳转过渡动画的示例
2017/08/19 Javascript
vue-cli中vue本地实现跨域调试接口
2019/01/16 Javascript
基于js实现复制内容到操作系统粘贴板过程解析
2019/10/11 Javascript
node.js Promise对象的使用方法实例分析
2019/12/26 Javascript
python 删除列表里所有空格项的方法总结
2018/04/18 Python
Python实现全排列的打印
2018/08/18 Python
Python用5行代码写一个自定义简单二维码
2018/10/21 Python
Python 中list ,set,dict的大规模查找效率对比详解
2019/10/11 Python
Python PyInstaller库基本使用方法分析
2019/12/12 Python
解决安装pyqt5之后无法打开spyder的问题
2019/12/13 Python
Pytorch模型迁移和迁移学习,导入部分模型参数的操作
2021/03/03 Python
利用 CSS3 实现的无缝轮播功能代码
2017/09/25 HTML / CSS
使用jquery实现HTML5响应式导航菜单教程
2014/04/02 HTML / CSS
澳大利亚自然和有机的健康美容产品一站式商店:Ziani Beauty
2017/12/28 全球购物
The North Face意大利官网:服装、背包和鞋子
2020/06/17 全球购物
一些.net面试题
2014/10/06 面试题
大学校庆策划书
2014/01/31 职场文书
送餐员岗位职责范本
2014/02/21 职场文书
不尊敬老师检讨书范文
2014/11/19 职场文书
2014年标准化工作总结
2014/12/17 职场文书
2015学习委员工作总结范文
2015/04/03 职场文书
公务员学习中国梦心得体会
2016/01/05 职场文书
MySQL8.0升级的踩坑历险记
2021/11/01 MySQL