介绍

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

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. 恶意代码窃取用户敏感数据发送给攻击者,或者冒充用户的行为,调用目标网站接口执行攻击者指定的操作。

举例

恶意链接的地址指向了 localhost:8001/?q=111&p=222。然后,我再启一个简单的 Node 服务处理恶意链接的请求:

const http = require('http');
function handleReequest(req, res) {res.setHeader('Access-Control-Allow-Origin', '*');res.writeHead(200, {'Content-Type': 'text/html; charset=UTF-8'});res.write('<script>alert("反射型 XSS 攻击")</script>');res.end();
}const server = new http.Server();
server.listen(8001, '127.0.0.1');
server.on('request', handleReequest);
复制代码

然后诱导他人点击这个链接,就可以完成一次反射型 XSS 攻击。

而对于这么长的链接,我们还可以伪装伪装,转为短网址或者二维码。

这样就产生了反射型 XSS 攻击。攻击者可以注入任意的恶意脚本进行攻击,可能注入恶作剧脚本,或者注入能获取用户隐私数据(如cookie)的脚本,这取决于攻击者的目的。

DOM 型 XSS(DOM-based XSS)

原理

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

攻击步骤

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

举例

下面是一个物流详情的页面,在 URL 上有快递编号这个参数,通过这个参数来获取数据。

https://www.kkkk1000.com/xss/dom/index.html?serialNumber=YT40359134268305

因为在源码中可以看到,页面上显示的快递编号,是直接取的 URL 上的参数显示的。所以我们构造这样一个网址: https://www.kkkk1000.com/xss/dom/index.html?serialNumber=<script>alert("xss")</script> 然后诱导他人点击这个链接,就可以完成一次 DOM 型 XSS 攻击。

存储型 XSS(Stored XSS)

原理

存储型 XSS 跟 反射型 XSS 的区别是:

  1. 存储型 XSS 的恶意代码存在服务器上, 反射型 XSS 的恶意代码存在 URL 里。
  2. 存储型 XSS 攻击时恶意脚本会存储在目标服务器上。

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

攻击步骤

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

举例

这是一个可以评论的文章的页面

https://www.kkkk1000.com/xss/Stored/index.html

但是,评论的内容是没有处理过的,所以我们如果输入这样的内容:

<script>alert("xss")</script> 同样是可以作为评论的。

我们用这样的内容作为评论后,所有打开这篇文章的用户都会遭到存储型 XSS 攻击 。

XSS 攻击的防范

CSP

现在主流的浏览器内置。

HttpOnly 防止劫取 Cookie

HttpOnly 最早由微软提出,至今已经成为一个标准。浏览器将禁止页面的Javascript 访问带有 HttpOnly 属性的Cookie。

上文有说到,攻击者可以通过注入恶意脚本获取用户的 Cookie 信息。通常 Cookie 中都包含了用户的登录凭证信息,攻击者在获取到 Cookie 之后,则可以发起 Cookie 劫持攻击。所以,严格来说,HttpOnly 并非阻止 XSS 攻击,而是能阻止 XSS 攻击后的 Cookie 劫持攻击。

输入检查

不要相信用户的任何输入。 对于用户的任何输入要进行检查、过滤和转义。

  1. 建立可信任的字符和 HTML 标签白名单,对于不在白名单之列的字符或者标签进行过滤或编码。
  2. 在 XSS 防御中,输入检查一般是检查用户输入的数据中是否包含 <,> 等特殊字符,如果存在,则对特殊字符进行过滤或编码,这种方式也称为 XSS Filter。

而在一些前端框架中,都会有一份 decodingMap, 用于对用户输入所包含的特殊字符或标签进行编码或过滤,如 <,>,script,防止 XSS 攻击:

// vuejs 中的 decodingMap
// 在 vuejs 中,如果输入带 script 标签的内容,会直接过滤掉
const decodingMap = {'<': '<','>': '>','"': '"','&': '&',' ': '\n'
}
复制代码

输出检查

用户的输入会存在问题,服务端的输出也会存在问题。一般来说,除富文本的输出外,在变量输出到 HTML 页面时,可以使用编码或转义的方式来防御 XSS 攻击。例如利用 sanitize-html对输出内容进行有规则的过滤之后再输出到页面中。

小编整理了2021年网络安全入门到精通 电子书籍,祝大家在金三银四的日子里顺利找到自己喜欢的岗位,需要的朋友点击领取!



网络安全学习路线

详细网络安全白皮书版本点击领取

赠送2021工具大礼包

【Web 安全】XSS的三种姿势及其防范手段相关推荐

  1. Spring中部署Activiti流程定义的三种姿势

    摘要:本文对工作流Activiti框架中流程定义的部署进行了详细说明介绍. 本文分享自华为云社区<项目中工作流部署详细解析!Spring中部署Activiti流程定义的三种姿势>,作者:攻 ...

  2. Android三种姿势带你玩转360度全景图功能

    简介 大家好我是张鹏辉(道长)人如其名,我是天桥上算命的,转发这条博文,接下来一个月会有意想不到的惊喜发生.最近微博上的全景图火了,所以决定实现一下.工程里面图片资源来自网络,如有侵权请联系我,马上删 ...

  3. Android App 开发的三种姿势 ~

    点击上方"码农的后花园",选择"星标" 公众号 精选文章,第一时间送达 现在市场上各式各样的App越来越多,其实设计一个App也没有那么难,这期就讲解一下安卓开 ...

  4. Java Web开发Tomcat中三种部署项目的方法

    第一种方法:在tomcat中的conf目录中,在server.xml中的,<host/>节点中添加:  <Context path="/hello" docBas ...

  5. Django之session验证的三种姿势

    一.什么是session session是保存在服务端的键值对,Django默认支持Session,并且默认是将Session数据存储在数据库中,即:django_session 表中. 二.FVB中 ...

  6. asp.net Session在web.config中的三种配置方式——详解

    这段代码就是设置session在web.config中的存储方式. < sessionState mode="Off|InProc|StateServer|SQLServer" ...

  7. git commit回退三种姿势

    git commit 回退 弄清楚三个区 工作区(working tree): 本地编辑器 暂存区(index):git add操作后进入暂存区,可用git status查看 本地仓库(reposit ...

  8. 正确开启Mockjs的三种姿势:入门参考(一)

    一.文章初衷 阅读本文章需要注意以下几点: 文章不主要介绍Mockjs的使用语法 文章暂不涉及Mockjs的第三方封装框架 文章会结合以往做过上线项目的方式总结 想主要介绍如何使用Mockjs,是因为 ...

  9. SAP EWM 与 AGV 机器人对接的三种模式

    SAP EWM 与 AGV 机器人对接的三种模式 https://mp.weixin.qq.com/s/xGfUMSBTEMYKce5oXcWDqA 导读    本文转载自:弘毅供应链,跟随供应链专家 ...

最新文章

  1. 转载CSDN(educast):c# 对两个Datatable的结构相同进行合并
  2. [HNOI2009]无归岛
  3. hdu4302 set或者线段树
  4. 巴巴运动网学习笔记(16-20)
  5. MATLAB GUI不同控件函数间变量传递方法
  6. 大型企业网络系统传输负载测试及分析
  7. 360私有云平台-HULK 5岁啦~
  8. 从有理数到实数(序)
  9. L1-035 情人节(两种方法)
  10. 关于php编译安装扩展模块memcache的问题
  11. bootstrap 黑边框表格样式_bootstrap3.0教程之多种表格效果(条纹状表格、条纹状表格、鼠标悬停等)...
  12. Android权限大全
  13. nmap 扫描常见端口——命令
  14. 自己手动编译mpc-hc播放器
  15. 三、向SpringCloud注册Service服务(Restful服务)
  16. E280 P0410故障修复
  17. 使用Ant打包部署STAF插件
  18. APICloud App开发上手经验分享之模块调用
  19. c语言内存和文件处理有关知识
  20. 长尾词挖掘免费工具-长尾关键词挖掘词

热门文章

  1. PowerBI-时间智能函数-DATES系列
  2. StarUML 3.0.2 快速破解方法
  3. python--os.chdir() 方法 切换当前工作路径
  4. 【CIKM 2021】推荐系统相关论文分类
  5. 申请了一张招行的全币种信用卡
  6. win10从零安装配置pytorch全过程
  7. 苹果手机解压缩软件_BetterZip 5 for Mac(苹果专用解压缩软件)
  8. matlab空间曲面拟合,【Matlab】离散点拟合曲面
  9. 斯坦福CS231n李飞飞计算机视觉之线性分类上
  10. 在VS2010中ActiveX控件注册方法,使用regsvr32命令