问题:后台 phpinfo() 泄露完整服务器环境信息,存在严重安全风险
先说几个关键点:本次安全审计是在 XIUNOX 版本重构过程中发现的,该版本目前已修复此漏洞。之所以单独拿出来剖析,是因为对于后续计划基于 Xiuno BBS 4.0.4 维护版本或开发插件模板的开发者、站长而言,这是一个非常值得警惕的经典漏洞案例,涉及后台权限滥用、CSRF 攻击路径及敏感信息泄露。

漏洞现象
问题出在后台入口文件。具体来说,Xiuno BBS 4.0.4 后台的 admin/route/index.php 中,预留了一个名为 phpinfo 的动作分支,直接调用 phpinfo() 函数,将完整的 PHP 环境信息毫无保留地输出到页面。
你也可能会想:“这个功能位于后台,只有管理员才能访问,应该问题不大吧?” 但实际情况远比想象复杂。关键在于,后台的身份验证机制完全依赖 Cookie,且未引入 CSRF Token 保护(该问题在独立审计文件中也有详细说明)。这意味着攻击者完全可以构造恶意请求,诱使管理员访问 admin-index-phpinfo.htm。一旦管理员在浏览器中打开该页面,phpinfo() 就会完整渲染,泄露大量敏感数据。
更麻烦的是,phpinfo() 的输出内容极为丰富,涵盖:服务器绝对路径、PHP 版本、已加载扩展、$_SERVER、$_ENV、$_COOKIE,甚至数据库连接句柄等关键信息。这些数据落入攻击者手中,将带来以下威胁:
- 探测绝对路径,辅助文件包含或路径遍历攻击
- 获取 PHP 版本及禁用函数列表(disable_functions),为命令执行创造条件
- 挖掘 document_root、upload_tmp_dir、open_basedir 等关键路径配置
这里特别值得警惕的是,如果 phpinfo 页面被搜索引擎缓存或收录(后台 URL 结构相对简单,容易被猜测),那么即使未认证用户,也可能通过搜索引擎快照获取这些敏感信息,进一步扩大风险面。
代码中虽然尝试通过 unset($_SERVER['conf'])、unset($_SERVER['db'])、unset($_SERVER['cache']) 擦除部分业务变量,但这基本是杯水车薪——phpinfo 仍然会暴露 $_COOKIE(包含 bbs_admin_token)、$_SERVER['HTTP_COOKIE']、环境变量以及所有 ini 配置,大量敏感数据依然处于裸露状态。
源码证据
证据 1:后台 phpinfo 动作直接调用 phpinfo()
文件:xiunobbs_4.0.4/admin/route/index.php 第 50-57 行
} elseif ($action == 'phpinfo') {
unset($_SERVER['conf']);
unset($_SERVER['db']);
unset($_SERVER['cache']);
phpinfo();
exit;
}
第 55 行直接调用 phpinfo(),输出完整的 PHP 信息。而 action 来自 param(1)(第 5 行),即 URL 路径的第二段。访问 admin-index-phpinfo.htm 即可触发。值得注意的是,在 exit 之前,没有任何额外的访问控制或输出过滤。
证据 2:后台鉴权依赖可被 CSRF 绕过的 Cookie
文件:xiunobbs_4.0.4/admin/admin.func.php 第 8-17 行
function admin_token_check() {
global $longip, $time, $useragent, $conf;
$useragent_md5 = md5($useragent);
//$key = md5($longip.$useragent_md5.$conf['auth_key']); // 有些环境是动态 IP
$key = md5((XN_ADMIN_BIND_IP ? $longip : '').$useragent_md5.xn_key());
// hook admin_token_check_start.php
$admin_token = param('bbs_admin_token');
}
后台只校验 bbs_admin_token 这个 Cookie,完全没有 CSRF Token 保护。攻击者可以构造一个 标签,诱导管理员访问,虽然 不会渲染 phpinfo 的 HTML,但通过 或其他方式,依然可以完成攻击。这个漏洞的利用路径,其实已经相当清晰了。
