漏洞分析

漏洞介绍

Discuz X 3.2 最新版源码包中存在默认插件好贷站长联盟(dzapp_haodai),但是没有开启。由于插件代码
存在多个安全问题 ,如果站长启用会存在一个前台普通用户可以远程代码执行。

代码分析

插件后台管理模块由于没有设置权限可以直接通过前台插件接口调用
例如文件source\plugin\dzapp_haodai\admincp_callback.inc.php 12行

1
2
3
if(!defined('IN_DISCUZ') || !defined('IN_DISCUZ')) { //第二个应该是  !defined('IN_ADMINCP')
exit('Access Denied');
}

由于没有设置IN_ADMINCP ,根据discuz插件开发引擎,可以通过根目录的Plugin.php
直接越权调用插件的后台管理功能。
例如 http://web/plugin.php?id=dzapp_haodai:admincp_callback

同时此文件还存在任意php代码写入漏洞。
文件source\plugin\dzapp_haodai\admincp_callback.inc.php 68行

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$config = array();
$config['HD_REF'] = $_GET['REF']; //可控
$config['HD_AKEY'] = $_GET['AKEY'];
$config['HD_SKEY'] = $_GET['SKEY'];
$config['HD_CALLBACK_URL'] = $_GET['CALLBACK_URL'];
$config['HD_API_HOST'] = $_GET['API_HOST'];
$config['HD_CITY'] = defined('HD_CITY') ? HD_CITY : '';
$configfile = "<?php \r\n";
foreach($config as $key => $value){
$configfile .= "define('$key', '$value');\r\n"; //可以写入个单引号逃逸,直接执行php代码
}
$configfile .= "?>";
$file = DISCUZ_ROOT."./data/dzapp_haodai_config.php";
$fp = fopen($file, 'w');
fwrite($fp, $configfile);
fclose($fp);

由于Discuz 重写的$_GET 变量,不受GPC转义影响,虽然写配置文件的变量有单引号保护,但是
可以直接传入一个单引号逃逸,执行任意php代码。
例如发送以下数据包,直接执行phpinfo。

1
2
http://web/plugin.php?id=dzapp_haodai:admincp_callback 
ok=1&formhash={$formhash}&REF={$exploit}

由于存在submitcheck 检查需要登录一个普通用户,$formhash 为当前用户的formhash ,$exploit为传入的恶意代码。效果如下图

前台普通用户发送一下数据包直接执行phpinfo。
同时文件 \source\plugin\dzapp_haodai\admincp_city.inc.php 也存在一样的问题。

修复建议

  1. 后台管理模块加上 !defined(‘IN_ADMINCP’) 判断
  2. 写文件处变量转义