Xiuno BBS 审计之问题07:安装目录安装完成后无删除、无锁定
贰先生 5小时前

问题:安装目录 install/ 安装完成后未自动清理或锁定,且"已安装"检测可被绕过

此文章为XIUNOX版本重构审计时发现问题,分享出来方便后续想基于xiuno bbs4.0.4版本制作维护版本或插件模板等需求的开发者和站长参考。

现象

Xiuno BBS 4.0.4 安装脚本 install/index.php 在完成建库、建表、写入配置后,既不删除 install/ 目录,也不写入 .htaccess/锁文件进行访问锁定。唯一的"已安装"检测逻辑存在设计缺陷:检测条件 is_file(conf.php) AND DEBUG != 2 中的 DEBUG 在本文件第 3 行被硬编码为 2,导致该条件永远为 FALSE,"已安装"提示永不触发。

这意味着安装完成后,install/index.php 仍可被任意访问者重新执行,结合该脚本中的 SQL 注入(CREATE DATABASE $name,见独立审计文件)可导致数据库被重置、配置被覆盖、管理员账号被劫持。

源码证据

证据 1:DEBUG 被硬编码为 2,"已安装"检测被绕过 文件:xiunobbs_4.0.4/install/index.php 行 3、29

define('DEBUG', 2);
define('APP_PATH', realpath(dirname(__FILE__).'/../').'/');
define('INSTALL_PATH', dirname(__FILE__).'/');
// ...
// 安装初始化检测,放这里
is_file(APP_PATH.'conf/conf.php') AND DEBUG != 2 AND message(0, jump(lang('installed_tips'), '../'));

第 3 行 define('DEBUG', 2) 强制设定 DEBUG=2;第 29 行 DEBUG != 2 恒为 FALSE,AND 短路,message() 永不执行。因此即使 conf/conf.php 已存在(站点已安装),访问 install/index.php 仍可进入安装流程。

证据 2:安装完成后无任何目录清理/锁定 文件:xiunobbs_4.0.4/install/index.php 行 184-196(安装收尾逻辑)

// 初始化
copy(APP_PATH.'conf/conf.default.php', APP_PATH.'conf/conf.php');

// 管理员密码
$salt = xn_rand(16);
$password = md5(md5($adminpass).$salt);
$update = array('username'=>$adminuser, 'email'=>$adminemail, 'password'=>$password, 'salt'=>$salt, 'create_date'=>$time, 'create_ip'=>$longip);
db_update('user', array('uid'=>1), $update);

$replace = array();
$replace['db'] = $conf['db'];
$replace['auth_key'] = xn_rand(64);
$replace['installed'] = 1;
file_replace_var(APP_PATH.'conf/conf.php', $replace);

安装收尾仅 copy 生成 conf.php、更新管理员密码、写入配置变量,全程无 rmdir/unlink/rename/chmod/file_put_contents('.lock') 等清理或锁定操作。对 install/ 全目录 grep rmdir|unlink|rename|chmod|htaccess|deny|lock 零匹配,确认安装完成后目录原样保留且可公开访问。

证据 3:安装流程含 SQL 注入,未清理则成为持久攻击面 文件:xiunobbs_4.0.4/install/index.php 行 135、152

mysql_query("CREATE DATABASE $name");
// ...
$r = $link->exec("CREATE DATABASE `$name`");

$name 来自 POST 参数,直接拼入 CREATE DATABASE。由于 install 目录未清理,该注入点在安装后长期暴露,任意未认证访问者可重新触发安装并利用 SQL 注入。

风险等级与结论

风险等级:高危

结论:

  1. install/ 目录安装完成后无删除、无锁定、无 .htaccess 拒绝访问,长期暴露。
  2. "已安装"检测因 DEBUG=2 硬编码而失效,访问者可重复执行安装流程。
  3. 重复执行安装会 copy 覆盖 conf/conf.phpdb_update 重置管理员密码,导致既有站点数据/配置被破坏或劫持。
  4. 结合 install 脚本中的 CREATE DATABASE SQL 注入,未清理的 install 目录构成持久化的未认证 SQL 注入攻击面。
  5. 修复建议:安装完成后自动 rmdir_recusive 删除 install/ 目录,或写入 .lock 文件并在入口检测;修正"已安装"检测逻辑(不依赖本文件内 DEBUG 常量,改用独立变量或直接判断 conf.php  exit);Web 服务器层对 install/ 目录配置 Deny from all 或返回 403。
最新回复 (0)
全部楼主
返回