Drupal Coder 模块远程命令执行分析(SA-CONTRIB-2016-039)

文章目录

作者:曾鸿坤@安恒安全研究院、黄伟杰@安恒安全研究院

背景:

今年7月13日,Drupal发布了一个高危漏洞公告(DRUPAL-SA-CONTRIB-2016-039),即Coder模块的远程代码执行(在没有启用模块的情况下,漏洞也可以被触发)。
但是这个模块不是Drupal默认自带的模块,所以影响范围有限。

Drupal的Coder模块主要有以下两个功能:

  1. 用来检查代码文件是否符合Drupal编码标准,是否兼容当前版本的Drupal API。
  2. 用来将旧模块升级至符合当前Drupal标准的模块。

影响范围:

Coder module 7.x-1.x versions prior to 7.x-1.3.
Coder module 7.x-2.x versions prior to 7.x-2.6.

分析

测试环境:Drupal 7.50, Coder 7.x-2.5.

我们从网上找到个现有的POC (https://gist.github.com/Raz0r/7b7501cb53db70e7d60819f8eb9fcef5),内容如下:

但是在我们的环境下,上面POC无法正常使用。然后就开始了我们的修改POC和分析漏洞之路。

在文件/sites/all/modules/coder/coder_upgrade/scripts/coder_upgrade.run.php的开头,有这样两行代码:

导致后面代码碰到Warning后都会自动退出,所以整个POC之路有点曲折。

0. 我们先快速查找下导致命令注入的位置。

通过POC可知是从items[‘old_dir’]注入命令,所以我们跟踪$items这个变量,得到以下路线。

  • 从coder_upgrade.run.php开始->$item变量进入coder_upgrade_start($upgrades, $extensions, $items)这个函数.
  • coder_upgrade_start函数声明在main.inc文件, 之后$items变成$item进入coder_upgrade_make_patch_file($item, $_coder_upgrade_replace_files)函数。
  • coder_upgrade_make_patch_file函数声明在仍然在main.inc文件,最后$item内的old_dir和new_dir被取出,进入shell_exec(“diff -up -r {$old_dir} {$new_dir} > {$patch_filename}”);,从而导致命令注入。

1. 下面我们看coder_upgrade.run.php的代码:

所以要执行到coder_upgrade_start,同时满足上面分析的所有条件,POC已经被我们修改为:

2. 接下来,我们看coder_upgrade_start函数的声明:

在/sites/all/modules/coder/coder_upgrade/includes/main.inc文件中:

“2.1后”,我们的POC被修改为:

3. 跟踪coder_upgrade_convert_dir函数:

“3.3后”,POC修改为:

我们回到2的coder_upgrade_start函数,此时我们已经可以进入coder_upgrade_make_patch_file函数,下面看coder_upgrade_make_patch_file函数的声明:

我们最终POC为:

 

原文链接:,转发请注明来源!

发表评论

要发表评论,您必须先登录