CSRF跨站请求伪造

简单来说就是盗用用户的身份,以用户的身份发送恶意请求

漏洞原理

网站的cookie在浏览器中不会过期,只要不关闭浏览器或者退出登录,以后访问这个网站,都会默认用户是登录状态

  • 用户C打开浏览器,访问受信任网站A,并登录网站A
  • 在用户成功登录网站A后,网站A产生cookie信息返回给浏览器,浏览器保存在本地
  • 在用户未退出网站A之前,在同一浏览器中,新打开一个标签访问网站B
  • 网站B接收到用户C的请求后,返回恶意代码,并发出一个请求访问第三方网站A
  • 浏览器接到网站B的请求,在用户不知情的情况下携带cookie,向网站A发送请求,以用户C的cookie和权限执行恶意请求

漏洞特征

当已经登陆的用户所做的所有修改操作,都可以被CSRF漏洞利用

抓取一个登录之后的请求包,如果HTTP头部里面不包含Referer字段和token,那么可能存在CSRF漏洞

如果有Referer字段,但是去掉Referer之后再重新提交,如果该提交有效,那么可能存在CSRF漏洞

漏洞利用

构造带有恶意代码的网站B

下面代码中访问了目标网站A,并提交了POST请求,修改了新的密码

只要诱导用户访问网站B,并且网站A在登录状态,即可通过此代码将用户在网站A的密码改成我们设置好的密码

1
2
3
4
5
6
7
8
9
10
<!DOCTYPE html>
<html>
<head>
<title></title>
</head>
<body>
<img src="http://localhost/DVWA-master/vulnerabilities/csrf/?password_new=222&password_conf=222&Change=Change#" alt="">
<img src="1.png">
</body>
</html>

防御措施

在请求中添加token并验证

在请求中放入攻击者不能伪造的信息,并且该信息不在cookie中,开发者可以在http请求中以参数的形式加入一个随机产生的token,并且在服务器建立一个拦截器来验证这个token。如果请求中没有token或者token中内容不正确的话,表示可能是攻击者发动的攻击。

验证HTTP Referer字段

http头中有一个referer,记录http请求的来源地址,访问一个安全受限的页面的请求必须来自同一个网站。当用户要提交一个请求时,请求的referer值需是提交按钮(触发请求)所在的页面的URL。

添加验证码

每次用户提交都在表单上填写一个图片上的随机字符串作为验证码