CSRF漏洞
1.如何测试csrf漏洞
对目标站点增删改查的地方进行标记,并观察逻辑,判断请求是否可以伪造
# 手工测试
若本次操作中存在csrf token参数,或存在验证码等防御行为,则不存在csrf漏洞。若将数据包中的referer字段去掉,或仅仅删除referer字段的值,重新发送得到服务器的正确受理,那么可认为存在csrf漏洞。
2.攻击流程
# 受害者登录了目标网站
# 攻击者向受害者发送恶意链接
# 受害者点击链接, 链接中的js代码执行, 向目标网站发送某个请求
# 由于用户已登录, 请求会被成功执行
3.如何防御csrf漏洞
# 增加Token验证(常用做法)
对关键操作增加Token参数,token必须随机,每次都不一样
# 关于安全的会话管理(避免会话被利用)
不要在客户端保存敏感信息(比如身份验证信息)
退出、关闭浏览器时的会话过期机制
设置会话过机制,比如15分钟无操作,则自动登录超时
# 访问控制安全管理
敏感信息的修改时需要身份进行二次认证,比如修改账号密码,需要判断旧密码
敏感信息的修改使用POST,而不是GET
通过HTTP头部中的REFERER来限制原页面
# 增加验证码
一般在登录(防暴力破解),也可以用在其他重要信息操作的表单中(需要考虑可用性)
4.如何绕过防御
# 更改请求方法
如果要伪造的敏感请求是通过POST方法发送的,那么尝试将其转换为GET请求。
# 删除token参数或发送空token
不发送token也可以正常请求数据是因为这种逻辑错误在应用程序中非常常见:应用程序有时会在token存在的时候或者token参数不为空的时候检查token的有效性。
# 移除referer字段
# 绕过正则表达式
如果referer检查是基于白名单的,你可以尝试绕过验证URL的正则表达式。例如,你可以尝试在referer的URL中将受害者域名置于二级域名区域或者URL目录区域。如果一个站点在referer字段检查“bank.com”字段,那么“bank.com.attacker.com"或”attakcer.com/bank.com"可能可以绕过这种检测。
# 判断Referer是否存在某关键词
referer判断存在不存在google.com这个关键词,在网站新建一个google.com目录 把CSRF存放在google.com目录,即可绕过
|