django - Django 管理界面不执行服务器端检查以确定 csrf 令牌的有效性
问题描述
我刚刚让一些渗透测试人员确定我的 Django 管理员可能会受到 CSRF 攻击。鉴于我只是在他们告诉我这件事时才听说过 CSRF 攻击,所以我认为这是我的一个配置问题,只是我似乎找不到在哪里。
重现步骤:
- 下载 Burp Suite 社区版
- 打开浏览器(在 Burp Suite 中)
- 登录您的 Django 管理门户
- 导航到“身份验证和授权”->“用户”
- 选择用户
- 修改名字属性(暂时不要点击保存)
- 在 Burp Suite 中打开“拦截”(这将在请求到达您的 django 应用程序之前捕获请求)
- 回到浏览器中点击“保存”
- 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
- 将 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
- 将请求转发到 django 服务器
- 您应该会在 Burp Suite 中看到一条消息,显示“用户已成功更改”。
- 您还可以在管理门户中验证用户名已成功更新。
上述步骤表明 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'
任何帮助将不胜感激!
解决方案
此行为是设计使然'。
https://docs.djangoproject.com/en/dev/ref/csrf/#csrf-limitations
在页面底部的常见问题部分中回答此特定问题...
##经常问的问题##
发布任意 CSRF 令牌对(cookie 和 POST 数据)是否存在漏洞 不,这是设计使然。如果没有中间人攻击,攻击者就无法向受害者的浏览器发送 CSRF 令牌 cookie,因此成功的攻击需要通过 XSS 或类似方式获取受害者浏览器的 cookie,在这种情况下攻击者通常不需要 CSRF 攻击。
一些安全审计工具将此标记为问题,但如前所述,攻击者无法窃取用户浏览器的 CSRF cookie。使用 Firebug、Chrome 开发工具等“窃取”或修改您自己的令牌不是漏洞。
推荐阅读
- c# - 如何创建导航属性以在 EF 1 / .NET 3.5 中进行左连接?
- c# - 从 kendoGrid 中选择元素
- android - 如何使用匕首 2 在 Activity 类中注入具有接口作为其构造函数参数的 Presenter 类?
- ffmpeg - ffmpeg 通过 rtp 流式传输 RAW TS
- c++ - 在 C++ 中读取配置文件 json 并没有停止
- android - 使用 adb 监控应用程序的内存使用情况
- javascript - ul list .remove() 之后的jQuery不会再次填充列表
- php - 当我在 mysql 中保存数据时出现异常
- asp.net - ASP.NET 条件是/否消息框
- json - 从远程 JSON 文件归档 Bootstrap 数据表