XSS跨站脚本攻击类型、分类零基础入门_攻击使用攻略

XSS 介绍XSS 是跨站脚本攻击(Cross Site Scripting)的简写,但是从首写字母命名的方式来看,应该取名 CSS,但这样就和层叠样式表(Cascading Style Sheets,CSS)重名了,所以取名为 XSS。XSS 攻击,一般是指攻击者通过在网页中注入恶意脚本,当用户浏览网页时,恶意脚本执行,控制用户浏览器行为的一种攻击方式。X

XSS跨站脚本攻击类型、分类零基础入门

XSS 介绍

XSS 是跨站脚本攻击(Cross Site Scripting)的简写,但是从首写字母命名的方式来看,应该取名 CSS,但这样就和层叠样式表(Cascading Style Sheets,CSS)重名了,所以取名为 XSS。

XSS跨站脚本攻击类型、分类零基础入门_攻击使用攻略

XSS 攻击,一般是指攻击者通过在网页中注入恶意脚本,当用户浏览网页时,恶意脚本执行,控制用户浏览器行为的一种攻击方式。

XSS 危害

  • 窃取用户Cookie,获取用户隐私,盗取用户账号。
  • 劫持用户(浏览器)会话,从而执行任意操作,例如进行非法转账、强制发表日志、发送电子邮件等。
  • 强制弹出广告页面,刷流量等。
  • 传播跨站脚本蠕虫,网页挂马等。
  • 结合其他漏洞,如 CSRF 漏洞,实施进一步的攻击。
  • ……

XSS 分类

XSS 攻击按是否把攻击数据存进服务器端,攻击行为是否伴随着攻击数据一直存在,可分为 非持久型 XSS 攻击 和 持久型 XSS 攻击。

XSS 攻击按攻击方式又可分为 反射型 XSS、DOM 型 XSS、存储型 XSS,其中 反射型 XSS 和 DOM 型 XSS 算是 非持久型 XSS 攻击,而 存储型 XSS 算是 持久型 XSS 攻击。

反射型 XSS(Reflected XSS)

攻击者诱导用户访问一个带有恶意代码的 URL 后,服务器端接收数据后处理,然后把带有恶意代码的数据发送到浏览器端,浏览器端解析这段带有 XSS 代码的数据后当做脚本执行,最终完成 XSS 攻击。 
因为这个过程就像一次反射,故称为反射型 XSS。

攻击步骤: 
1、攻击构造出特殊的 URL ,其中包含恶意代码。 
2、用户被诱导打开带有恶意代码的 URL,服务器端将恶意代码从 URL 中取出当做参数处理,然后返回给用户带有恶意代码的数据。 
3、用户浏览器接收到响应解析执行,混在其中的恶意代码也被执行。 
4、恶意代码窃取用户敏感数据发送给攻击者,或者冒充用户的行为,调用目标网站接口执行攻击者指定的操作。

XSS跨站脚本攻击类型、分类零基础入门_攻击使用攻略

DOM 型 XSS(DOM-based XSS)

DOM 型 XSS 形成原因是通过修改页面的 DOM 节点形成的 XSS。 
DOM 型 XSS 攻击中,取出和执行恶意代码都由浏览器端完成,属于前端自身的安全漏洞。

攻击步骤: 
1、攻击者构造出特殊的 URL,其中包含恶意代码。 
2、用户被诱导打开带有恶意代码的 URL。 
3、用户浏览器接收到响应后解析执行,前端 JavaScript 取出 URL 中的恶意代码并执行。 
4、恶意代码窃取用户数据并发送到攻击者的网站,或者冒充用户的行为,调用目标网站接口执行攻击者指定的操作。

XSS跨站脚本攻击类型、分类零基础入门_攻击使用攻略

存储型 XSS(Stored XSS)

存储型 XSS 跟 反射型 XSS 的区别是:存储型 XSS 的恶意代码存在服务器上,反射型 XSS 的恶意代码存在 URL 里。

存储型 XSS 攻击时恶意脚本会存储在目标服务器上。当浏览器请求数据时,脚本从服务器传回并执行。它是最危险的一种跨站脚本,比反射性 XSS 和 DOM 型 XSS 都更有隐蔽性,因为它不需要用户手动触发。任何允许用户存储数据的 Web 程序都可能存在存储型 XSS 漏洞。若某个页面遭受存储型 XSS 攻击,所有访问该页面的用户都会被 XSS 攻击。

攻击步骤: 
1、攻击者把恶意代码提交到目标网站的服务器中。 
2、用户打开目标网站,网站服务器端把带有恶意代码的数据取出,当做正常数据返回给用户。 
3、用户浏览器接收到响应解析执行,混在其中的恶意代码也被执行。 
4、恶意代码窃取用户敏感数据发送给攻击者,或者冒充用户的行为,调用目标网站接口执行攻击者指定的操作。

XSS跨站脚本攻击类型、分类零基础入门_攻击使用攻略

防御方法

浏览器自带防御 (X-XSS-Protection )

HTTP X-XSS-Protection 响应头是 Internet Explorer,Chrome 和 Safari 的一个功能,当检测到跨站脚本攻击(XSS)时,浏览器将停止加载页面。

他可以设置4个值:

X-XSS-Protection: 0     
禁止XSS过滤。     

X-XSS-Protection: 1       
启用XSS过滤(通常浏览器是默认的)。 如果检测到跨站脚本攻击,浏览器将清除页面(删除不安全的部分)。  

X-XSS-Protection: 1; mode=block  
启用XSS过滤。 如果检测到攻击,浏览器将不会清除页面,而是阻止页面加载。  

X-XSS-Protection: 1; report=<reporting-uri>    
启用XSS过滤。 如果检测到跨站脚本攻击,浏览器将清除页面并使用CSP report-uri指令的功能发送违规报告。  

这种浏览器自带的防御功能只对反射型 XSS 有一定的防御力,其原理是检查 URL 和 DOM 中元素的相关性,但这并不能完全防止反射型 XSS,而且也并不是所有浏览器都支持 X-XSS-Protection。

转义

在 XSS 攻击中,攻击者主要是通过构造特殊字符来注入脚本,所以对用户的输入进行检测就很有必要,并且需要在客户端与服务端都进行输入检测,然后对用户输入的数据进行转义。

主要就是对输入所包含的特殊字符进行转义,如 <,>,&,”,’,来防止 XSS 攻击。

下面是一个用于转义的方法:

function escapeHTML(str) {
    if (!str) return '';
    str = str.replace(/&/g, "&amp;");
    str = str..replace(/</g, "&lt;");
    str = str..replace(/>/g, "&gt;");
    str = str..replace(/"/g, "&quot;");
    str = str..replace(/'/g, "'");
    return str;
};

过滤

在富文本中因为需要保留 HTML ,所以我们不能使用转义的方法防御 XSS 攻击,这里使用过滤的方式防御 XSS 攻击,也就是通过只使用白名单允许的 HTML 标记及其属性,来防御攻击。

这里推荐一个名为 XSS 的组件 ,这就是一个根据白名单过滤 HTML,防止 XSS 攻击的组件。

内容安全策略(CSP)

内容安全策略(Content Security Policy,CSP),实质就是白名单制度,开发者明确告诉客户端,哪些外部资源可以加载和执行,大大增强了网页的安全性。

两种方法可以启用 CSP。一种是通过 HTTP 头信息的 Content-Security-Policy 的字段。

Content-Security-Policy: script-src 'self'; 
                         object-src 'none';
                         style-src cdn.example.org third-party.org; 
                         child-src https:

另一种是通过网页的 <meta> 标签。

<meta http-equiv="Content-Security-Policy" content="script-src 'self'; object-src 'none'; style-src cdn.example.org third-party.org; child-src https:">

上面代码中,CSP 做了如下配置。

  • 脚本: 只信任当前域名
  • <object>标签: 不信任任何 URL,即不加载任何资源
  • 样式表: 只信任 cdn.example.org 和 third-party.org
  • 页面子内容,如 <frame>、<iframe>: 必须使用HTTPS协议加载
  • 其他资源: 没有限制

启用后,不符合 CSP 的外部资源就会被阻止加载。

总结

XSS 攻击的本质就是输入的内容被当做程序执行了,所以我们对于用户输入的内容不能完全的信任,需要考虑如何避免其被当做程序执行。

海计划公众号
(0)
上一篇 2020/03/26 23:29
下一篇 2020/03/26 23:29

您可能感兴趣的内容

  • TypeScript 完全手册小白攻略_手册入门基础

    什么是 TypeScript?TypeScript 是 JavaScript 的超集,具有静态类型特性,旨在简化大型 JavaScript 应用程序的开发,也被称为 JavaScript that scales(可拓展的 JavaScript)。为什么要用 TypeScript?JavaScript 在过去几年中快速发展,成为客户端和服务器端最通用的跨平台语

    2020/03/26
  • 移动端底部导航固定配合vue-router实现组件切换基础知识教程_router基础入门

    在我们平时练习或者实际项目中也好,我们常常遇到这么一个需求:移动端中的导航并不是在顶部也不是在底部,而是在最底部且是固定的,当我们点击该导航项时会切换到对应的组件。相信对于很多朋友而言,这是一个很简单的需求,而且市面上有很多开源的组件库就可以实现,像比如说:cube-ui等!那么对于一个要是还在练习以及对第三方组件库不是很了解的朋友不妨看看我这篇,相信会对你

    2020/03/29
  • 码农不属于互联网小白常识_互联网小白知识

    友情提示:本人经历有限,没进过大厂,没参与过开源社区维护,就是个写了几年业务代码的底层码农。一切观点来源于自身经验和网络,如有偏颇,你也不能来打我,请谨慎阅读。1什么是互联网广义上的互联网互联网(英语:Internet)是指 21世纪之初网络与网络之间所串连成的庞大网络。这些网络以一些标准的网络协议相连,连接全世界几十亿个设备,形成逻辑上的单一巨大国际网络。

    2020/03/24
  • dns被劫持问题需要网站监控来检测零基础入门_dns基础指南

    什么是网站劫持?举个现实中的例子,当我们按照自己的需求打开某一个网站之后却发现该网站的内容并不是原来的,而这一个过程就叫做dns劫持。今天小编告诉大家dns被劫持如何修复。建议大家平时还是使用网站监控工具,推荐iis7网站监控,可以24小时监控网站,一旦有异常,会马上发送邮件通知你。一、DNS劫持手动修改DNS1、在地址栏中输入:192.168.1.1(如果

    2020/03/29
  • accessible-html5-video-player使用说明_一个轻量级的 HTML5 视频播放器

    accessible-html5-video-player使用说明 官方网址:http://paypal.github.io/accessible-html5-video-play…

    2020/03/06
  • 前端度菜鸟攻略_关注web前端开发、前端资源

    前端度菜鸟攻略 官方网址:http://qianduandu.com/ 简介描述:关注web前端开发、前端资源 关注Web前端开发; 实时更新最新前端开发技术,为用户提供各种最实用…

    2020/03/11
  • Vue的组件化菜鸟教程下载_组件小白帮助

    组件化是Vue的精髓,Vue就是由一个一个的组件构成的。Vue的组件化设计到的内容又非常多,当在面试时,被问到:谈一下你对Vue组件化的理解。这时候又有可能无从下手,因此在这里阐释一下个人对Vue的组件化的理解。组件的分类一般来说,组件大致可以分为三类:页面级别的组件。业务上可复用的基础组件。与业务无关的独立组件。页面级别的组件页面级别的组件,通常是page

    2020/03/30
  • Webpack安装配置及打包详细过程小白知识_打包入门百科

    引言前端经过漫长的发展,涌现出了很多实践方法来处理复杂的工作流程,让开发变得更加简便,其中,模块化可以使复杂的程序细化成为各个小的文件,而webpack并不强制你使用某种模块化方案,而是通过兼容所有模块化方案让你无痛接入项目,本文详细介绍webpack安装配置及打包的详细过程。Webpack简单介绍本质上,webpack 是一个现代 JavaScript 应

    2020/03/26
  • html5不常用标签应用场景小白攻略_场景指南攻略

    作为一个前端开发,在浏览别人家的页面时总是会习惯性的查看他们页面的源码,发现大多数网站的页面,包括我自己写的页面中用到的最多的布局元素无外乎就是div、p、span、ul、dl、ol、li、dt、dd、strong、b,不管是什么样的效果都是由这些元素组成,现在都已经是9102年了,html5已经相当成熟标准了,为什么在布局的时候不用写html5提供的具有语

    2020/03/20
  • LibScore入门指南_在线JS脚本库收集统计平台

    LibScore基础知识入门 官方网址:http://libscore.com/ 简介描述:在线JS脚本库收集统计平台 LibScore:在线JS脚本库收集统计平台是一个通过网络爬…

    2020/03/06
  • 解决图片上传File对象不兼容IE使用攻略_上传入门基础

    最近做公司业务, 上传图片出问题了~首先是要求前端传递的图片名称不能是中文 ?解决办法: 我们讨论决定以时间戳命名new File([file], new Date().getTime() + ‘.’ + 文件后缀名 ,{ type: file.type });问题又来了, new File在ie下报错,也就是说在ie下调用上传图片功能是无效的解决办法: F

    2020/03/22
  • Js修饰器模式使用帮助_模式指南攻略

    不会改变原有的对象,而是在其基础上进行拓展。实现原理创建一个 A 类A 类中的属性和方法使用 ES7 中的修饰器语法对类和类的属性增加功能实现代码ts 修饰器语法如下是 ts 官方文档的例子:https://zhongsp.gitbooks.io/typescript-handbook/doc/handbook/Decorators.htmlfunction

    2020/03/29
  • php类 属性和方法的关系小白入门_php使用指南

    一 . 属性关系1 . public属性:在类的外部和内部都可以调用 被继承能够重构2 . protected属性:在类的内部可以调用外部不能可以被继承并且重构3 . private属性:只有在类的内部调用 不能被继承4 . static属性:类的内部和外部都能调用 内部调用方法(self::属性变量) 外部调用方法(类名::属性变量) 二 .

    2020/03/30
  • 微信小程序用户授权小白攻略_小程序菜鸟教程下载

    对于小对于小程序未授权的用户,官方取消wx.getUserInfo方法的直接调用,首次授权必须主动触发自定义按钮,才可调起官方授权组件
    可以获取到的信息有:昵称、头像、性别、国家、省份、城市、性别、语言思路步骤wx.getSetting查看是否授权已授权使用wx.getUserInfo获取用户信息,保存未授权显示带有button的自定义页面,bindGetU

    2020/04/03
  • javascript-questions小白帮助_JavaScript 进阶问题列表

    javascript-questions小白帮助 GitHub:https://github.com/lydiahallie/javascript-questions 简介描述:J…

    2020/03/10
  • js循环中的异步&&循环中的闭包新手入门_闭包基础教程

    for循环中let 和var的区别var 是函数级作用域或者全局作用域,let是块级作用域看一个例子 function foo() {for (var index = 0; index 5}foo()console.log(ind

    2020/03/31