news 2026/7/12 3:23:14

Xiuno BBS 审计之问题01:后台所有操作无 CSRF Token 校验

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Xiuno BBS 审计之问题01:后台所有操作无 CSRF Token 校验

问题:后台所有操作无 CSRF Token 校验

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

现象

Xiuno BBS 4.0.4 后台鉴权仅依赖bbs_admin_tokenCookie,admin_token_check()只校验该 Cookie 是否能被xn_decrypt解密且未过期,全程不校验任何 CSRF Token(既不校验请求体中的 token 字段,也不校验Origin/Referer头)。这意味着攻击者只需诱导已登录管理员访问恶意页面,即可通过跨站请求伪造触发后台任意写操作:增删管理员、修改站点配置、上传/安装插件、清空数据库等。

后台admin/route/*.php中所有 POST 分支均未调用任何 token 校验函数,admin_token_check()是唯一的鉴权入口,且其内部不含任何 anti-CSRF 机制。

源码证据

证据 1:后台鉴权函数仅校验 Cookie,无 CSRF Token 文件:xiunobbs_4.0.4/admin/admin.func.php行 8-45

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'); if(empty($admin_token)) { $_REQUEST[0] = 'index'; $_REQUEST[1] = 'login'; } else { $s = xn_decrypt($admin_token, $key); if(empty($s)) { setcookie('bbs_admin_token', '', 0, '', '', '', TRUE); message(-1, lang('admin_token_expiry')); } list($_ip, $_time) = explode("\t", $s); // 后台超过 3600 自动退出。 if((XN_ADMIN_BIND_IP && $_ip != $longip || !XN_ADMIN_BIND_IP) && $time - $_time > 3600) { setcookie('bbs_admin_token', '', 0, '', '', '', TRUE); message(-1, lang('admin_token_expiry')); } // 超过半小时,重新发新令牌,防止过期 if($time - $_time > 1800) { admin_token_set(); } } }

第 17 行:$admin_token = param('bbs_admin_token');仅从 Cookie 取 token,无任何 POST/GET token 字段校验,无Referer/Origin校验。默认XN_ADMIN_BIND_IP为空(行 6),IP 绑定不生效,CSRF 不受 IP 限制。

证据 2:后台 POST 操作均无 token 校验(示例) 文件:xiunobbs_4.0.4/admin/route/index.php行 21-40

} else if($method == 'POST') { // hook admin_index_login_post_start.php $password = param('password'); if(md5($password.$user['salt']) != $user['password']) { xn_log('password error. uid:'.$user['uid'].' - ******'.substr($password, -6), 'admin_login_error'); message('password', lang('password_incorrect')); } admin_token_set(); xn_log('login successed. uid:'.$user['uid'], 'admin_login'); message(0, jump(lang('login_successfully'), '.')); }

登录 POST 不校验 token。其余后台路由(admin/route/setting.phpadmin/route/user.phpadmin/route/forum.phpadmin/route/plugin.php等)的 POST 分支同样仅依赖admin_token_check(),无独立 token 校验。

证据 3:插件安装/卸载等高危操作无 token 文件:xiunobbs_4.0.4/admin/route/plugin.php行 155-201

} elseif($action == 'install') { plugin_lock_start(); $dir = param_word(2); plugin_check_exists($dir); $name = $plugins[$dir]['name']; plugin_check_dependency($dir, 'install'); plugin_install($dir); $installfile = APP_PATH."plugin/$dir/install.php"; if(is_file($installfile)) { include _include($installfile); } plugin_lock_end(); // ... $msg = lang('plugin_install_sucessfully', array('name'=>$name)); message(0, jump($msg, http_referer(), 3)); }

插件安装会include插件目录下的install.php(第 173-175 行),属极高危操作,但全程无 CSRF Token。攻击者构造<img src="http://victim/admin/plugin-install-恶意插件">即可诱导管理员访问时自动安装含恶意install.php的插件,实现 RCE。

风险等级与结论

风险等级:高危

结论:

  1. 后台所有 POST 操作无 CSRF Token,鉴权仅靠 Cookie,构成完整的 CSRF 漏洞。
  2. 结合bbs_admin_tokenCookie 未设SameSite属性(见 Cookie 安全审计),浏览器默认不会拦截跨站请求携带 Cookie,CSRF 可直接生效。
  3. 影响面覆盖后台全部功能:增删管理员、改配置、安装/卸载插件(含include install.php→ RCE)、删帖删版块。
  4. 修复建议:在admin_token_check()中对非 GET 请求强制校验请求体内的 CSRF Token(-session 绑定、一次性 token);校验Origin/Referer头;Cookie 设置SameSite=Lax/Strict;敏感操作(插件安装、配置修改)追加二次密码确认。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/12 3:22:29

Java核心基础:反射与泛型底层原理及实战用法详解

在Java开发中&#xff0c;反射和泛型是两大核心基础特性&#xff0c;几乎贯穿所有主流框架&#xff08;Spring、MyBatis等&#xff09;的底层设计。反射赋予了Java动态运行的能力&#xff0c;让程序可以在运行期操控类的结构&#xff1b;泛型则解决了代码类型安全与复用问题&am…

作者头像 李华
网站建设 2026/7/12 3:21:25

基于GBDT的次日降水量预测实验

1 实验概述本实验基于里根国际机场NCDC气象观测数据集&#xff0c;时间跨度为1973年1月至2025年8月&#xff0c;构建次日降水量智能预测模型。实验采用时序严格划分方式开展模型训练与验证&#xff1a;以2022年及以前全部时序数据作为训练集&#xff0c;2023年到2025年最新数据…

作者头像 李华
网站建设 2026/7/12 3:19:48

ZeroMQ C++高效部署:从核心模式到生产环境调优实战

1. 项目概述&#xff1a;为什么说ZeroMQ是系统级编程的“终极武器”&#xff1f;在分布式系统、微服务架构和高性能计算领域&#xff0c;消息传递是构建松耦合、可扩展应用的核心。从业十几年&#xff0c;我见过太多项目在通信层上栽跟头&#xff1a;要么是自研的TCP/UDP封装层…

作者头像 李华
网站建设 2026/7/12 3:17:01

Linux内核物理内存管理:从伙伴系统到slab分配器深度解析

Linux内核物理内存管理是操作系统核心功能之一&#xff0c;直接关系到系统性能和稳定性。这次我们深入探索Linux内核如何管理物理内存&#xff0c;从内存探测、伙伴系统到slab分配器&#xff0c;分析内核如何高效分配和回收内存资源。物理内存管理涉及从硬件层的内存布局探测到…

作者头像 李华