Chybeta

某CMS V5.7 SP2 后台Getshell

首发于:阿里先知安全社区:某CMS V5.7 SP2 后台Getshell

dede/sys_info.php中

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
//保存配置的改动
if($dopost=="save")
{
if(!isset($token)){
echo 'No token found!';
exit;
}
if(strcasecmp($token, $_SESSION['token']) != 0){
echo 'Token mismatch!';
exit;
}
foreach($_POST as $k=>$v)
{
if(preg_match("#^edit___#", $k))
{
$v = cn_substrR(${$k}, 1024);
}
else
{
continue;
}
$k = preg_replace("#^edit___#", "", $k);
$dsql->ExecuteNoneQuery("UPDATE `#@__sysconfig` SET `value`='$v' WHERE varname='$k' ");
}
ReWriteConfig();
ShowMsg("成功更改站点配置!", "sys_info.php");
exit();
}

在选择更改配置后,通过foreach($_POST as $k=>$v)接受参数,并且将参数内容写入了数据库,之后进入ReWriteConfig();

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
//更新配置函数
function ReWriteConfig()
{
global $dsql,$configfile;
if(!is_writeable($configfile))
{
echo "配置文件'{$configfile}'不支持写入,无法修改系统配置参数!";
exit();
}
$fp = fopen($configfile,'w');
flock($fp,3);
fwrite($fp,"<"."?php\r\n");
$dsql->SetQuery("SELECT `varname`,`type`,`value`,`groupid` FROM `#@__sysconfig` ORDER BY aid ASC ");
$dsql->Execute();
while($row = $dsql->GetArray())
{
if($row['type']=='number')
{
if($row['value']=='') $row['value'] = 0;
fwrite($fp,"\${$row['varname']} = ".$row['value'].";\r\n");
}
else
{
fwrite($fp,"\${$row['varname']} = '".str_replace("'",'',$row['value'])."';\r\n");
}
}
fwrite($fp,"?".">");
fclose($fp);
}

这里的代码将前面插入数据库的数据直接取出,没有再做验证。在while($row = $dsql->GetArray()),有两个分支,当$row['type']=='number'时,会往文件中直接写入,其他情况下会进行一次str_replace("'",'',$row['value'])将单引号替换掉。所以我们考虑使用第一个分支。

比如使用参数cfg_ftp_port,它表示采用的ftp端口

我们填入值为21;phpinfo():

Getshell:

查看配置文件 data/config.cache.inc.php

微信扫码加入知识星球【漏洞百出】
chybeta WeChat Pay

点击图片放大,扫码知识星球【漏洞百出】

本文标题:某CMS V5.7 SP2 后台Getshell

文章作者:chybeta

发布时间:2018年02月27日 - 12:02

最后更新:2018年02月27日 - 12:02

原始链接:http://chybeta.github.io/2018/02/27/某CMS-V5-7-SP2-后台Getshell/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。