Python框架CSRF防御机制及攻击面浅析

admin 2022年5月10日00:17:49评论144 views字数 1705阅读5分41秒阅读模式

最近用Flask重写了一套个人博客系统,已上线。


防御机制



目前主流CSRF的防御思路可总结为:在用户携带的信息(Cookie)之外置入token并在服务端检验,该token要满足一次性、随机性


主流Python后端框架(Flask/Django/Tornado)均使用Cookie-Form对比校检来实现。


Flask官方文档给出的解决方案:


服务端生成_csrf_token并置入用户Cookie和Form。用户提交Form之后,服务端对比Form中的_csrf_token字段和Cookie中是否相同,相同则通过,否则返回403。


Python框架CSRF防御机制及攻击面浅析


攻击面



我想到的点:

  1. 策略没覆盖到. (GET, json)

  2. 修改(覆盖)用户Cookie中存储的token. (XSS, CRLF)

  3. 算法角度预测到用户Cookie的token.

  4. 让策略失效.(关闭或打断CSRF检验机制的运行)


修改用户Cookie



1 鸡肋XSS达不到httponly的Cookie时,可以试试做CSRF:

知乎某处XSS+刷粉超详细漏洞技术分析


2 利用Python-cookie解析漏洞篡改token:

(CVE-2016-7401) CSRF protection bypass on any Django powered site via Google Analytics


当添加的Cookie中存在]符号时,解析器会以该符号分隔带入新的字段。


Python框架CSRF防御机制及攻击面浅析

这样我们就可以在添加Cookie时,伪造出一个_csrf_token字段的值,并与Form中设为相同,这样后端对比通过,做成CSRF.


3 请求头注入,如CRLF-injectionoverflow等。

(Twitter demo)HTTP Response Splitting with Header Overflow


策略之外



使用GET方法时的原则是——让GET只负责“读取”资源的操作


但是实际开发中往往注意不到,问题往往出在一些简单按钮的功能,如“删除”、“回收”、“置顶”、“清除缓存”等功能,很容易通过GET完成。这直接导致了CSRF的隐患。


此外,ajax-json也是该策略无法覆盖的点,值得关注。


这里Flask源码中给出的解决方案,或者放在请求头中均可:


Python框架CSRF防御机制及攻击面浅析



开发者的疏忽



开发者并未开启全局CSRF防御策略,而是进行单个view的控制(如@csrf_protect),这样未免会有遗漏的情况。



是否可预测、可绕过?



Flask-WTF处理CSRF的关键逻辑在python2.7/site-packages/flask_wtf/csrf.py,这个文件相当于Cookie-Form防御思路的完整实现。


这里给出Flask-WTF token生成函数部分源码:


Python框架CSRF防御机制及攻击面浅析

采用了HMAC算法,hash算法是SHA1


至于这个算法的优点摘抄如下:


What does this “_time_independent_equals” mean?


That function does not simply compare the strings, it tries to always take the same amount of time to execute.


This is useful for security tasks like comparing passwords. If the function returned on the first mismatching byte, an attacker could try all possible first bytes and know that the one that takes longest is a match. Then they could try all possible second bytes and know that the one that takes longest is a match. This can be repeated until the entire string is deduced. (In reality you have to do a lot of averaging to overcome random delays in the network, but it works if you are patient.)


原文始发于微信公众号(乐枕迭代日志):Python框架CSRF防御机制及攻击面浅析

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2022年5月10日00:17:49
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   Python框架CSRF防御机制及攻击面浅析http://cn-sec.com/archives/943611.html

发表评论

匿名网友 填写信息