首页 > 解决方案 > Django 管理界面不执行服务器端检查以确定 csrf 令牌的有效性

问题描述

我刚刚让一些渗透测试人员确定我的 Django 管理员可能会受到 CSRF 攻击。鉴于我只是在他们告诉我这件事时才听说过 CSRF 攻击,所以我认为这是我的一个配置问题,只是我似乎找不到在哪里。

重现步骤:

  1. 下载 Burp Suite 社区版
  2. 打开浏览器(在 Burp Suite 中)
  3. 登录您的 Django 管理门户
  4. 导航到“身份验证和授权”->“用户”
  5. 选择用户
  6. 修改名字属性(暂时不要点击保存)
  7. 在 Burp Suite 中打开“拦截”(这将在请求到达您的 django 应用程序之前捕获请求)
  8. 回到浏览器中点击“保存”
  9. Burp 套件将捕获请求,此时您应该能够看到类似
Cookie: csrftoken=HoBcgZfhlb1W5Km3F7NL37BKv9XkNvGYcYSO6h4LzZxF5ceLbShbcmiSl9py9iY2; sessionid=ioo36waf6i7sclcj33stv8lminx3u36e
Connection: close

csrfmiddlewaretoken=hUR7ZNj0UdeqOBUtoP973QVeQEeHd3KnMu8JP58u81K9O3MbUADxc5CmGEGVzQ2r&username=dev&first_name=tony&last_name=&email=&is_active=on&is_staff=on&is_superuser=on&last_login_0=2020-08-08&last_login_1=09%3A19%3A32&date_joined_0=2020-08-05&date_joined_1=16%3A02%3A29&initial-date_joined_0=2020-08-05&initial-date_joined_1=16%3A02%3A29&_save=Save
  1. 将 csrftoken 和 csrfmiddlewaretoken 中的值更改为长度为 64 个字符的其他值(注意,csrftoken 和 csrfmiddlewaretoken 的值必须相互匹配,但可以与它们原来的值完全不同),并且为了更好地衡量更改值first_name 例如
Cookie: csrftoken=1234567812345678123456781234567812345678123456781234567812345678; sessionid=ioo36waf6i7sclcj33stv8lminx3u36e
Connection: close

csrfmiddlewaretoken=1234567812345678123456781234567812345678123456781234567812345678&username=dev&first_name=smellysocks&last_name=&email=&is_active=on&is_staff=on&is_superuser=on&last_login_0=2020-08-08&last_login_1=09%3A19%3A32&date_joined_0=2020-08-05&date_joined_1=16%3A02%3A29&initial-date_joined_0=2020-08-05&initial-date_joined_1=16%3A02%3A29&_save=Save
  1. 将请求转发到 django 服务器
  2. 您应该会在 Burp Suite 中看到一条消息,显示“用户已成功更改”。
  3. 您还可以在管理门户中验证用户名已成功更新。

上述步骤表明 Django 没有验证 csrf 令牌值。

目前,我的 settings.py 包含

# sets HttpOnly cookie
SESSION_COOKIE_HTTPONLY = True
# sets Secure true
SESSION_COOKIE_SECURE = True
# sets session timeout (currently at 15 minutes)
SESSION_COOKIE_AGE = 15*60

CSRF_COOKIE_SECURE = True
X_FRAME_OPTIONS = 'DENY'
SECURE_BROWSER_XSS_FILTER = True
SECURE_CONTENT_TYPE_NOSNIFF = True
CSRF_COOKIE_SAMESITE = 'Strict'

任何帮助将不胜感激!

标签: django

解决方案


此行为是设计使然'。

https://docs.djangoproject.com/en/dev/ref/csrf/#csrf-limitations

在页面底部的常见问题部分中回答此特定问题...

##经常问的问题##

发布任意 CSRF 令牌对(cookie 和 POST 数据)是否存在漏洞 不,这是设计使然。如果没有中间人攻击,攻击者就无法向受害者的浏览器发送 CSRF 令牌 cookie,因此成功的攻击需要通过 XSS 或类似方式获取受害者浏览器的 cookie,在这种情况下攻击者通常不需要 CSRF 攻击。

一些安全审计工具将此标记为问题,但如前所述,攻击者无法窃取用户浏览器的 CSRF cookie。使用 Firebug、Chrome 开发工具等“窃取”或修改您自己的令牌不是漏洞。


推荐阅读