学习宝典XSS攻击进阶篇——那些年我们看不懂的XSS

Posted 开源聚合网络空间安全研究院

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了学习宝典XSS攻击进阶篇——那些年我们看不懂的XSS相关的知识,希望对你有一定的参考价值。

一. XSS概述

【学习宝典】XSS攻击进阶篇——那些年我们看不懂的XSS

注:因此没有反射型XSS、存储型XSS、DOM XSS这种分类,因为分类依据都不同…

XSS的实质其实是html代码与Javscript代码的注入。但由于XSS的攻击对象是与客户对等的Browser端,因此常常不被开发者所重视。

一般意义上的XSS通常可以用简单的方法检测出来:当用户输入中某个参数的全部或其中一部分,原封不动地在源代码里出现时,我们就可以认为这个参数存在XSS漏洞。

【学习宝典】XSS攻击进阶篇——那些年我们看不懂的XSS

我们可以在扫描器的帮助下铲除绝大多数的常规XSS,因为扫描器所擅长的模式识别很容易从HTML代码里找出自己刚刚输入的东西…

【学习宝典】XSS攻击进阶篇——那些年我们看不懂的XSS

直到某一天,出现了一类不会在源代码中回显的XSS…

【学习宝典】XSS攻击进阶篇——那些年我们看不懂的XSS

此时我们才意识到,原来XSS并不像想象中的那么简单

二. 文件对象模型简介
1.DOM简介

文档对象模型(Document Object Model),即大名鼎鼎的DOM。

DOM可以被认为是一种通过将页面元素以对象的树形方式表现,以便由javascript组织处理的实现方法。

【学习宝典】XSS攻击进阶篇——那些年我们看不懂的XSS

2.常用的DOM方法

用户可通过 JavaScript (以及其他编程语言)对 HTML DOM 进行访问。所有 HTML 元素被定义为对象,而编程接口则是对象方法和对象属性。

【学习宝典】XSS攻击进阶篇——那些年我们看不懂的XSS

3.四个重要的DOM属性

nodeName 属性:规定节点的名称。

  • nodeName 是只读的

  • 元素节点的 nodeName 与标签名相同

  • 属性节点的 nodeName 与属性名相同

  • 文本节点的 nodeName 始终是 #text

  • 文档节点的 nodeName 始终是 #document

nodeValue 属性:规定节点的值。

  • 元素节点的 nodeValue 是 undefined 或 null

  • 文本节点的 nodeValue 是文本本身

  • 属性节点的 nodeValue 是属性值

nodeType 属性:返回节点的类型。

  • nodeType 是只读的。

innerHTML 属性:获取元素内容,如:

【学习宝典】XSS攻击进阶篇——那些年我们看不懂的XSS

即text的值为Hello World!

innerHTML可以被赋值,也可读,因此是被引用次数最多的对象属性,同时也是最容易产生安全问题的对象属性。

4. 输入一般在哪里

Location 对象属性

【学习宝典】XSS攻击进阶篇——那些年我们看不懂的XSS

JS通常会通过调用DOM内置对象location来获得用户输入,如引用参数切分可使用location.search,引用完整URL可使用location.href等。

【学习宝典】XSS攻击进阶篇——那些年我们看不懂的XSS

三. DOM base XSS
1. 两个典型的DOM过程

1)反射型DOM base XSS

【学习宝典】XSS攻击进阶篇——那些年我们看不懂的XSS

2)存储型DOM base XSS

【学习宝典】XSS攻击进阶篇——那些年我们看不懂的XSS

2.需要了解的知识点

【学习宝典】XSS攻击进阶篇——那些年我们看不懂的XSS

比起常规XSS,DOM base XSS的漏洞发现过程更像是代码审计..

3.典型DOM base XSS实例

【学习宝典】XSS攻击进阶篇——那些年我们看不懂的XSS

【学习宝典】XSS攻击进阶篇——那些年我们看不懂的XSS

4. mxss

如果用户输入“出入”DOM两次以上,则有可能触发更高级别的DOM base XSS:mXSS

【学习宝典】XSS攻击进阶篇——那些年我们看不懂的XSS

5.容易出现mXSS的场景

【学习宝典】XSS攻击进阶篇——那些年我们看不懂的XSS

由于innerHTML会将HTML实体,CSS转义字符,ANSI编码等进行反转义,因此原来被转义之后认为安全的用户输入很有可能在绕过过滤器之后被反转回去。

【学习宝典】XSS攻击进阶篇——那些年我们看不懂的XSS

四. 过滤器绕过
1 .先来几个栗子

常规XSS的过滤器绕过

【学习宝典】XSS攻击进阶篇——那些年我们看不懂的XSS

【学习宝典】XSS攻击进阶篇——那些年我们看不懂的XSS

2. 过滤器绕过方法

【学习宝典】XSS攻击进阶篇——那些年我们看不懂的XSS

一般意义上而言,DOM base XSS的首先要通过服务端的过滤器清洗一番,然后还要通过页面加载的各个JS脚本,绕过难度相对较大…

编码绕过:

我们要插入的代码:<img src=“” onerror=alert(123)>

【学习宝典】XSS攻击进阶篇——那些年我们看不懂的XSS

HTML5特性:

3. XSS修复建议

不含有富文本编辑器(自定义样式)且没有使用DOM的站点:

输入:过滤双引号,单引号,左右尖括号,分号。

输出:对上述字符进行HTML实体编码即可。

不含有富文本编辑器(自定义样式)但使用DOM的站点:

输入:在DOM中转义双引号,单引号,左右尖括号,分号。

输出:在输出之前进行编码,如:innerHTML=encodeHTML(output)

含有富文本编辑器(自定义样式)但没有使用DOM的站点:

输入:过滤双引号,单引号,分号。

输出:对上述字符进行HTML实体编码即可。

含有富文本编辑器(自定义样式)且使用DOM的站点:

没办法…指哪儿修哪儿…

炼石信息安全培训班

专注信息安全人才培养

搭建企业人才供需桥梁

以上是关于学习宝典XSS攻击进阶篇——那些年我们看不懂的XSS的主要内容,如果未能解决你的问题,请参考以下文章

干货 | 十分钟带你从入门到进阶python爬虫,小学生都能看懂的教程,零基础学习宝典

那些年搞不懂的"协变"和"逆变"

看不懂的 build.gradle 代码

黑客攻防技术宝典web实战篇:攻击其他用户习题

MySQL——用别人看不懂的方式算近3年年份

20145207 Exp9 web安全基础实践