CSRF
CSRF全称跨站请求伪造,是利用用户对浏览器的信任(XSS利用用户对站点的信任),需要用户进行点击或者访问攻击站点,当用户点击攻击连接时自动完成未授权的修改数据请求,或当用户访问攻击站点(被用户信任的站点)时,浏览器自动发起针对用户正在访问(已访问)站点(被攻击站点)的命令/请求
防御
-
根据请求头referer,对请求来源进行检查
-
在服务器端生成随机token,浏览器在发起针对数据的修改请求将token提交,由服务器端验证通过够进行操作逻辑,token需要至多一次有效,并具有有限的生命周期
a. 表单提交修改数据
可将token生成在表单内使用input:hidden标签进行提交
b. Ajax提交修改数据
可将token生成在cookie内(cookie不能设置为httponly),ajax请求前通过js读取cookie中的token并添加到request body或者http requestheader中进行提交
-
针对需要用户授权的请求,提示用户输入身份认证后再继续操作
-
针对频繁操作提示输入验证码后再继续进行操作
解题
-
Cross-Site Request Forgeries 03
10.01.png 10.02.png 10.03.png 10.04.png 10.05.png 10.06.png 10.07.png -
Cross-Site Request Forgeries 04
10.08.png 10.09.png 10.10.png 10.11.png 10.12.png -
Cross-Site Request Forgeries 07
10.13.png 10.14.png 10.15.png 10.16.png 10.17.png -
Cross-Site Request Forgeries 08
10.18.png 10.19.png 10.20.png 10.21.png这里很奇怪有个很奇怪的问题,调试了下webgoat代码发现在重复进行登陆是SecurityContextHolder.getContext().getAuthentication().getPrincipal()返回的用户信息依然为先前登陆的用户信息,抓包分析登陆前后请求sessionid已经变化,这里需要再对spring security进行研究,才能得到结论。
解决方法:进行一次退出登录,并使用延迟200毫秒后自动提交表单(延迟时间不宜过长,因为webgoat有自动退出功能,如果退出登录,第一个窗口会自动退出到登陆页面)
10.22.png 10.23.png 10.24.png 10.25.png 10.26.png
网友评论