0x00 序列化和反序列化

在PHP中,序列化和反序列化对应的函数分别为serialize()和unserialize()。

序列化:serialize()将对象转换为字符串以便存储传输的一种方式。

反序列化:unserialize()将序列化以后产生的字符串转换为对象供程序使用。

反序列化本身并不危险,但是如果在反序列化时,传入反序列化函数的参数可以被用户控制那将会是一件非常危险的事情。所以,反序列化的危害,关键还是在于可控或不可控。

0x01 PHP序列化格式

1、基础格式

Boolean

b:;
b:1;// True
b:0;// False

Integer

i:;
i:1;//1
i:-4;//-4

Double

d:;
d:1.234560000000001;//1.23456(PHP弱类型造成的四舍五入现象)

NULL

N;

String

s::"";
s:4:"name";//name(4指的是name的字符长度)

Array

a::{key,value pairs};
a:2:{s:4:"key1";s:6:"value1";s:4:"key2";s:6:"value2";}// array("key1"=>"value1","key2"=>"value2")

2、序列化举例

class_serializ.php

<?php
class Person{
private $name = 'Thinking';
public $sex = 'man';
function say($name,$sex)
{
echo "My name is ".$name."I am a ".$sex;
}
} $Person = new Person();
echo serialize($Person); ?>

运行结果:

O:6:"Person":2:{s:12:"Personname";s:8:"Thinking";s:3:"sex";s:3:"man";}
O 代表object
6 代表对象名字Person占6个字符
Person 对象名
2 代表对象里面有2个变量
s 变量数据类型,s代表string类型
12 代表变量名的字符长度
Personname 代表这是一个私有变量,变量名是name
Thinking 代表是变量name的值

3、反序列化实例

<?php
class Person{
private $name = 'Thinking';
public $sex = 'man';
function say($name,$sex)
{
echo "My name is ".$name."I am a ".$sex;
}
} $Person = new Person();
$seri = serialize($Person);
$unseri = unserialize($seri);
var_dump($unseri)
?>

输出结果

object(Person)#2 (2) { ["name":"Person":private]=> string(8) "Thinking" ["sex"]=> string(3) "man" }

0x02 PHP(反)序列化有关的魔法函数

__construct()

构造函数,当一个对象创建时被调用

__destruct()

析构函数,当一个对象销毁时被调用

call(),callStatic()

方法重载的两函数

__call()是在对象上下文中调用不可访问的方法是时触发

__callStatic()是在静态上下文中调用不可访问的方法是触发

get(),set()

__get()用于从不可访问的属性读取数据

__set()用于将数据写入不可访问的属性

isset(),unset()

__isset()在不可访问的属性上调用isset()或empty()时触发

__unset()在不可访问的属性上使用unset()是触发

sleep(),wakeup()

__sleep()在对象被序列化之前运行

__wakeup()将在序列化之后立即被调用

__toString()

__toString()方法允许一个类决定如何处理像一个字符串时它将如何反应

这么多的魔术方法中我们所需要关注的方法也就是__destruct() 和 __wakeup() 方法.这两个方法中前者是在对象被销毁时程序会自动调用,后者是在类对象被反序列化时被调用.所以这两个方法是在 对象反序列化一直到程序执行完毕这整个过程中,必定会被调用的方法,如果在这两个函数中有一些危险的动作,并且能够被我们所利用,那么漏洞并出现了。

举个简单的例子

test.php

<?php
class A{
var $test = "demo";
function __destruct(){
echo $this->test;
} } $a = $_GET['test'];
$unser = unserialize($a);
?>

我们只要构造payload:

http://127.0.0.1/serialize/test.php?test=O:1:"A":1:{s:4:"test";s:5:"hello";}

就能控制echo出的变量。

0x03 PHP反序列化与POP链

在反序列化中,我们所能控制的数据就是对象中的各个属性值,所以在PHP反序列化有一种漏洞利用方法叫做“面向属性编程”,即POP(Property Oriented Programming)。和二进制漏洞中常用的ROP技术类似。在ROP中我们往往需要一段初始化gadgets来开始我们的整个利用过程,然后继续调用其他的gadgets。在PHP反序列化漏洞利用技术POP中,对应的初始化gadgets就是__wakeup()或者是__destruct()方法,在最理想的情况下能够实现漏洞利用的点就在这两个函数中,但往往我们需要从这个函数开始,逐步的跟进在这个函数中调用到的所有函数,直至找到可以利用的点为止。

下面列举在跟进其函数调用过程中需要关注一些有价值的函数。

命令执行:

exec()
passthru()
popen()
system()

文件操作:

file_put_contents()
file_get_contents()
unlink()

PHP反序列漏洞学习的更多相关文章

  1. XSS漏洞学习笔记

    XSS漏洞学习 简介 xss漏洞,英文名为cross site scripting. xss最大的特点就是能注入恶意的代码到用户浏览器的网页上,从而达到劫持用户会话的目的. 说白了就是想尽办法让你加载 ...

  2. Typecho-反序列化漏洞学习

    目录 Typecho-反序列化漏洞学习 0x00 前言 0x01 分析过程 0x02 调试 0x03 总结 0xFF 参考 Typecho-反序列化漏洞学习 0x00 前言 补丁: https://g ...

  3. Apache Dubbo Provider默认反序列漏洞复现(CVE-2020-1948)

    Apache Dubbo Provider默认反序列漏洞(CVE-2020-1948) 0x01 搭建漏洞环境 漏洞介绍 2020年06月23日, 360CERT监测发现Apache Dubbo 官方 ...

  4. XXE漏洞学习笔记

    XXE 参考文章 名称 地址 一篇文章带你深入理解漏洞之 XXE 漏洞 https://xz.aliyun.com/t/3357 Web Hacking 101 https://wizardforce ...

  5. PWN二进制漏洞学习指南

    目录 PWN二进制漏洞学习指南 前言 前置技能 PWN概念 概述 发音 术语 PWN环境搭建 PWN知识学习途径 常见漏洞 安全机制 PWN技巧 PWN相关资源博客 Pwn菜鸡小分队 PWN二进制漏洞 ...

  6. JWT漏洞学习

    JWT漏洞学习 什么是JWT? JWT是JSON Web Token的缩写,它是一串带有声明信息的字符串,由服务端使用加密算法对信息签名,以保证其完整性和不可伪造性.Token里可以包含所有必要的信息 ...

  7. FastJson远程命令执行漏洞学习笔记

    FastJson远程命令执行漏洞学习笔记 Fastjson简介 fastjson用于将Java Bean序列化为JSON字符串,也可以从JSON字符串反序列化到JavaBean.fastjson.ja ...

  8. Fastjsonfan反序列链学习前置知识

    Fastjson前置知识 Fastjson 是一个 Java 库,可以将 Java 对象转换为 JSON 格式,当然它也可以将 JSON 字符串转换为 Java 对象. Fastjson 可以操作任何 ...

  9. 黑客攻防技术宝典Web实战篇(二)工具篇DVWA Web漏洞学习

    DVWA是一个学习Web漏洞的很好的工具. DVWA全程是Damn Vulnerable Web Application,还有一个跟它一样好的工具尽在http://www.360doc.com/con ...

随机推荐

  1. [转载]学习C语言基本思路与参考书籍

    http://zhuanlan.zhihu.com/linjr/19694823 计算机行业发展非常快,大学里的教育基本都跟不上实际的社会需求.如果你所在的学校还在指定大家使用谭浩强的教材,或使用VC ...

  2. 解析html与xhtml的神器——HTMLParser与SGMLParser

    有时候你要把抓回来的数据进行提取,过大篇幅的html标签,你若使用正则表达式进行匹配的话,显然是低效的,这时使用python的HTMLParser模块会显得非常方便.据说还有个比较好用的解析器叫:Be ...

  3. 【Linux】SecureCRT连接Linux乱码

    SecureCRT连接linux出现乱码问题.解决方法. 打开SecureCRT-->option-->Session option

  4. How To Configure VMware fencing using fence_vmware_soap in RHEL High Availability Add On——RHEL Pacemaker中配置STONITH

    本文主要简单介绍一下如何在RHEL 7 Pacemaker中配置一个fence_vmware_soap类型的STONITH设备(仅供测试学习). STONITH是Shoot-The-Other-Nod ...

  5. SpringBoot与异步任务、定时任务、邮件任务

    异步任务 在需要开启异步的服务加上注解:@Async @Service public class AsyncService { //告诉SpringBoot这是一个异步任务,SpringBoot会自动 ...

  6. CentOS 6 / RHEL 6配置bonding 4模式

    实现bond 802.3ad or 4 模式:(IEEE 802.3ad), 方式:创建一个整合的组,这个组会共享网速和网络双工(duplex)设置.模式 4 会根据 IEEE 802.3ad 标准使 ...

  7. js中call与apply的区别以及使用~

    今天看了一下call与apply的区别~~ <!DOCTYPE html> <html> <head> <title>testCall</titl ...

  8. Shell基础-Bash命令类型

    Bash命令大体可以分为两类: 第一类是可执行文件,例如ls等 第二类是Bash内建命令,常见echo,cd等 bash命令优先级表:1别名  由alias指定 2关键字 3函数  由function ...

  9. 使用数据库管理工具打开MySql

    1.推荐使用软件:Navicat_Premium_11.0.10.exe.  下载地址:http://pan.baidu.com/s/1nu6mTF7 2.下载上面文件并安装. 3.打开Navicat ...

  10. NuGet套件还原步骤(以vs2012为例)

    下载别人的范例,出现由于Nuget套件不存在而无法启动时: 效果如下图: 步骤如下: 1.点击 项目->启用NuGet程序包还原 2.点击下图中的是 3.点击下图中的确定 4.效果如图: . 5 ...