PHP反序列漏洞学习
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反序列漏洞学习的更多相关文章
- XSS漏洞学习笔记
XSS漏洞学习 简介 xss漏洞,英文名为cross site scripting. xss最大的特点就是能注入恶意的代码到用户浏览器的网页上,从而达到劫持用户会话的目的. 说白了就是想尽办法让你加载 ...
- Typecho-反序列化漏洞学习
目录 Typecho-反序列化漏洞学习 0x00 前言 0x01 分析过程 0x02 调试 0x03 总结 0xFF 参考 Typecho-反序列化漏洞学习 0x00 前言 补丁: https://g ...
- Apache Dubbo Provider默认反序列漏洞复现(CVE-2020-1948)
Apache Dubbo Provider默认反序列漏洞(CVE-2020-1948) 0x01 搭建漏洞环境 漏洞介绍 2020年06月23日, 360CERT监测发现Apache Dubbo 官方 ...
- XXE漏洞学习笔记
XXE 参考文章 名称 地址 一篇文章带你深入理解漏洞之 XXE 漏洞 https://xz.aliyun.com/t/3357 Web Hacking 101 https://wizardforce ...
- PWN二进制漏洞学习指南
目录 PWN二进制漏洞学习指南 前言 前置技能 PWN概念 概述 发音 术语 PWN环境搭建 PWN知识学习途径 常见漏洞 安全机制 PWN技巧 PWN相关资源博客 Pwn菜鸡小分队 PWN二进制漏洞 ...
- JWT漏洞学习
JWT漏洞学习 什么是JWT? JWT是JSON Web Token的缩写,它是一串带有声明信息的字符串,由服务端使用加密算法对信息签名,以保证其完整性和不可伪造性.Token里可以包含所有必要的信息 ...
- FastJson远程命令执行漏洞学习笔记
FastJson远程命令执行漏洞学习笔记 Fastjson简介 fastjson用于将Java Bean序列化为JSON字符串,也可以从JSON字符串反序列化到JavaBean.fastjson.ja ...
- Fastjsonfan反序列链学习前置知识
Fastjson前置知识 Fastjson 是一个 Java 库,可以将 Java 对象转换为 JSON 格式,当然它也可以将 JSON 字符串转换为 Java 对象. Fastjson 可以操作任何 ...
- 黑客攻防技术宝典Web实战篇(二)工具篇DVWA Web漏洞学习
DVWA是一个学习Web漏洞的很好的工具. DVWA全程是Damn Vulnerable Web Application,还有一个跟它一样好的工具尽在http://www.360doc.com/con ...
随机推荐
- 介绍一个基于jQuery的Cookie操作插件
在网页客户端,我们经常会遇到读取或者设置cookie的情况,如果用纯生的js我们可能会遇到一些兼容性带来的麻烦,这里给大家介绍一个比较实用jquery操作cookie的插件,插件的源代码如下: jQu ...
- Linux系统接入小区宽带
jollywing(jollywing@foxmail.com) 安装 rp-pppoe 今天去联通营业厅开通了家庭宽带,回到家就搜索怎么用Linux接入小区宽带,发现大多数人都选择用PPPOE拨号上 ...
- 【CodeForces】906 D. Power Tower 扩展欧拉定理
[题目]D. Power Tower [题意]给定长度为n的正整数序列和模数m,q次询问区间[l,r]累乘幂%m的答案.n,q<=10^5,m,ai<=10^9. [算法]扩展欧拉定理 [ ...
- 学号20155308 2016-2017-2 《Java程序设计》第5周学习总结
学号20155308 2016-2017-2 <Java程序设计>第5周学习总结 教材学习内容总结 8.1 语法与继承架构 使用try...catch 注意多个catch一定把父类放后面 ...
- HDU 2094 产生冠军 dfs加map容器
解题报告:有一群人在打乒乓球比赛,需要在这一群人里面选出一个冠军,现在规定,若a赢了b,b又赢了c那么如果a与c没有比赛的话,就默认a赢了c,而如果c赢了a的话,则这三个人里面选不出冠军,还有就是如果 ...
- jquery对不同id的按钮执行同一类型的操作
不同id执行相同操作: $("#id1,#id2,#id3,#id4") 获取相同class的text值: $(".className").each(funct ...
- Docker基础速成(一)
Docker基础速成(一) 给亲爱的写的docker基础速成,按照步骤操作,实践出真知,希望有提纲挈领之功效 1.docker简介 Docker 轻量级容器,如图,类似于一个个集装箱,把复杂或者零散的 ...
- 事件,使用.net自带委托EventHandler
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- 编译器是如何实现32位整型的常量整数除法优化的?[C/C++]
引子 在我之前的一篇文章[ ThoughtWorks代码挑战——FizzBuzzWhizz游戏 通用高速版(C/C++ & C#) ]里曾经提到过编译器在处理除数为常数的除法时,是有优化的,今 ...
- MySQL 四种链接
1.内联接 INNER JOIN(典型的联接运算,使用像 = 或 <> 之类的比较运算符).包括相等联接和自然联接. 内联接使用比较运算符根据每个表共有的列的值匹配两个表中的行. ...