WEB安全——了解XSS和CSRF攻击

是不是觉得黑客很神秘,仿佛一个幽灵般来无影去无踪,做的事情又那么神奇,能盗别人的账户,能让别人的网站错乱或者瘫痪,还能更改学习成绩…其实这些怎么弄的,我也不知道~~

最近在慕课网发现一个好玩的课程,Web安全——XSS,里面讲到了XSS,顺便提了一句CSRF,然后我就顺着去了解了一下。

认识

XSS:Cross Site Scripting 跨站脚本攻击,通过插入恶意脚本,实现对用户浏览器的控制。
CSRF:Cross-site Request Forgery 跨站请求伪造,攻击者盗用用户身份,以用户名义发送恶意请求。


XSS

XSS可以盗用cookie,破坏页面结构,插入恶意内容,DDOS(分布式拒绝服务攻击)攻击效果。通过XSS方式注入内容引诱触发CSRF攻击。

原理 :恶意攻击者往Web页面里插入恶意Script代码,当用户浏览该页之时,嵌入其中Web里面的Script代码会被执行,从而达到恶意攻击用户的目的。

手段

(1).反射型:发出请求时,XSS代码出现在URL中,作为输入提交到服务器,服务端解析后响应,XSS代码随响应代码一起返回给浏览器,最后浏览器解析执行XSS代码。

www.example.com/?url=<img src='' onerror='alert(1)'>//自动触发
www.example.com/?url=<p onclick='alert(1)'>点我</p>//引诱触发
www.example.com/?url=<iframe src='baidu.com'></iframe>
//chrome浏览器会默认拦截,如果设置'X-XSS-Protection:0'则取消默认拦截

(2).存储型:提交的XSS代码会存储在服务端(数据库/内存/文件系统等),下次请求目标页面时不用再提交XSS代码。

防范

1、编码:避免原样保存,对用户输入的数据进行HTML Entity编码
字符编码

function htmlEnCode(str){
var s='';
if(str.length==0) return '';
s=str.replace(/&/g,'&gt;');//&
s=s.replace(/</g,'&lt;');//<
s=s.replace(/>/g,'&gt;');//>
s=s.replace(/\s/g,'&nbsp;');空格
s=s.replace(/\'/g,'&#39');''
s=s.replace(/\"/g,'&quot;');""
s=s.replace(/\n/g,'<br>');换行符
return s;
}

2、过滤:原样显示内容时先过滤非法内容,移除用户上传的DOM属性,如onerror、onclick、onmouseover等,移除用户上传的style节点、script节点、iframe节点等。

3、校正:避免恶意破坏页面DOM,避免直接对HTML Entity解码,使用DOM Parse,校正不配对的DOM标签。


CSRF

原理

登录受信任网站A,并在本地生成Cookie,在不登出A的情况下,访问危险网站B。

CSRF攻击原理

手段

1、捕获URL实现攻击

<img src=http://www.mybank.com/Transfer.php?toBankId=11&money=1000>
//危险网站B页面通过img标签来实现GET请求,这个只能针对GET请求

2、针对未指定POST请求

<img src=http://www.mybank.com/Transfer.php?toBankId=11&money=1000>
//如果受信任网站A没有指定必须POST,则危险网站B页面仍然能通过img标签来实现GET请求

3、针对指定POST请求

<html>
  <head>
    <script type="text/javascript">
      function steal()
      {
     iframe = document.frames["steal"];
      iframe.document.Submit("transfer");
      }
    </script>
  </head>
  <body onload="steal()">
    <iframe name="steal" display="none">
      <form method="POST" name="transfer" action="http://www.myBank.com/Transfer.php">
        <input type="hidden" name="toBankId" value="11">
        <input type="hidden" name="money" value="1000">
      </form>
    </iframe>
  </body>
</html>

防范

1、请求符合HTTP规范,用GET获取资源,用POST更新资源
2、服务端防范:Cookie Hashing、验证码、One-Time Tokens(不同的表单包含一个不同的伪随机值)

参考:
1.https://www.imooc.com/learn/812
2.http://www.cnblogs.com/hyddd/archive/2009/04/09/1432744.html