两种跨站攻击方式——XSS和CSRF

来源:互联网 发布:群发qq消息软件 编辑:程序博客网 时间:2024/06/03 04:37

1.概述

XSS:跨站脚本攻击,攻击者往web中嵌入脚本代码,用户在浏览该网页时,脚本就会执行,从而实现攻击的目的。
csrf:跨站伪造请求,攻击者伪装成受信任用户,来利用受信任网站。

2.原理

2.1 XSS原理

如今的大部分网站都有用户留言或反馈消息的功能,这些本来为了增强用户体验的功能,如果安全等级不够,攻击者就可以通过输入框向网页嵌入恶意脚本代码,轻则盗取用户信息,严重的可能直接导致网站崩溃。

举一个XSS攻击的栗子:

<html lang="zh-CN"><head>    <meta charset="utf-8">    <meta http-equiv="X-UA-Compatible" content="IE=edge">    <meta name="format-detection" content="telephone=no">    <meta name="viewport"          content="width=device-width, initial-scale=1.0, user-scalable=0, minimum-scale=1.0, maximum-scale=1.0"></head><body><p>XSS example:</p><form method="get" action="">    <input type="text" name="val" value="abc">    <input type="submit"></form><?php    echo '你输入的内容是:'.$_GET['val'];?></body></html>

这段代码的内容非常简单,一个表单,表单内有一个输入框,和一个提交按钮,提交之后就会把提交的内容打印在页面上,如下图:
这里写图片描述

首先我在输入框中输入:acb,然后点击提交:
这里写图片描述
并没有什么异常,接下来对这个页面进行XSS攻击,在输入框中输入一段脚本代码:<script>alert('XSS');</script>
这里写图片描述
我们输入的这段script脚本被执行了,XSS攻击成功,当然实际攻击不会这么简单,这里只是做一个简单的演示,弹窗只是为了证明XSS的存在和使用。
XSS实际攻击更多的是偷偷获取后台资料,例如我写了一个偷取用户资料的脚本,脚本的线上地址是:example.com/a.js,那么我在某网站上留言<javascript scr="expmple.com/a.js"></javascript>,其他用户在看到我的留言的时候,其实就是把我这段脚本加载到网页中去了,从而达到我的目的。

2.2 CSRF原理

CSRF的攻击过程如下:

1.用户B登录受信任网站A
2.用户B通过密码登录验证之后,受信任网站A返回cookie给浏览器,用户B登录成功,可正常发送请求
3.用户B在未退出网站A的情况下,在同一浏览器中访问网站B
4.网站B返回攻击代码到浏览器,浏览器在接收到攻击代码之后,再用户不知情的情况下携带网站A的cookie向网站A发送请求,网站A并不知道请求实际是由网站B发起的,所以会根据携带的cookie信息,以用户B的权限处理请求,从而达到攻击的目的

整个过程中有一个先决条件,就是网站B发起CSRF攻击的时候正好浏览器中有网站A的cookie且该cookie对于网站A而言还在有效期。

这里引用一位网友举的栗子:

受害者 Bob 在银行有一笔存款,通过对银行的网站发送请求 http://bank.example/withdraw?account=bob&amount=1000000&for=bob2 可以使 Bob 把 1000000 的存款转到 bob2 的账号下。通常情况下,该请求发送到网站后,服务器会先验证该请求是否来自一个合法的 session,并且该 session 的用户 Bob 已经成功登陆。
黑客 Mallory 自己在该银行也有账户,他知道上文中的 URL 可以把钱进行转帐操作。Mallory 可以自己发送一个请求给银行:http://bank.example/withdraw?account=bob&amount=1000000&for=Mallory。但是这个请求来自 Mallory 而非 Bob,他不能通过安全认证,因此该请求不会起作用。
这时,Mallory 想到使用 CSRF 的攻击方式,他先自己做一个网站,在网站中放入如下代码: src=”http://bank.example/withdraw?account=bob&amount=1000000&for=Mallory ”,并且通过广告等诱使 Bob 来访问他的网站。当 Bob 访问该网站时,上述 url 就会从 Bob 的浏览器发向银行,而这个请求会附带 Bob 浏览器中的 cookie 一起发向银行服务器。大多数情况下,该请求会失败,因为他要求 Bob 的认证信息。但是,如果 Bob 当时恰巧刚访问他的银行后不久,他的浏览器与银行网站之间的 session 尚未过期,浏览器的 cookie 之中含有 Bob 的认证信息。这时,悲剧发生了,这个 url 请求就会得到响应,钱将从 Bob 的账号转移到 Mallory 的账号,而 Bob 当时毫不知情。等以后 Bob 发现账户钱少了,即使他去银行查询日志,他也只能发现确实有一个来自于他本人的合法请求转移了资金,没有任何被攻击的痕迹。而 Mallory 则可以拿到钱后逍遥法外。

3.如何防范

3.1 XSS防范措施

XSS既然是通过输入框嵌入恶意脚本代码,那么只要对用户输入的内容进行过滤,就可以防止XSS攻击,主要措施还是建立一套完善的字符串过滤体系,一般成熟的框架都有提供一套完善的字符串过滤体系。

3.2 CSRF防范措施

CSRF攻击的防范措施一般有两种:
1.使用token:
CSRF攻击成功的主要原因是所有的用户验证信息都存在cookie中,因此黑客可以直接利用cookie来伪造请求,那如果以黑客不知道的形势来验证请求,那么CSRF攻击就无法成功。因此在请求中加入token就可以防范CSRF攻击。每次请求服务器首先对token进行验证,没有token或者token内容不对就拦截请求。

2.在http头中自定义属性:
这种方法与token验证如出一辙,唯一不同的是,它将token放在http请求头中,如果觉得在http请求中加入token的不方便,可以选择这种方法。