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