跳到内容
HackIndex.io
工具

Laravel Cookie 伪造与解码器

解码 Laravel AES 加密 Cookie 或伪造已签名的 Cookie——用于 CTF 挑战和授权测试。

Laravel 使用 .env 文件中的 APP_KEY,以 AES-256-CBC(Laravel 10+ 为 AES-256-GCM)加密所有 Cookie。加密值是 base64 编码的 JSON,包含 IV、密文和 HMAC-SHA256 签名。本工具解密 Cookie 以显示会话载荷(用户 ID、角色、CSRF 令牌),验证 HMAC 签名,并允许伪造新的有效签名 Cookie。所有处理均在服务器端 PHP 中完成,不存储或记录任何内容。

解码 Cookie

解密并验证现有 Cookie

接受:base64:xxx(标准)、十六进制字符串或原始 base64。在目标 .env 中以 APP_KEY 形式找到。

伪造 Cookie

生成有效的已签名 Laravel Cookie

AES-256-CBC 是 Laravel 9 及以下版本的默认值。AES-256-GCM 适用于 Laravel 10+。

提示:先解码一个真实 cookie,看清确切的序列化格式,再进行修改和伪造。

工作原理

Laravel 使用 .env 文件中的 APP_KEY,以 AES-256-CBC(或 AES-128-CBC / GCM 变体)加密 cookie。加密值是 base64 编码的 JSON,包含 IV、密文和 HMAC-SHA256 签名。本工具可解密并校验签名,也可从零伪造一个有效 cookie。两种操作均在服务端由 PHP 完成,不会保存任何输入。

  1. 1. 获取 cookie: 在 Burp Suite 或浏览器开发者工具中拦截目标请求,复制 laravel_session cookie 的值。
  2. 2. 获取 APP_KEY: 在目标的 .env、泄露的配置中找到它,或根据已知明文破解出来。
  3. 3. 解码: 将两者粘贴到上方并解码,即可显示会话载荷(用户 ID、CSRF 令牌、flash 数据)。
  4. 4. 修改并伪造: 修改载荷(例如提升 user_id),粘贴 APP_KEY,并伪造一个新的有效签名 cookie。
  5. 5. 注入: 在请求中替换原始 cookie 并重新发送。

什么是 Laravel 加密 Cookie?

Laravel 会自动加密并签名通过 Cookie::make() 或 cookie 助手设置的所有 cookie(除非在 EncryptCookies 中间件的 $except 中排除)。会话 cookie(默认 laravel_session)仅在 SESSION_DRIVER=cookie 时使用 cookie 会话驱动,否则它只包含一个加密的会话 ID 指针。在 CTF 题目中,应用常用 cookie 驱动将完整的会话 payload 直接存储在 cookie 中。

iv

初始化向量。每次加密操作时随机生成。在 JSON payload 中以 Base64 编码。

value

经 AES 加密的密文。Base64 编码。openssl_encrypt() 使用 flags=0(默认)时直接返回 base64。

mac

对 base64(iv) 与 base64(value) 拼接后的 HMAC-SHA256,以 APP_KEY 的原始字节为密钥。GCM 加密算法中不存在。

tag

GCM 认证标签。用于替代 HMAC,适用于 AES-256-GCM 和 AES-128-GCM 加密算法(Laravel 10+)。

常见问题

这会将我的 Cookie 或 APP_KEY 发送到任何地方吗?

不会。解密和加密均在服务器端使用 PHP 的 openssl_decrypt / openssl_encrypt 完成。不存储、不记录、不向第三方传输任何数据。

什么是 Cookie 会话驱动?

当 .env 中设置 SESSION_DRIVER=cookie 时,Laravel 会序列化整个会话数组、加密并直接存储在浏览器 cookie 中。这在 CTF 题目设置中很常见。大多数生产应用使用 file、database 或 Redis 驱动,cookie 中只存储加密的会话 ID。

HMAC 签名是如何工作的?

Laravel 计算 hash_hmac("sha256", base64(iv) . base64(ciphertext), raw_key)。用于 MAC 计算的 IV 和密文字符串都是 JSON 中存储的 base64 编码版本,而非原始字节。

伪造时应选择哪种加密算法?

将加密算法与目标应用所用的保持一致。Laravel 5-9 默认是 AES-256-CBC。Laravel 10+ 支持 AES-256-GCM。可通过解码后的 cookie 结构中是否存在 tag 字段来判断(GCM 有非空的 tag 字段;CBC 则是 mac)。

即使 APP_KEY 正确,解密也会失败——为什么?

确认粘贴的是原始 Cookie 值而非 URL 编码版本。某些框架会对 Cookie 进行双重编码。同时验证密钥格式:Laravel 在 .env 中以 base64:xxx 形式存储——请原样粘贴。