通过加密语言机绕过身份验证
字数 1393 2025-08-10 16:34:39
通过加密预言机绕过身份验证 - 详细技术分析
1. 漏洞背景
本案例演示了如何利用加密预言机(Encryption Oracle)漏洞绕过身份验证机制。该漏洞存在于一个Web应用程序中,允许攻击者通过精心构造的加密Cookie来提升权限至管理员账户。
2. 漏洞环境分析
2.1 初始发现
- 登录凭证:
wiener:peter - 存在"记住登录"功能,生成加密Cookie:
CLaBQxXK7jjl8irpHHxq6jc0HJqzyyGlh0up7tP7WZc= - 评论功能中,无效输入会重定向并设置
notificationCookie,其值为加密的错误消息
2.2 关键功能点
- 加密点:修改邮箱功能会将错误消息加密存储在
notificationCookie中 - 解密点:重定向页面会解密并显示
notificationCookie的内容
3. 漏洞利用步骤详解
3.1 信息收集
- 发现
stay-logged-inCookie的明文格式为username:timestamp - 通过
Date.now()获取当前时间戳 - 确认解密点可以解密
stay-logged-in的值
3.2 加密机制分析
- 对称加密:明文长度与密文长度直接相关
- 固定前缀:错误消息"Invalid email address: "(23字节)会在加密前添加
- 块大小要求:加密算法要求16字节的倍数
3.3 构造管理员Cookie
-
初始尝试:
- 提交
administrator:timestamp作为邮箱地址 - 系统生成加密值,但包含无用前缀
- 提交
-
去除前缀:
- 将密文解码为十六进制
- 删除前23字节(对应无用前缀)
- 重新编码为Base64
-
块大小调整:
- 发现解密报错:密码密文分块必须是16的倍数
- 解决方案:
a. 在明文前添加9个填充字符:xxxxxxxxxadministrator:timestamp
b. 加密后,从十六进制数据开头删除32字节
c. 确保最终密文长度符合块大小要求
-
最终构造:
- 生成有效的管理员Cookie值
- 替换
stay-logged-in参数值 - 更新session值
3.4 权限提升
- 访问
/admin端点,成功进入管理员面板 - 执行删除操作:
/admin/delete?username=carlos
4. 技术要点总结
- 加密预言机:应用程序暴露了加密/解密功能,允许攻击者研究加密机制
- 明文格式:
username:timestamp的Cookie格式是关键突破口 - 块加密特性:
- 对称加密保持长度关系
- 需要满足块大小要求
- 攻击技巧:
- 利用固定前缀进行长度操作
- 通过填充和截断调整密文结构
- 精心构造的输入可以生成有效的特权凭证
5. 防御建议
- 避免在客户端存储敏感加密数据
- 对加密功能实施严格的访问控制
- 使用非对称加密或签名验证重要凭证
- 避免在错误消息中暴露加密/解密功能
- 实施HMAC验证确保Cookie完整性
- 对管理员功能实施多因素认证
6. 扩展思考
- 类似漏洞可能存在于其他使用客户端加密的场景
- 时间戳验证不严可能导致重放攻击
- 加密算法的选择和使用方式对安全性至关重要
- 开发过程中应避免将加密功能暴露给终端用户
通过本案例,我们深入理解了加密预言机漏洞的利用方式和防御策略,这对Web应用程序的安全设计和测试具有重要参考价值。