常见web攻击防范(CSRF跨站请求伪造)

405 阅读3分钟

CSRF( Cross site request forgery)跨站请求伪造

是指黑客诱导用户点击链接,打开黑客的网站。然后黑客利用用户目前的登录状态,发起的跨站请求。

举个例子,你在某个网站点击了黑客精心挑选的图片,你点击后进入一个新的页面。那么,你很可能就是被攻击了!

你可能对突然被攻击这件事很好奇,那么接下来就是进行拆解:当你点击了这个链接之后,黑客在背后做了哪些事情?可能会做三件事情:

  1. 自动发GET请求黑客网页里面可能有一段这样的代码
<Img src="https://xxx.com/info?user=hhh&count=77">

进入页面后自动发送get请求,值得注意的是,这个请求会自动带上关于XXX.COm(假设你已经登录过xx.com的网站)的cookie信息。

假如服务器端没有相应的验证机制,它可能以为发请求的是一个正常的用户,因为携带了相应的cookie,然后进行相应的各种操作,可以是转账汇款以及其他的恶意操作。

  1. 自动发POST请求黑客可能自己填写了一个表单,写了一段自动提交的脚本。
<form id=hacker-form action=https://xxx.com/info"method="post">
  <input type= hidden" name="user" value="hhh"/>
  <input type="hidden"name="count" value="100"/>
</form>
<script>
  document.getElementById('hacker-form').submit;
</script>

同样也会携带相应的用户 cookie信息,让服务器误以为是一个正常的用户在操作,让各种恶意的操作变为可能。

  1. 诱导点击发送GET请求在黑客的网站上,可能会放上一个链接,驱使你来点击
<a href=https://xxx?user=hhh&count=100" taget="blank">点击进入XXX</a>

点击后,自动发送get请求,接下来和自动发GET请求部分同理。

这就是CSRF攻击的原理, 和XSS攻击做对比, CSRF攻击并不需要将恶意代码注入用户当前页面的html文档中, 而是跳转到新的页面,利用服务器的验证漏洞和用户之前的登陆状态来模拟用户进行操作

防范措施

1.利用 Cookie的 SameSite属性。CSRF攻击中重要的一环,就是自动发送目标站点下的 Cookie,然后就是这一份Cookie模拟了用户的身份。因此在 Cookie上面下文章是防范的不二之选。在 Cookie当中有一个关键的字段,可以对请求中 Cookie的携带作一些限制,这个字段就是 Same Site。

Same Site可以设置为三个值: Strict、Lax和None。

  • Strict模式下,浏览器完全禁止第三方请求携带Cookie。比如请求aa.com。网站只能在 aa.com域名当中请求才能携带 Cookie,在其他网站请求都不能。
  • Lax模式,就宽松一点了,但是只能在get方法提交表单,或者a标签发送get请求的情况下可以携带 Cookie,其他情况均不能。
  • None模式下,也就是默认模式,请求会自动携带上Cookie。
  1. 验证来源站点。这就需要要用到请求头中的两个字段: Origin和 Referer。

其中Origin只包含域名信息,而 Referer包含了具体的URL路径。 当然,这两者都是可以伪造的,通过Ajax中自定义请求头即可,安全性略差。

3.CSRF Token。它的原理是:浏览器向服务器发送请求时,服务器生成一个字符串,将其植入到返回的页面中。然后浏览器如果要发送请求,就必须带上这个字符串,然后服务器来验证是否合法,如果不合法则不予响应。这个字符串也就是 CSRF Token,通常第三方站点无法拿到这个 token,因此也就是被服务器给拒绝。

总结

CSRF(Cross site request forgery)即跨站请求伪造,指的是黑客诱导用户点击链接,打开黑客的网站,然后黑客利用用户目前的登录状态发起跨站请求。

CSRF攻击一般会有三种方式:自动GET请求,自动POST请求,诱导点击发送GET请求

防范措施:利用 Cookie的 SameSite属性、验证来源站点和 CSRF Token