XenForo 2.3.13 之前的版本接受同主机 javascript: URI 作为动态重定向,并随后将其赋值给 window.location。
服务端重定向验证会拒绝外部主机,但并未要求必须使用 HTTP 或 HTTPS。形如 javascript://board-host/%0A... 的 URL 会以 XenForo 主机进行解析,通过该比较,并存活于 AJAX 响应中。在浏览器中,百分号解码将 %0A 转换为换行符,从而结束由 //host 引入的 JavaScript 行注释,并暴露其后的载荷。
我在 XenForo 2.3.12(build 2031270)上通过公开的 Follow 确认功能复现了此问题。已登录用户打开精心构造的 URL 并确认 Follow;无害载荷在 XenForo 源中设置了 window.name。攻击者无需账户,但受害者必须已登录并确认正常操作。XenForo 2.3.13 包含此修复。
python poc.py https://xenforo.example member-name.123
该脚本启动一个单请求回环重定向服务器。在持有已授权测试会话的浏览器中打开打印出的本地 URL,检查 window.name,然后关闭服务器。该载荷不会读取数据,也不会执行超出用户确认的 Follow 之外的任何操作。
由 Marco Paciaroni(BomboBombone)发现。