Xiuno BBS 审计之问题09:登录回跳 referer 未严格校验,存在开放重定向风险

问题:登录回跳 referer 未严格校验,存在开放重定向风险

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

现象

Xiuno BBS 4.0.4 的 user_http_referer() 函数用于登录后回跳,它优先从 param('referer')(GET/POST 参数)获取回跳地址,仅在为空时才回退到 HTTP_REFERER。虽然函数对回跳地址做了正则校验(要求 ^[\w\/]*$ 或 ^\??[\w\-/]+\.htm$),但该校验:

  1. 允许任意以字母数字下划线开头的相对路径,攻击者可构造 //evil.com/path 形式(双斜杠开头)绕过同站假设,浏览器会将其解析为协议相对 URL 跳转到外部域名
  2. 正则 ^[\w\/]*$ 允许纯 / 与字母组合,配合 http_location() 直接 header('Location:'.$url) 输出,无 host 白名单

http_location() 函数本身对传入 URL 完全不校验,任意路由调用它都可被用于重定向。

源码证据

文件:xiunobbs_4.0.4/route/user.php 行 405-423(user_http_referer 函数)

php 复制代码
function user_http_referer() {
	// hook user_http_referer_start.php
	$referer = param('referer'); // 优先从参数获取 | GET is priority
	empty($referer) AND $referer = array_value($_SERVER, 'HTTP_REFERER', '');

	$referer = str_replace(array('\"', '"', '<', '>', ' ', '*', "\t", "\r", "\n"), '', $referer); // 干掉特殊字符 strip special chars

	// hook user_http_referer_check_start.php
	if(
		!preg_match('#^(http|https)://[\w\-=/\.]+/[\w\-=.%\#?]*$#is', $referer)
		&& !preg_match('#^\??[\w\-/]+\.htm$#', $referer2)
		|| strpos($referer, 'user-login.htm') !== FALSE
		|| strpos($referer, 'user-logout.htm') !== FALSE
		|| strpos($referer, 'user-create.htm') !== FALSE
		|| strpos($referer, 'user-setpw.htm') !== FALSE
		|| strpos($referer, 'user-resetpw_complete.htm') !== FALSE
	) {
		$referer = './';
	}
	// hook user_http_referer_end.php
	return $referer;
}

注意:第二个正则分支引用了未定义变量 $referer2(应为 $referer),导致该分支永远不匹配,校验逻辑存在 bug。

文件:xiunobbs_4.0.4/xiunophp/misc.func.php 行 1363-1366(http_location 无校验)

php 复制代码
function http_location($url) {
	header('Location:'.$url);
	exit;
}

调用点 route/user.php 行 60、116:登录成功后 message(0, jump(..., $referer, 1)),jump 最终通过 http_location 输出 Location 头。

风险等级与结论

中危

危害后果:

  • 钓鱼攻击:攻击者构造 user-login.htm?referer=//evil.com/phishing 链接诱骗用户登录,登录成功后跳转到钓鱼站点窃取二次凭据
  • OAuth/SSO 回调劫持:若站点接入第三方登录,回跳地址可控可导致授权码被劫持
  • 校验函数引用未定义变量 $referer2,第二正则分支永远失效,部分本应被拒的 URL 漏过
  • http_location 无任何 host 白名单,业务代码任意调用即形成开放重定向

修复建议:

  1. 修复 $referer2 未定义变量 bug
  2. 校验回跳 URL 必须以 / 开头且不以 // 开头(防协议相对 URL)
  3. 解析 URL 后校验 host 必须等于当前站点 host
  4. http_location 增加 host 白名单参数,拒绝外部域名
相关推荐
明月_清风8 小时前
Muse 登顶 App Store 第一,SDK 直接开源:AI Agent 开始进入下一个阶段
人工智能·后端
hsfxuebao10 小时前
Loop Engineering 保姆级教程 + 项目实战
人工智能·后端
打工仔折腾 AI11 小时前
从 Demo 到生产级 Agent:8 个关键设计机制与 Python 实现拆解
java·jvm·人工智能·后端·python·langchain·ai agent 实战
架构技术专栏11 小时前
交叉熵:AI 怎样给概率预测打分
后端
IT_陈寒13 小时前
SpringBoot自动配置坑了我一把,原来是这样绕过去的
前端·人工智能·后端
要努力啊46913 小时前
用 Codex 加速 Java 开发:从代码生成到测试覆盖的完整实战
后端
dora13 小时前
LangChain4j 新手入门实战教程(Java版)
后端·langchain·agent
蜗牛互联网13 小时前
MongoDB Atlas Agent Engine之后,如何用版本门禁防止陈旧写入
java·数据库·人工智能·后端·mongodb
付威202313 小时前
Rust 生命周期:为什么要有它,实际代码里到底怎么用?
后端
海岳云舟13 小时前
spring使用kafka的三种方式(listener、container、stream)
后端