[工具](https://hackindex.io/zh/tools)
## 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

## 伪造 Cookie

生成有效的已签名 Laravel 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 形式存储——请原样粘贴。
