PHP反序列化漏洞学习
类似前言一样的东西
在很多CTF题目上或者一些实际环境中都有碰到过反序列化漏洞,但是看到那些乱七八糟的就感觉学不进去,趁着暑假时间多的时候,研究一番,这篇也算是学习笔记,主要内容有:
什么是序列化和反序列化 为什么要用到序列化 产生这个漏洞的原因
什么是序列化和反序列化
在PHP中,实现序列化和反序列化,主要是靠 serialize()
和 unserialize()
这两个函数,序列化做的工作就是,将一个一个对象变成一个可传输字符串,json就是一种序列化,而反序列化的工作就是将字符串再变回对象
序列化和反序列化有点像Python中的 encode()
和 decode()
,编码和解码,只不过这两个处理的都是字符串
举一个例子:
<?php
class test{
public $name = "Elapse";
public $age = "18";
}
$example=new test();
$t = serialize($example);
echo $t;
?>
$example实例化test对象
内容为 {"name":"Elapse","age":"18"}
在实际环境中,可能需要对内容进行修改,如下:
<?php
class test{
public $name = "Elapse";
public $age = "18";
}
$example=new test();
$example->name="Ernket";
$t = serialize($example);
echo $t;
?>
如果我们想要将内容传输出去的话,则需要将内容序列化,变成一串字符串后才可发送
也可以将变量储存,有需要的时候在拿出来使用,而不是二次调用,浪费系统资源
PHP中可以通过 unserialize()
来将字符串转为对象,然后调出内容
<?php
class test{
public $name = "Elapse";
public $age = "18";
}
$example=new test();
$example->name="Ernket";
$t = serialize($example);
$a=unserialize($t);
echo $a->name;
?>
产生漏洞的原因
那么上面清楚了序列化和反序列化后,这里就讲一哈反序列化漏洞产生的原因
PHP中,会产生这个漏洞的一大问题,在于PHP的魔法函数,魔法函数会因为某些条件的触发而自动执行某些指定的操作
__construct()当一个对象创建时被调用 __destruct()当一个对象销毁时被调用 __toString()当一个对象被当作一个字符串使用 __sleep() 在对象在被序列化之前运行 __wakeup将在序列化之后立即被调用
举一个任意命令执行的例子
<?php
class A{
var $test = "ls";
function __destruct(){
system($this->test);
}
}
$a = $_GET['test'];
$a_unser = unserialize($a);
?>
__destruct()
为当一个对象销毁时被调用,而我们可以通过反序列化的时候,调用A对象,因为PHP魔法函数的缘故,他会自动执行__destruct()的内容,接着就是system()部分
所以通过反序列化,就可以做到控制test这个变量,从而达到任意命令执行
====分割线====
参考链接:https://www.freebuf.com/articles/web/167721.html https://www.imooc.com/article/33036 https://www.freebuf.com/column/182293.html
- Linux下环境变量配置方法梳理(.bash_profile和.bashrc的区别)
- 小程序火爆的因素
- Log4Net使用心得
- nginx通过https方式反向代理多实例tomcat
- Linux系统下yum镜像源环境部署记录
- 特斯拉vs凯迪拉克vs奔驰:三大汽车自动驾驶系统比拼
- Centos下添加静态路由(临时和永久有效)的操作记录
- python如何保证输入键入数字
- 微信小程序自定义数据分析试水
- 挂载银行前置机Ukey到windows server2012虚拟机的操作记录
- 文件上传速度查询方法
- “AS3.0高级动画编程”学习:第三章等角投影(上)
- su: 无法设置用户ID: 资源暂时不可用
- NumPY学习笔记
- php概述
- php教程
- php环境搭建
- PHP书写格式
- php变量
- php常量
- PHP注释
- php数组
- php字符串 string
- PHP整型 integer
- PHP浮点型 float
- php布尔型
- php数据类型之数组
- php数据类型之对象
- php数据类型之null
- php数据类型之间的转换
- php运算符
- php表达式
- PHP循环控制
- PHP流程控制
- php函数
- php全局变量
- PHP魔术变量
- php命名空间
- php 日期
- PHP包含文件
- php文件
- PHP 文件上传
- php Cookies
- php Sessions
- php email
- php安全email
- php错误处理
- PHP异常处理
- php过滤器
- PHP 高级过滤器
- php json
- php 表单
- PHP MySQL 简介
- PHP 连接 MySQL
- php创建数据库
- php 创建表
- php mysq 插入数据
- PHP MySQL 插入多条数据
- PHP MySQL 预处理语句
- php mysql 读取数据
- php mysql where
- PHP MySQL Order By
- PHP MySQL Update
- PHP MySQL Delete
- php ODBC
- Hive-1.2.1_02_简单操作与访问方式
- PHP-CGI远程代码执行漏洞(CVE-2012-1823)分析
- Hive-1.2.1_03_DDL操作 1.1. Create Database1.2. Drop Database1.3. Use Database2.1. Cre
- Hive-1.2.1_04_DML操作 5.1. Join8.1. 使用案例8.2. Transform实现
- Hive-1.2.1_05_案例操作
- Mysql字符编码利用技巧
- Hive-1.2.1_06_累计报表查询
- Flume-1.8.0_部署与常用案例
- GlassFish 目录穿越漏洞测试过程
- 安装CDH7.1.1
- GIT-SHELL 沙盒绕过(CVE-2017-8386)
- Azkaban-2.5.0-部署与常见案例
- 无字母数字webshell之提高篇
- Sqoop-1.4.7-部署与常见案例
- Hbase-2.0.0_01_安装部署