前端web安全-CSRF基础入门

前言

 

今天找了个新地方进行学习 嘿嘿  采光不错!特别适合看书呢。

前言

1.CSRF

跨站请求伪造(英语:Cross-site request forgery),也被称为 one-click attack 或者 session riding,通常缩写为 CSRF 或者 XSRF, 是一种挟制用户在当前已登录的Web应用程序上执行非本意的操作的攻击方法。跟跨网站脚本(XSS)相比,XSS利用的是用户对指定网站的信任,CSRF 利用的是网站对用户网页浏览器的信任。

 

2.漏洞危害

是指利用受害者尚未失效的身份认证信息(cookie、会话等),诱骗其点击恶意链接或者访问包含攻击代码的页面,在受害人不知情的情况下以受害者的身份向(身份认证信息所对应的)服务器发送请求,从而完成非法操作(如转账、改密等) 利用受害者尚未失效的身份认证信息(cookie、会话等),诱骗其点击恶意链接或者访问包含攻击代码的页面,在受害人不知情的情况下以受害者的身份向(身份认证信息所对应的)服务器发送请求,从而完成非法操作(如转账、改密等


CSRF与XSS最大的区别就在于,CSRF并没有盗取cookie而是直接利用。


3.CSRF漏洞原理

从上图可以看出,要完成一次CSRF攻击,受害者必须依次完成两个步骤:

  1.登录受信任网站A,并在本地生成Cookie。

  2.在不登出A的情况下,访问危险网站B。

  看到这里,你也许会说:“如果我不满足以上两个条件中的一个,我就不会受到CSRF的攻击”。是的,确实如此,但你不能保证以下情况不会发生:

  1.你不能保证你登录了一个网站后,不再打开一个tab页面并访问另外的网站。

  2.你不能保证你关闭浏览器了后,你本地的Cookie立刻过期,你上次的会话已经结束。(事实上,关闭浏览器不能结束一个会话,但大多数人都会错误的认为关闭浏览器就等于退出登录/结束会话了......)

  3.上图中所谓的攻击网站,可能是一个存在其他漏洞的可信任的经常被人访问的网站。

一个场景:

目标网站A:www.a.com

恶意网站B:www.b.com

目标网站A上有一个删除文章的功能,通常是用户单击"删除链接"时才会删除指定的文章,这个链接时www.a.com/blog/del?id=1,id号代表的是不同的文章。我们知道,这样删除文章实际上就是发出一个GET请求,那么如果目标网站A上存在一个XSS漏洞,执行的JS脚本无同源策略限制,就可以按下面的方式来删除文章.

  • 使用AJAX发出GET请求,请求值id=1,请求目标地址是www.a.com/blog/del?id=1
  • 或者动态创建一个标签对象(如img、iframe、script)等,将他们的src指向这个链接www.a.com/blog/del?id=1,发出的也是GET请求
  • 然后欺骗用户访问存在XSS脚本的漏洞页面(在目标网站A上),则攻击发生

如果不使用这种方式,或者目标网站A根本不存在XSS漏洞,还可以如何删除文章?看CSRF思路

  • 在恶意网站B上编写一个CSRF页面(www.b.com/csrf.htm)页面,想想有什么办法GET请求到目标网站A上
  • 利用AJAX?不行,它禁止域传输数据
  • 那么,用代码<img src="http://www.a.com/blog/del?id=1">
  • 然后欺骗已经登录目标网站A的用户访问www.b.com/csrf.htm页面,则攻击发生

这三个攻击过程有三个关键点:跨域发出了一个GET请求、可以无javascript参与,请求是身份认证后的

  1. 跨域发出一个GET请求
  2. 可以无javascript参与
  3. 请求是身份认证后的

实例演示.

漏洞网站:www.huahua.com

黑客的恶意网站:www.hack.com

 

这时我们本地搭建的一个测试网站 环境还是以上面A网站和B网站  A网站是我们的目标 当我们点击删除按钮后 它会想服务器发送这样一个HTTP请求

当我们点击是会发出这样的跨域请求

GET /www/admin/doAdminAction.php?act=delAdmin&id=2 HTTP/1.1Host: www.huahua.comUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:72.0) Gecko/20100101 Firefox/72.0Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2Accept-Encoding: gzip, deflateConnection: keep-aliveReferer: http://www.hua.com/www/admin/listAdmin.phpCookie: PHPSESSID=4ot3e15t8m6frau1s0vvoft0b6Upgrade-Insecure-Requests: 1

 

 如果黑客构建一个这样的页面地址为:www.hack.com/csrf.html

<html><img src="http://192.168.233.1/www/admin/doAdminAction.php?act=delAdmin&id=2"></html>

 

 那么当用户打开页面的时候回发出这样的跨域请求 此时id=2的HUAHUAHUA账户被删除

GET /www/admin/doAdminAction.php?act=delAdmin&id=2 HTTP/1.1Host: www.huahua.comUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:72.0) Gecko/20100101 Firefox/72.0Accept: image/webp,*/*Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2Accept-Encoding: gzip, deflateConnection: keep-aliveReferer: http://www.hack.com/csrf.htmlCookie: PHPSESSID=2a4eu21lbn2k1n126bddi56u60

我们可以看到两个请求中,除了来源Referer值不一样外,其它都一样,尤其是我们的cookie的值,改Cookie是用户登录目标网站www.huahua.com的身份认证标志。跨域发出的请求也同样会带上目标网站A的用户Cookie,这样的请求就是身份认证后的,攻击才会成功。

Cookie分为本地cookie和内存cookie,这两类cookie在CSRF的过程中存在一些诧异,IE浏览器默认不允许目标网站www.huahua.com的本地Cookie在这样的跨域请求中带上,除非在HTTP响应头中设置了P3P,这个响应头告诉浏览器允许网站(恶意网站www.hack.com)跨域请求目标网站A的资源时带上目标网站A的用户本地Cookie。对于非IE浏览器,就没这样的限制

 

参考学习:https://www.cnblogs.com/hyddd/archive/2009/04/09/1432744.html

     《web前端黑客技术》-前端黑客之CSRF

相关文章