XSS攻击与防御

一、概念:

        XSS:跨站脚本攻击(英文全称:Cross Site Scripting),为不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,故将跨站脚本攻击缩写为XSS,XSS是一种经常出现在web应用中的计算机安全漏洞,它允许恶意web用户将代码植入到提供给其它用户使用的页面中,比如HTML代码和客户端脚本如Javascript中。从效果和稳定性上可分为:反射型XSS和存储型XSS。反射型XSS一般都需要引诱用户触发事件,比如点击一个按钮;而存储型XSS是将恶意代码存储在服务端,只要用户请求服务端要查看数据就会执行存储的恶意代码,因此具有很强的稳定性。

二、攻击条件:

        1、能够向web页面注入恶意代码;

        2、这些恶意代码能够被浏览器成功的执行。

三、攻击示例:

        1、反射型XSS攻击:

        如果需要用户输入name,这个name经过服务端后又会回显给用户,那么如果用户输入name的内容是Javascript中的方法调用,比如:

<script>alert("中毒了")</script>

那么经过服务端后返回这条信息通过HTML展示给用户时,浏览器会认为这是Javascrip代码片断,所以会执行。最终会弹出提示框,而不是显示文本内容。

<?php
    $name=$_GET['name'];
    echo $name;
?>

        2、存储型XSS攻击:

        和上例中反射型XSS攻击类似,唯一的区别是用户输入的name存储到了数据库中,当其他人查询这条记录时,浏览器会认为这是Javascrip代码片断,所以会执行。最终会弹出提示框,而不是显示文本内容。

        3、DOM型XSS攻击:

        实际上也属于反射型XSS攻击,只是这种攻击是通过修改DOM属性(比如增加点击事件)来达到攻击的目的。比如:

<html>
  <head>
    <title>录入</title>
  </head>
  <body>
    <script>
        function submit(){
          var str=document.getElementById("text").value;
          document.getElementById("div1").innerHTML="<a href='" + str + "'>click</a>";
        }
    </script>
    <div id="div1"></div>
    <input type='text' id="text" value="">
    <input type="button" id="button" value="提交" onclick="submit()">
  </body>
</html>

如果输入的是如下内容,那么用户点击“提交”后,点击生成的“click”链接,同样会执行用户植入的恶意代码。

' onclick=alert("中毒了") '

四、防御措施:

        任何漏洞的防御措施都不能保证一定能防御恶意的攻击,即使能那也只是暂时的。但这些防御措施一定能加大这些恶意攻击的成本,或时间,或金钱。如果花了100元用了10天时间研究出一种攻击方式去攻击某网站获利10元钱,那么这个攻击成本太高了,恶意攻击的目的不就是为了获利?如果无利可图,那么恶意攻击就少了,但并不排除一些黑客级玩家炫技的情形。

1、最常见的XSS攻击是为了获取Cookie,因为Cookie中存着用户的身份信息,所以需要在设置Cookie时设置HttpOnly属性;

2、将可能引起XSS攻击的字符清除或转义成没有攻击能力的字符像&lt;等,比如:

        1>ASCII中的控制字符,比如:

x00-x1F

        2>HTML标签,比如:

<javascript>,<vbscript>,<expression>,<applet>,<meta>,<xml>,<blink>,<link>,<style>,<script>,<embed>,<object>,<iframe>,<frame>,<frameset>,<ilayer>,<layer>,<bgsound>,<title>,<base>,<details>

        3>HTML标签中的事件,比如:

onabort,onactivate,onafterprint,onafterupdate,onbeforeactivate,onbeforecopy,onbeforecut,onbeforedeactivate,onbeforeeditfocus,onbeforepaste,onbeforeprint,onbeforeunload,onbeforeupdate,onblur,onbounce,oncellchange,onchange,onclick,oncontextmenu,oncontrolselect,oncopy,oncut,ondataavailable,ondatasetchanged,ondatasetcomplete,ondblclick,ondeactivate,ondrag,ondragend,ondragenter,ondragleave,ondragover,ondragstart,ondrop,onerror,onerrorupdate,onfilterchange,onfinish,onfocus,onfocusin,onfocusout,onhelp,onkeydown,onkeypress,onkeyup,onlayoutcomplete,onload,onlosecapture,onmousedown,onmouseenter,onmouseleave,onmousemove,onmouseout,onmouseover,onmouseup,onmousewheel,onmove,onmoveend,onmovestart,onpaste,onpropertychange,onreadystatechange,onreset,onresize,onresizeend,onresizestart,onrowenter,onrowexit,onrowsdelete,onrowsinserted,onscroll,onselect,onselectionchange,onselectstart,onstart,onstop,onsubmit,onunload,ontoggle,oninput,oncanplay

3、一些恶意代码并不是直接注入到页面的,而是通过类似src属性引入的,所以不容易发现。因此必要的时候需要对src所引用的资源的内容进行检查;

4、有些恶意代码为了对抗防御,会做一些特殊处理,比如:

        1>将字母用大小写混拼来对抗防御

<ScRipt>ALeRt("依然中毒了");</sCRipT>

        2>对恶意代码做二次包装,过滤只会去掉第一层,去掉第一层后第二层正好可以攻击

<scr<script>ipt>alert("依然中毒了")</scr<script>ipt>

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值