关于Session的前置知识:

session 对数据的序列化方式一共有三种:

默认是 php 处理器:session.serialize_handler = php

效果如图:

通过|分割数据,|前面为键值,后面为数据序列化后的内容。

当php <= 5.6.13的时候,php底层对该数据的处理方式是:

获取第一个 | 然后解析其前面为键,后面的内容反序列化后为值。

但是当后面的内容有问题,不能成功反序列化的时候,就将 寻找下一个 | ,重复这里执行。

问题就出在这里。测试如图:

假如,我们后面的语句因为某些原因被截断了呢?

joomla 问题也出在这,因为joomla 修改了默认储存引擎,session.save_handler,将其改为了mysql储存,这本来是没有问题的,

但是mysql 设置数据的字符集=utf-8 的时候,mysql中的utf-8是被阉割版的,只占三个字节,utf8mb4才是完整的utf8,占四个字节。

所以当我们的可控字符中存在一个 4字节的数据的时候,就会导致数据被截断,导致不能成功反序列化我们的数据。然后处理引擎寻找下一个 | 进行解析。

如图:

其实不用66个字符,只要大于该后面的所有字符总和就行了。

总结:1.php <= 5.6.13的时候,php序列化引擎会依次向后序列化每一个键值对,根据就是 | (竖线)

    2. joomla也刚好使用了mysql,utf8。这就会导致数据被截断,不能正常反序列化,然后直接寻找下一个 | 就直接找到了我们伪造的 |

Joomla 3.4.6 RCE -- 这个漏洞更神。

前置知识:https://www.php.net/manual/zh/function.session-set-save-handler.php

session_set_save_handler( 函数:设置用户自定义的会话储存函数。

需要实现:SessionHandlerInterface 接口中的6个方法。https://www.php.net/manual/zh/class.sessionhandlerinterface.php

简而言之:

$name = $_SESSION['name'];   会调用你重写的 read()函数

$_SESSION['name'] = 'test123';   会调用你重写的 write()函数

看看joomla 中重写的 read 和 write 方法:

因为序列化 受保护的,私有的属性的时候,会产生%00 这种 NULL 字符,mysql是没办法储存 NULL 字符的。

所以程序就通过

$data = str_replace(chr(0) . '*' . chr(0), '\0\0\0', $data);

这种替换的方式,在写入的时候替换掉NULL字符,在读取的时候在替换回来,这看似一点问题都没有。

但如果我们的数据中就直接包含了\0\0\0这个字符呢?那么在取出的时候,也会二话不说,给我们替换成chr(0) . '*' . chr(0),这样就会造成字符个数不对等的差异。

正常的序列化是这样的:

就是前面的字符个数,和后面的数据,肯定是一样的。但是由于我们写入的时候:\0\0\0 这个字符串计算的是6个字符,但是读取出来的时候替换成了3个字符。

而且前面的个数是不会变的,这就会导致反序列化的时候继续向后取,不管你是啥,反正取够这么多字符为止,这就会导致我们可控的数据逃逸了出来,造成了反序列化。

成功因为逃逸造成反序列化:

注意:这个是逃逸,不是因为反序列化数据出错导致,所以这个是不受PHP版本限制的。php 7依然可以。

参考文章:

https://www.leavesongs.com/PENETRATION/joomla-unserialize-code-execute-vulnerability.html 第一个漏洞

https://www.anquanke.com/post/id/83120 第一个漏洞为什么版本  <= 5.6.13

https://www.freebuf.com/vuls/216512.html 第二个漏洞

https://github.com/80vul/phpcodz/blob/master/research/pch-013.md ctf容易出题的地方,处理器差异造成。

http://www.360doc.com/content/11/1222/00/1372409_174118218.shtml joomla源码分析

https://www.anquanke.com/post/id/86178 joomla源码分析

通过Joomla的两次RCE漏洞看session反序列化的更多相关文章

  1. Joomla 3.4.6 RCE 分析

    Joomla 3.4.6 RCE 漏洞分析,首发先知社区: https://xz.aliyun.com/t/6522 漏洞环境及利用 Joomla 3.4.6 : https://downloads. ...

  2. Joomla 3.0.0 - 3.4.6 RCE漏洞分析记录

    0x00  前言 今天早上看到了国内几家安全媒体发了Joomla RCE漏洞的预警,漏洞利用的EXP也在Github公开了.我大致看了一眼描述,觉得是个挺有意思的漏洞,因此有了这篇分析的文章,其实这个 ...

  3. Joomla 3.0.0 -3.4.6远程代码执行(RCE)漏洞复现

    Joomla 3.0.0 -3.4.6远程代码执行(RCE)漏洞复现 一.漏洞描述 Joomla是一套内容管理系统,是使用PHP语言加上MYSQL数据库所开发的软件系统,最新版本为3.9.12,官网: ...

  4. Joomla3.4.6 RCE漏洞深度分析

    笔者<Qftm>原文发布:https://www.freebuf.com/vuls/216512.html *严正声明:本文仅限于技术讨论与分享,严禁用于非法途径 0×00 背景 10月9 ...

  5. U-Boot NFS RCE漏洞(CVE-2019-14192)

    U-Boot NFS RCE漏洞(CVE-2019-14192) 原文:https://blog.semmle.com/uboot-rce-nfs-vulnerability/ 翻译:看雪翻译小组 - ...

  6. 威胁快报|首爆,新披露Jenkins RCE漏洞成ImposterMiner挖矿木马新“跳板”

    简介 阿里云安全于近日捕获到一起使用Jenkins RCE漏洞进行攻击的挖矿事件.除挖矿外,攻击者还曾植入具有C&C功能的tsunami木马,也预留了反弹shell的功能,给用户带来极大安全隐 ...

  7. Sunlogin RCE漏洞分析和使用

    介绍   前两天网上曝出了关于向日葵远控工具(Sunlogin)Windows个人版的RCE漏洞POC.因为利用简单并且网上出现了公开的自动化扫描脚本,所以测试的人很多,也出现了一些真实攻击.漏洞的问 ...

  8. Discuz ML RCE漏洞

    1.漏洞描述 Discuz国际版漏洞存在于cookie的language可控并且没有严格过滤,导致可以远程代码执行. 2.产生原因:Discuz!ML 系统对cookie中的l接收的language参 ...

  9. ThinkPHP-5.0.23新的RCE漏洞测试和POC

    TP5新RCE漏洞 昨天又是周五,讨厌周五曝漏洞,还得又得加班,算了,还是先验证一波.新的TP5RCE,据说发现者因为上次的RCE,于是又审计了代码,结果发现的.TP5也成了万人轮啊. 测试 环境搭建 ...

随机推荐

  1. Qt学习笔记-制作一个文本编辑器

    创建一个MainWindow工程.添加一个TextEdit.垂直布局. 在menu上面创建新的action. 在新建的时候判断文本有没有被修改. 下面,将某个文件打开读入到TextEdit中. 保存文 ...

  2. 第十一章节 BJROBOT PS3 手柄控制【ROS全开源阿克曼转向智能网联无人驾驶车】

    1.把小车架空平放在地板上.   2.用 USB 线将 PS3 蓝牙手柄连接至小车主控端,初次连接手柄上的 4 个红色指示灯会同时闪烁; 3.按下手柄中间的圆形配对键,然后等待红灯闪烁至停止. 4.此 ...

  3. 大数据可视化呈现工具LightningChart的用法

    LightningChart (LightningChart Ultimate) 软件开发工具包是微软VisualStudio 的一个插件,专攻大数据可视化呈现问题,用于WPF(WindowsPres ...

  4. 俯瞰Dubbo全局,阅读源码前必须掌握这些!!

    写在前面 在上一篇<冰河开始对Dubbo下手了!>一文中,我们重点介绍了为何要学习Dubbo,而且还是要深入理解Dubbo的原理和核心源码.既然是要写深度解析Dubbo源码的系列专题,我们 ...

  5. 如何下载youtube的视频?

    导言 当youtube视频需要下载时,发现需要会员等其他限制 别急,下面就是比较稳定的方法 准备 gitub链接 youtube-dl github 官网链接 官网 按照官网提示下载对应版本 我这里是 ...

  6. 项目实战--JSON.toJSONString()

    需求说明:公司使用Swagger(接口文档在线生成工具),为了让前端同事更好的了解传入参数的详细情况,应用项目中接口(eg:分页查询接口)中使用dto对象来接受前端传入的参数,但是后面中心项目中接口是 ...

  7. spark知识点_datasources

    来自官网DataFrames.DataSets.SQL,即sparkSQL模块. 通过dataframe接口,sparkSQL支持多种数据源的操作.可以把dataframe注册为临时视图,也可以通过关 ...

  8. label_form

    表单: action "URL" 如果为空,则本form接收 指定接收方 disabled 指定该标签是否可用 method "net" "http& ...

  9. 基于 MapReduce 的单词计数(Word Count)的实现

    完整代码: // 导入必要的包 import java.io.IOException; import java.util.StringTokenizer; import org.apache.hado ...

  10. 【ORA】ORA-00257 archiver error. 错误的处理方法

    今天连接数据库,结果报错,ora-00257查看 [oracle@exam oracle]$ oerr ora 00257 00257, 00000, "archiver error. Co ...