csrf与xss攻击的详解与区别

一、csrf攻击 1.CSRF的基本概念、缩写、全称:CSRF(Cross-site request forgery):跨站请求伪造。

2.CSRF的攻击原理

用户是网站A的注册用户,且登录进去,于是网站A就给用户下发cookie。从上图可以看出,要完成一次CSRF攻击,受害者必须满足两个必要的条件: (1)登录受信任网站A,并在本地生成Cookie。(如果用户没有登录网站A,那么网站B在诱导的时候,请求网站A的api接口时,会提示你登录) (2)在不登出A的情况下,访问危险网站B(其实是利用了网站A的漏洞)。 注意cookie保证了用户可以处于登录状态,但网站B其实拿不到cookie。

3.CSRF的危害?-发消息(蠕虫)+转账(丢钱)+盗号

攻击者能够欺骗受害用户完成该受害者所允许的任一状态改变的操作,CRSF能做的事情包括利用你的身份发邮件、发短信、进行交易转账等,甚至盗取你的账号,更新账号细节,完成购物,注销甚至登录等操作,获取用户的隐私数据,配合其他漏洞攻击CSRF蠕虫指产生蠕虫效果,会将 CSRF 攻击一传十,十传百。如:某社区获取好友列表接口和私信好友的接口都存在CSRF漏洞,攻击者就可以将其组合成一个CSRF蠕虫——当一个用户访问恶意页面后通过CSRF获取其好友列表信息,然后再利用私信好友的CSRF漏洞给其每个好友发送一条指向恶意页面的信息,只要有人查看这个信息里的链接,CSRF蠕虫就会不断传播下去,其可能造成的危害和影响非常巨大!

假设某银行网站A以GET请求来发起转账操作,转账的地址www.xxx.com/transfer.doaccountNum=l000l&money=10000, 参数accountNum表示转账的账户,参数money表示转账金额。而某大型论坛B上,一个恶意用户上传了一张图片,而图片的地址栏中填的并不是图片的地址,而是前而所说的砖账地址:src="http://www.xxx.com/transfer.do?accountNum=l000l&money=10000"当你登录网站A后,没有及时登出,这时你访问了论坛B,不幸的事情发生了,你会发现你的账号里面少了10000块...为什么会这样呢,在你登录银行A时,你的浏览器端会生成银行A的cookie,而当你访问论坛B的时候,页面上的img标签需要浏览器发起一个新的HTTP请求,以获得图片资源,当浏览器发起请求时,请求的却是银行A的转账地址www.xxx.com/transfer.do?accountNum=l000l&money=10000, 并且会带上银行A的cookie信息,结果银行的服务器收到这个请求后,会以为是你发起的一次转账操作,因此你的账号里边便少了10000块。

4.CSRF如何防御?---cookie设置httpOnly + token验证 + 隐藏令牌 + Referer验证

(1)方法1、将cookie设置为HttpOnly CRSF攻击很大程度上是利用了浏览器的cookie,为了防止站内的XSS漏洞盗取cookie,需要在cookie中设置“HttpOnly”属性,这样通过程序(如JavaScript脚本、Applet等)就无法读取到cookie信息,避免了攻击者伪造cookie的情况出现。设置cookie为HttpOnly的代码如下:response.setHeader( "Set-Cookie", "cookiename=cookievalue;HttpOnly");

(2)方法2、Token 验证(用的最多):攻击者可以伪造用户的请求,该请求中所有的用户验证信息都存在于cookie中,因此攻击者可以在不知道用户验证信息的情况下直接利用用户的cookie来通过安全验证。在请求中放入攻击者所不能伪造的信息,并且该信总不存在于cookie之中。服务器发送给客户端一个token;客户端提交的表单中带着这个token;如果这个token不合法,那么服务器拒绝这个请求。假设请求通过POST方式提交,则可以在相应的表单中增加一个隐藏域:


<input type="hidden" name="_toicen" value="tokenvalue" />

token的值通过服务端生成,表单提交后token的值通过POST请求与参数一同带到服务端,每次会话可以使用相同的token,会话过期,则token失效,攻击者因无法获取到token,也就无法伪造请求。 (3)方法3、隐藏令牌:把token隐藏在http的head头中。方法二和方法一有点像,本质上没有太大区别,只是使用方式上有区别。 (4)方法4、Referer验证:Referer指的是页面请求来源。意思是,只接受本站的请求,服务器才做响应;如果不是,就拦截。

二、xss攻击 1、XSS的基本概念:XSS(Cross Site Scripting):跨域脚本攻击

2、XSS攻击原理:不需要你做任何的登录认证,它会通过合法的操作(比如在url中输入、在评论框中输入),向你的页面注入脚本(可能是js、hmtl代码块等)。

3、XSS攻击后果:盗用Cookie破坏页面的正常结构,插入广告等恶意内容D-doss攻击

4、XSS的攻击方式

a. 反射型:发出请求时,XSS代码出现在url中,作为输入提交到服务器端,服务器端解析后响应,XSS代码随响应内容一起传回给浏览器,最后浏览器解析执行XSS代码。这个过程像一次反射,所以叫反射型XSS。 b.存储型:存储型XSS和反射型XSS的差别在于,提交的代码会存储在服务器端(数据库、内存、文件系统等),下次请求时目标页面时不用再提交XSS代码。

5、XSS的防范措施(encode+过滤)

XSS的防范措施主要有三个:编码、过滤、校正 1、编码:对用户输入的数据进行HTML Entity 编码。把字符转换成 转义字符。Encode的作用是将$var等一些字符进行转化,使得浏览器在最终输出结果上是一样的。 比如说这段代码:script>alert(1)</script 若不进行任何处理,则浏览器会执行alert的js操作,实现XSS注入。进行编码处理之后,L在浏览器中的显示结果就是这个文本,将变量作为纯文本进行输出,且不引起JavaScript的执行。

2、过滤:移除用户输入的和事件相关的属性。如onerror可以自动触发攻击,还有onclick等。(总而言是,过滤掉一些不安全的内容)移除用户输入的Style节点、Script节点、Iframe节点。(尤其是Script节点,它可是支持跨域的呀,一定要移除)。

3、校正:避免直接对HTML Entity进行解码。使用DOM Parse转换,校正不配对的DOM标签。(DOM Parse:它的作用是把文本解析成DOM结构) 常见2种方法:a.第一步的编码转成文本,然后第三步转成DOM对象,然后经过第二步的过滤。 b.还有一种更简洁:首先是encode,如果是富文本,就白名单。

三、 CSRF 和 XSS 的区别 1、CSRF是跨站请求伪造; XSS是跨域脚本攻击。 2、CSRF需要用户先登录网站A,获取cookie; XSS不需要登录。 3、CSRF是利用网站A本身的漏洞,去请求网站A的api; XSS是向网站A注入JS代码,然后执行JS里的代码,篡改网站A的内容。(XSS利用的是站点内的信任用户,而CSRF则是通过伪装来自受信任用户的请求来利用受信任的网站。你可以这么理解CSRF攻击:攻击者盗用了你的身份,以你的名义向第三方网站发送恶意请求。)

麦志建博客
请先登录后发表评论
  • latest comments
  • 总共0条评论