CSRF(Cross-site Request Forgery 跨站请求伪造)
- 攻击来源:CSRF通过伪装来自受信任用户的请求来利用受信任的网站。是web中用户身份认证的一个漏洞。
- 攻击原理:攻击者通过一些技术手段欺骗用户的浏览器去访问一个自己曾经认证过的网站并执行一些操作(如:发邮件、发消息、甚至财产操作:转账、购买商品等)。由于浏览器曾经认证过,所以被访问的网站会认为是真正的用户操作而去执行。这利用了web中用户身份认证的一个漏洞
- 防御手段:
- 1、检测HTTP报文头部字段Referer。Referer字段表明了请求的来源地址,通过判断来源地址是否合法来防御CSRF攻击。
- 2、限制session、cookie的生命周期。
- 3、使用用到表单提交功能的地方使用验证码校验。
- 4、cookie关键字段设置HttpOnly属性,可以在一定程度上防御CSRF。
- 5、在请求地址中添加token并验证。
- 绕过CSRF防御:
- 在其域名后面加上其他的字符来通过其他的域名绕过
http://www.test.com
---->http://www.test.com.raoguo.com
- 通过将其作为参数来绕过
http://www.test.com
---->http://www.test2.com/?a=http://www.test.com
- 重写域名绕过,大致正则是 *.test.*.com
http://www.test.com
---->http://www.test.comxxxtest.com
- 点击劫持
- 在同一个功能端点利用点击劫持会绕过所有CSRF防御
- 从技术上讲,请求确实来自合法站点,如果易受攻击的端点所在的页面容易遭受点击劫持攻击,那么所有的CSRF保护将变得没有效果
- 更改请求方法
- 伪造的敏感请求是通过POST方法发送的,尝试将其转换为GET请求。操作时通过GET方法发送的,尝试转换为POST方法。应用程序可能仍然执行操作,且通常没有任何保护机制
- 伪造的敏感请求是通过POST方法发送的,尝试将其转换为GET请求。操作时通过GET方法发送的,尝试转换为POST方法。应用程序可能仍然执行操作,且通常没有任何保护机制
- 绕过 token
- 删除 token 参数或发送空 token
- 逻辑错误:应用程序会在 token 存在时或 token 不为空时检查有效性
- 使用另一个 session 的 token
- 只检查 token 是否合法,不检查 token 是否确实归属当前用户。硬编码一个合法有效的 token。
- 只检查 token 是否合法,不检查 token 是否确实归属当前用户。硬编码一个合法有效的 token。
- session 固定
- 站点使用一个双提交 cookie 作为一个 CSRF 的防御措施。请求需要包含一个 cookie,其值为随机 token 值,同时在请求参数中也有一个字段值为随机 token 值。值相同,请求合法
- 双提交 cookie,可能没有将有效的 token 保存在服务器端,所以没办法指定 token 是否合法,也很有可能很少检查 cookie 中 token 值和参数中 token 值是否一样。代表可以发送一个假 token,仍然可以有效实施 CSRF
- 攻击分两步
- 使用一个 session 固定技术确认受害者浏览器使用你提供的包含假 token 的 session
- session 固定,可以让你控制受害者的 cookie 存储的攻击
- 在参数中使用同一个 token 执行这个 CSRF 攻击
- 使用一个 session 固定技术确认受害者浏览器使用你提供的包含假 token 的 session
- 在其域名后面加上其他的字符来通过其他的域名绕过
补充:
CSRF与XSS的区别:
- 关于XSS的内容,详情请看 简学-XSS 攻击
- XSS是利用浏览器、服务器或欺骗用户去访问钓鱼链接,从而获得用户的Cookie,利用用户的身份进行恶意操作。
- CSRF没有盗取用户的Cookie,而是直接利用了浏览器的Cookie伪装成是用户去执行的某个操作。(虽然认证的操作人是用户,但用户本身并不知道自己进行了该操作)
- CSRF是借刀(借你的手去操作),XSS是抢劫(劫持你的身份来操作)。
CSRF与SSRF的区别:
- 关于SSRF的内容,详情请看 简学-SSRF攻击
- CSRF 是由于服务器未对用户的身份进行严格的检测,导致攻击者可以利用用户的Cookie伪装成用户去欺骗服务器进行恶意请求操作;
- SSRF 是由于服务器过于信任用户可控的URL,为进行严格检测,导致攻击者可以以此为跳板攻击内网。
- 有任何问题欢迎评论区留言,上文若是信息有误,评论区随便吐槽,看必回!😁