Step-By-Step
Step-By-Step copied to clipboard
什么是XSS攻击,XSS攻击可以分为哪几类?如何防范XSS攻击?
XSS攻击又称CSS,全称Cross Site Script (跨站脚本攻击),其原理是攻击者向有XSS漏洞的网站中输入恶意的 HTML 代码,当用户浏览该网站时,这段 HTML 代码会自动执行,从而达到攻击的目的。
xss攻击可以分成两种类型:一种是非持久型XSS攻击 一种是持久型XSS攻击。
通过正则表达式过滤传入参数的html标签来防范XSS攻击。
xss是一种代码注入攻击,通过向网站注入恶意的HTML代码; 分类: a:反射型 => 通过在请求地址上加入恶心的HTML代码 b:dom型 => 通过一些api向网站注入一些恶意的HTML代码 c:持久性 => 攻击者通过把代码提交到后台数据库中;当用户下次打开的时候就会从后台接收这些恶意的代码
防范: a:前端通过转义来进行防范以及过滤 b:主要是通过后台来进行防卫
xss只记得叫跨站脚本攻击,分几种类型还不清楚,防范的话暂时只知道一些比如用innerHtml的地方可以使用innerText防范一下,其他的了解的就比较少了,多看看大佬们怎么回答的把
什么是xss攻击
XSS 跨站脚本攻击,用户注入恶意的代码,浏览器和服务器没有对用户的输入进行过滤,导致用户注入的脚本嵌入到了页面中。由于浏览器无法识别这些恶意代码正常解析执行,攻击者的恶意操作被成功执行,比如可以获取用户的cookie数据然后发送给自己或者冒充正常用户向被攻击的服务器发送请求。
xss攻击分类
- 反射型:攻击者构造一个带有恶意代码的url链接诱导正常用户点击,服务器接收到这个url对应的请求读取出其中的参数然后没有做过滤就拼接到Html页面发送给浏览器,浏览器解析执行
- 存储型: 攻击者将带有恶意代码的内容发送给服务器(比如在论坛上发帖),服务器没有做过滤就将内容存储到数据库中,下次再请求这个页面的时候服务器从数据库中读取出相关的内容拼接到html上,浏览器收到之后解析执行
- dom型:dom型xss主要和前端js有关,是前端js获取到用户的输入没有进行过滤然后拼接到html中
防范措施
- 使用encodeURIComponent对url中的参数进行编码(反射型xss)
- 对用户的输入进行过滤(适用于所有类型的xss攻击)
下面是一个简易版对用户的输入进行过滤的方法:
function escapeHTML(str) {
str.replace(/[<>& "]/g, function(match) {
switch (match) {
case '<':
return '<';
case '>':
return '>';
case '&':
return '&';
case ' ':
return ' ';
case '"':
return '"';
}
});
}
- 对用户的输入使用innerText或者textContent进行设置,而不是使用innerHTML或者outerHTML进行设置
- 服务器端设置cookie为httpOnly让前端无法通过js获取到用户的cookie
- 关键请求使用验证码,比如转账请求,避免恶意脚本发送这些关键请求
一、 什么是XSS攻击?
XSS(Cross-Site Scripting,又称跨站脚本攻击)是一种代码注入攻击,攻击者是通过在目标网站上注入恶意脚本,使之在用户的浏览器上运行。利用这些恶意脚本,攻击者可以获取用户的敏感信息,比如cookie,sessionID等 ,进而危害数据安全。
二、 根据攻击来源,XSS攻击可以分为三类:
1. 存储型XSS
- 攻击步骤:攻击者将恶意代码提交到目标网站的数据库中,用户打开网站是,网站服务端将恶意代码从数据库中取出,拼接在HTML中返回浏览器,之后用户浏览器收到响应后解析执行混入其中的恶意代码,恶意代码窃取用户数据并发送到攻击者的网站,或者冒充用户行为,调用目标网站接口执行攻击者指定的操作。
- 常见于带有用户保存数据的网站功能,比如论坛发帖、商品评价、用户私信等等。
2. 反射型XSS
- 攻击步骤:攻击者构造出特殊的URL,其中包含恶意代码。当用户打开带有恶意代码的URL时,网站服务端将恶意代码从URL中取出,拼接在HTML中返回浏览器,之后用户浏览器收到响应后解析执行混入其中的恶意代码,恶意代码窃取用户数据并发送到攻击者的网站,或者冒充用户行为,调用目标网站接口执行攻击者指定的操作。
- 常见于通过 URL 传递参数的功能,如网站搜索、跳转等。由于需要用户主动打开恶意的 URL 才能生效,攻击者往往会结合多种手段诱导用户点击。
- 反射型 XSS 跟存储型 XSS 的区别是:存储型 XSS 的恶意代码存在数据库里,反射型 XSS 的恶意代码存在 URL 里。
3. DOM型XSS
- 攻击步骤:攻击者构造出特殊的URL,其中包含恶意代码,用户打开带有恶意代码的URL,用户浏览器打开带有恶意代码的URL,之后用户浏览器收到响应后解析执行,前端JS取出URL中的恶意代码并执行,恶意代码窃取用户数据并发送到攻击者的网站,或者冒充用户行为,调用目标网站接口执行攻击者指定的操作。
- DOM 型 XSS 跟前两种 XSS 的区别:DOM 型 XSS 攻击中,取出和执行恶意代码由浏览器端完成,属于前端 JavaScript 自身的安全漏洞,而其他两种 XSS 都属于服务端的安全漏洞。
三、 预防XSS攻击:
防止 HTML 中出现注入;防止 JavaScript 执行时,执行恶意代码。
1. 预防存储型和反射型 XSS 攻击:
- 改成纯前端渲染,把代码和数据分隔开。
- 对 HTML 做充分转义。
2. 预防 DOM 型 XSS 攻击:
- 在使用 .innerHTML、.outerHTML、document.write() 时要特别小心,不要把不可信的数据作为 HTML 插到页面上,而应尽量使用 .textContent、.setAttribute() 等。
- 如果用 Vue/React 技术栈,并且不使用 v-html/dangerouslySetInnerHTML 功能,就在前端 render 阶段避免 innerHTML、outerHTML 的 XSS 隐患。
3. 其他XSS攻击防范:
- Content Security Policy(CSP)
- 输入内容长度控制,增加XSS攻击的难度。
- HTTP-only Cookie: 禁止 JavaScript 读取某些敏感 Cookie,攻击者完成 XSS 注入后也无法窃取此 Cookie。
- 验证码:防止脚本冒充用户提交危险操作。
xss 是页面被注入了恶意的代码,例如: 1.在 HTML 中内嵌的文本中,恶意内容以 script 标签形成注入。 2.在内联的 JavaScript 中,拼接的数据突破了原本的限制 3. 在标签属性中,恶意内容包含引号,从而突破属性值的限制,注入其他属性或者标签。 4. 在标签的 href、src 等属性中,包含 javascript: 等可执行代码。 5.在onload 、onerror、onclick 等事件中,注入不受控制代码。 分类: 1.存储型 :先将恶意代码存储到数据库,当用户对数据库数据进行访问的时候,恶意代码被取出且拼接在 HTML 中返回给浏览器。用户浏览器接收到响应后解析执行,混在其中的恶意代码也被执行。 2.反射型: 攻击者构造出特殊的 URL,其中包含恶意代码。用户打开带有恶意代码的 URL 时,网站服务端将恶意代码从 URL 中取出,拼接在 HTML 中返回给浏览器。用户浏览器接收到响应后解析执行,混在其中的恶意代码也被执行。 3.DOM 型 XSS :攻击者构造出特殊的 URL,其中包含恶意代码。用户打开带有恶意代码的 URL。用户浏览器接收到响应后解析执行,前端 JavaScript 取出 URL 中的恶意代码并执行。
防范:
- 对用户输入进行校验,防止不安全的输入被写入网页或者数据库 2.转义html
- HTTP-only Cookie: 禁止 JavaScript 读取某些敏感 Cookie
XSS ( Cross Site Scripting ) 是指恶意攻击者利用网站没有对用户提交数据进行转义处理或者过滤不足的缺点,进而添加一些代码,嵌入到web页面中去。使别的用户访问都会执行相应的嵌入代码。
从而盗取用户资料、利用用户身份进行某种动作或者对访问者进行病毒侵害的一种攻击方式。
XSS攻击分类: 1、反射型:通过url参数直接注入。发出请求时,XSS代码出现在URL中,作为输入提交到服务器端,服务端解析后返回,XSS代码随响应内容一起传回给浏览器,最后浏览器执行XSS代码。这个过程像一次反射,故叫做反射型XSS。 2、存储型:存储型XSS会被保存到数据库,在其他用户访问(前端)到这条数据时,这个代码会在访问用户的浏览器端执行。
XSS防御: 对于XSS攻击来说,通常有两种方式来进行防御。 1、转义字符; 2、CSP安全内容策略:CSP 本质上就是建立白名单,开发者明确告诉浏览器哪些外部资源可以加载和执行。我们只需要配置规则,如何拦截是由浏览器自己实现的。我们可以通过这种方式来尽量减少 XSS 攻击。
通常可以通过两种方式来开启 CSP:
设置 HTTP Header 中的 Content-Security-Policy 设置 meta 标签的方式
- 什么是XSS攻击 XSS(Cross-Site Scripting,跨站脚本攻击)是一种代码注入攻击。攻击者在目标网站上注入恶意代码,当被攻击者登陆网站时就会执行这些恶意代码,这些脚本可以读取 cookie,session tokens,或者其它敏感的网站信息,对用户进行钓鱼欺诈,甚至发起蠕虫攻击等。 XSS 的本质是:恶意代码未经过滤,与网站正常的代码混在一起;浏览器无法分辨哪些脚本是可信的,导致恶意脚本被执行。由于直接在用户的终端执行,恶意代码能够直接获取用户的信息,利用这些信息冒充用户向网站发起攻击者定义的请求。
- XSS攻击分哪几类 1.反射型XSS 1.1 反射型描述:反射型 XSS 漏洞常见于通过 URL 传递参数的功能,如网站搜索、跳转等。由于需要用户主动打开恶意的 URL 才能生效,攻击者往往会结合多种手段诱导用户点击。 2.DOM型状XSS 2.1 DOM 型 XSS 攻击,实际上就是前端 JavaScript 代码不够严谨,把不可信的内容插入到了页面。在使用 .innerHTML、.outerHTML、.appendChild、document.write()等API时要特别小心,不要把不可信的数据作为 HTML 插到页面上,尽量使用 .innerText、.textContent、.setAttribute() 等。 3.储存型XSS 3.1 储存型XSS描述: 恶意脚本永久存储在目标服务器上。当浏览器请求数据时,脚本从服务器传回并执行,影响范围比反射型和DOM型XSS更大。存储型XSS攻击的原因仍然是没有做好数据过滤:前端提交数据至服务端时,没有做好过滤;服务端在接受到数据时,在存储之前,没有做过滤;前端从服务端请求到数据,没有过滤输出。
- 防止XSS攻击 1.防止反射型XSS: 对字符串进行编码,对url的查询参数进行转义后再输出到页面。 2.如何防范 DOM 型 XSS 攻击: 防范 DOM 型 XSS 攻击的核心就是对输入内容进行转义(DOM 中的内联事件监听器和链接跳转都能把字符串作为代码运行,需要对其内容进行检查)。 3.如何防范存储型XSS攻击: 3.1前端数据传递给服务器之前,先转义/过滤(防范不了抓包修改数据的情况) 3.2服务器接收到数据,在存储到数据库之前,进行转义/过滤 3.3前端接收到服务器传递过来的数据,在展示到页面前,先进行转义/过滤
**XSS攻击**又叫CSS (Cross Site Script) ,跨站脚本攻击。它指的是恶意攻击者往Web页面里插入恶意代码,当用户浏览该页之时,嵌入其中Web里面的恶意代码会被执行,从而达到读取 cookie,session tokens,或者其它敏感的网站信息,对用户进行钓鱼欺诈,甚至发起蠕虫攻击等的特殊目的。
XSS攻击分类
1. 反射型:
-
一般是攻击者通过特定手法(如电子邮件),诱使用户去访问一个包含恶意代码的 URL,当受害者点击这些专门设计的链接的时候,恶意代码会直接在受害者主机上的浏览器执行。
对于访问者而言是一次性的,具体表现在我们把我们的恶意脚本通过 URL 的方式传递给了服务器,而服务器则只是不加处理的把脚本“反射”回访问者的浏览器而使访问者的浏览器执行相应的脚本。反射型 XSS 的触发有后端的参与,要避免反射性 XSS,必须需要后端的协调,后端解析前端的数据时首先做相关的字串检测和转义处理。 此类 XSS 通常出现在网站的搜索栏、用户登录口等地方,常用来窃取客户端 Cookies 或进行钓鱼欺骗。
2.DOM-based型:
- 客户端的脚本程序可以动态地检查和修改页面内容,而不依赖于服务器端的数据。例如客户端如从 URL 中提取数据并在本地执行,如果用户在客户端输入的数据包含了恶意的 JavaScript 脚本,而这些脚本没有经过适当的过滤和消毒,那么应用程序就可能受到 DOM-based XSS 攻击。需要特别注意以下的用户输入源 document.URL、 location.hash、 location.search、 document.referrer 等。
3.存储型:
-
攻击者事先将恶意代码上传或储存到漏洞服务器中,只要受害者浏览包含此恶意代码的页面就会执行恶意代码。这就意味着只要访问了这个页面的访客,都有可能会执行这段恶意脚本,因此储存型XSS的危害会更大
-
存储型 XSS 一般出现在网站留言、评论、博客日志等交互处,恶意脚本存储到客户端或者服务端的数据库中。
防范XSS攻击
- 前端数据传递给服务器之前,先转义/过滤(防范不了抓包修改数据的情况)
- 服务器接收到数据,在存储到数据库之前,进行转义/过滤
- 前端接收到服务器传递过来的数据,在展示到页面前,先进行转义/过滤
什么是XSS攻击? XSS攻击:全称跨站脚本攻击。XSS是一种经常出现在web应用中的计算机安全漏洞,它允许恶意web用户将代码植入到提供给其它用户使用的界面中。比如这些代码包括HTML代码和客户端脚本。攻击者利用XSS漏洞旁路掉访问控制——例如同源策略。 这种类型的漏洞由于被骇客用来编写更大的网络钓鱼(Phishing)攻击而变为广为人知。对于跨站脚本攻击,骇客界共识是:跨站脚本哦攻击是新型的“缓冲区溢出攻击”,而javaScript是新型的"ShellCode"。 XSS攻击可以分为哪几类? XXS漏洞按照攻击手法的不同,有以下三种类型:
- 本地利用漏洞,这种漏洞存在于页面中客户端脚本自身。 2.反射式漏洞,这种漏洞和1有些类似,不同的是Web客户端使用Server端脚本生成页面为用户提供数据时,如果未经验证的用户数据被包含在页面中而未经HTML实体编码,客户端代码便能够注入到动态页面中。 3.存储式漏洞,该类型是应用最为广泛而且有可能影响到Web服务器自身安全的漏洞,骇客将攻击脚本上传到Web服务器上,使得所有访问该页面的用户都面临信息泄漏的可能,其中也包括了Web服务器的管理员。
如何防范XSS攻击? 1.前端数据传递给服务器之前,先转义/过滤(防范不了抓包修改数据的情况)。 2.服务器接收到数据,在存储到数据库之前,进行转义/过滤 3.前端接收到服务器传递过来的数据,在展示到页面钱,先进行转义/过滤
XSS攻击
XSS(Cross Site Script)又称跨站脚本攻击,主要是将恶意代码注入了页面中,浏览器在解析时执行了该恶意代码,从而导致用户cookie,session等敏感信息的被不发分子利用。
XSS攻击分类
XSS攻击主要分为3类,分别是:
-
反射型:反射型主要是攻击者伪造出恶意的url,诱导用户点击。恶意代码一般通过url参数注入,当用户点击url后,浏览器发出请求到服务器,服务器解析后将XSS代码随响应内容一起返回,浏览器解析响应内容,执行XSS代码。比如电子邮件。
-
存储型:存储型主要是攻击者将恶意代码提交到了数据库,用户浏览界面时,服务器从数据库取出带有恶意代码数据,返回给客户端,浏览器执行了恶意代码。比如论坛评论。
-
DOM型:DOM型不需要服务器的解析和参与,主要通过浏览器解析DOM。
防范XSS攻击
- 对html进行字符转义,比如“<"转义为"<",">"转义为"<gt"
- HTTP-only-Cookie: ,禁止js读取敏感数据。
- CSP(内容安全策略),在meta或者响应头中设置 Content-Security-Policy
// xss 攻击
// 什么是xss 攻击
// xss 即跨站脚本攻击 是一种常见的 web app 中的计算机安全漏洞 xss 通过在用户端注入的恶意可运行脚本 // 若服务器未对用户输入的内容做处理 直接将用户输入的内容输出到浏览器 则浏览器将会执行用户注入的恶意脚本
// XSS出现的原因?
// 在HTML中常用到字符实体,将常用到的字符实体没有进行转译,导致完整的标签出现,在可输入的文本框等某些区域内输入特定的某些标签导致代码被恶意篡改。
// 如何判定没有被XSS注入?
// 我在数据交互的地方输入什么 我输入的内容被真实的显示出来 这样我们可以认为 没有被注入Xss
// xss的分类
// 1.非持久型,也叫反射型XSS。通过GET和POST方法,向服务器端输入数据。用户输入的数据通常被放置在URL的query string中,或者是form 数据中。 // 如果服务器端对输入的数据不进行过滤,验证或编码,就直接将用户输入的信息直接呈现给客户,则可能会造成反射型XSS。
// 2.持久型,也叫存储型XSS。通常是因为服务器端将用户输入的恶意脚本没有通过验证就直接存储在数据库,并且每次通过调用数据库的方式,将数据呈现在浏览器上。 // 则该XSS跨站脚本攻击将一直存在。若其他用户访问该页面,则恶意脚本就会被触发,用于盗取其他用户的私人信息
// XSS的解决与防御措施?
// 服务器都会将JavaScript当做文本处理,在服务端整合进HTML文档中,在浏览器解析这些文本的过程,也就是XSS被执行的时候, // 所以主要的防御措施就是对任何用户提交到服务器上的文本都要经过编码或者转译。 原理可以参考这个 https://www.freebuf.com/articles/web/40520.html
XSS
叫做跨域脚本攻击,通过注入恶意代码来攻击目标网站
- 反射型:通过URL传参的方式来攻击
- DOM型:通过插入恶意HTML代码
- 持久型:保存再服务器上 防范 后端进行字符串转译
Xss全称为cross-site scripting (跨站脚本攻击),为了与css区分开来,故而称之为xss。xss攻击就是页面被注入了恶意代码。攻击者通过在目标网站上注入恶意代码,是指在用户浏览器中运行,利用这些恶意脚本,攻击者可以获取用户的敏感信息,如cookie,sessionid等,进而危害数据安全。 Xss的本质是:恶意代码未经过滤与正常代码混在一起,而浏览器是无法分出哪些是正常代码哪些是恶意代码的,从而发生xss攻击。 Xss可以分为三类:存储型,反射型,dom型。 其中存储型xss和反射型xss属于服务器端的安全漏洞,而dom型xss属于前端自身的安全漏洞。 预防xss攻击的方法:1、纯前端渲染,把代码和数据隔离开;2、对html进行充分转义。
XSS
定义
跨站脚本,是发生在目标用户的浏览器层面,当渲染DOM树的过程中发生了不在预期内执行的JS代码事,XSS就发生了。
XSS 有以下一些危害
- 挂马
- 盗取用户Cookie
- 钓鱼攻击,高级的钓鱼技巧
- 删除目标文章,恶意篡改数据,劫持web行为,渗透内网,爆发web2.0蠕虫等
分类
主要有三类: 反射型XSS,存储型XSS, DOM XSS.
- 反射型XSS
也叫非持久型XSS,是指发生请求时, XSS代码出现在请求的URL中,作为参数提交到服务器,服务器解析并响应。响应结果中包含XSS代码,最后浏览器解析并执行。
- 存储型XSS
服务器解析并响应。响应结果中包含XSS代码,最后浏览器解析并执行。最典型的例子是留言板XSS,用户提交一条包含XSS代码的留言存储到数据库,目标用户查看留言板时,那些留言的内容会从数据库查询出来并显示,浏览器发现有XSS代码,就当做正常的HTML与Js解析执行,于是触发了XSS攻击。
- DOM XSS
DOM XSS和反射型XSS、存储型XSS的差别在于DOM XSS的代码并不需要服务器参与,触发XSS靠的是浏览器端的DOM解析,完全是客户端的事情。
防范
xss 的预防主要是不要完全相信用户的输入
- 对于用户的输入(一些字符要进行转换), 比如
< < > > 空格 & & " "
等 - 对重要的cookie设置httpOnly, 防止客户端通过document.cookie读取cookie。服务端可以设置此字段。
response.setHeader("Set-cookie", "HTTPONly")
对于HTTPS ,还可以设置Secure 字段,对COOkie进行安全加密。
- 对用户上传的数据进行编码,解码,过滤等。服务端配置富文本标签和属性白名单。不应许出现其他标签(script, iframe, form).也就是过滤阶段
XSS 攻击
Cross-Site Scripting(跨站脚本攻击)简称 XSS,是一种代码注入攻击。攻击者通过在目标网站上注入恶意脚本,使之在用户的浏览器上运行。利用这些恶意脚本,攻击者可获取用户的敏感信息如 Cookie、SessionID 等,进而危害数据安全。
XSS 攻击分类
- 存储型 XSS
- 反射型 XSS
- DOM型 XSS
如何防范
-
httpOnly: 在 cookie 中设置 HttpOnly 属性后,js脚本将无法读取到 cookie 信息。
-
输入过滤: 一般是用于对于输入格式的检查,例如:邮箱,电话号码,用户名,密码……等,按照规定的格式输入。不仅仅是前端负责,后端也要做相同的过滤检查。因为攻击者完全可以绕过正常的输入流程,直接利用相关接口向服务器发送设置。
-
转义 HTML: 如果拼接 HTML 是必要的,就需要对于引号,尖括号,斜杠进行转义,但这还不是很完善.想对 HTML 模板各处插入点进行充分的转义,就需要采用合适的转义库。
什么是 XSS攻击
Cross-Site Scripting(跨站脚本攻击)简称 XSS,是一种代码注入攻击。攻击者通过在目标网站上注入恶意脚本,使之在用户的浏览器上运行。利用这些恶意脚本,攻击者可获取用户的敏感信息如 Cookie、SessionID 等,进而危害数据安全。 为了和 CSS 区分,这里把攻击的第一个字母改成了 X,于是叫做 XSS
XSS攻击类型
根据攻击的来源,XSS 攻击可分为存储型、反射型和 DOM 型三种。
类型 | 存储区 | 插入点 |
---|---|---|
存储型 XSS | 后端数据库 | HTML |
反射型 XSS | URL | HTML |
DOM 型 XSS | 后端数据库/前端存储/URL | 前端 JavaScript |
存储型 XSS 存储型 XSS 的攻击步骤:
- 攻击者将恶意代码提交到目标网站的数据库中。
- 用户打开目标网站时,网站服务端将恶意代码从数据库取出,拼接在 HTML 中返回给浏览器。
- 用户浏览器接收到响应后解析执行,混在其中的恶意代码也被执行。
- 恶意代码窃取用户数据并发送到攻击者的网站,或者冒充用户的行为,调用目标网站接口执行攻击者指定的操作。
这种攻击常见于带有用户保存数据的网站功能,如论坛发帖、商品评论、用户私信等。
反射型 XSS 反射型 XSS 的攻击步骤:
- 攻击者构造出特殊的 URL,其中包含恶意代码。
- 用户打开带有恶意代码的 URL 时,网站服务端将恶意代码从 URL 中取出,拼接在 HTML 中返回给浏览器。
- 用户浏览器接收到响应后解析执行,混在其中的恶意代码也被执行。
- 恶意代码窃取用户数据并发送到攻击者的网站,或者冒充用户的行为,调用目标网站接口执行攻击者指定的操作。
反射型 XSS 跟存储型 XSS 的区别是:存储型 XSS 的恶意代码存在数据库里,反射型 XSS 的恶意代码存在 URL 里。 反射型 XSS 漏洞常见于通过 URL 传递参数的功能,如网站搜索、跳转等。 由于需要用户主动打开恶意的 URL 才能生效,攻击者往往会结合多种手段诱导用户点击。 POST 的内容也可以触发反射型 XSS,只不过其触发条件比较苛刻(需要构造表单提交页面,并引导用户点击),所以非常少见。
DOM 型 XSS DOM 型 XSS 的攻击步骤:
- 攻击者构造出特殊的 URL,其中包含恶意代码。
- 用户打开带有恶意代码的 URL。
- 用户浏览器接收到响应后解析执行,前端 JavaScript 取出 URL 中的恶意代码并执行。
- 恶意代码窃取用户数据并发送到攻击者的网站,或者冒充用户的行为,调用目标网站接口执行攻击者指定的操作。
DOM 型 XSS 跟前两种 XSS 的区别:DOM 型 XSS 攻击中,取出和执行恶意代码由浏览器端完成,属于前端 JavaScript 自身的安全漏洞,而其他两种 XSS 都属于服务端的安全漏洞。
防范XSS攻击
输入过滤 在用户提交时,由前端过滤输入,然后提交到后端。这样做是否可行呢? 答案是不可行。一旦攻击者绕过前端过滤,直接构造请求,就可以提交恶意代码了。 输入侧过滤能够在某些情况下解决特定的 XSS 问题,但会引入很大的不确定性和乱码问题。在防范 XSS 攻击时应避免此类方法。 当然,对于明确的输入类型,例如数字、URL、电话号码、邮件地址等等内容,进行输入过滤还是必要的。 既然输入过滤并非完全可靠,我们就要通过“防止浏览器执行恶意代码”来防范 XSS。这部分分为两类:
防止 HTML 中出现注入。 防止 JavaScript 执行时,执行恶意代码。
预防存储型和反射型 XSS 攻击 存储型和反射型 XSS 都是在服务端取出恶意代码后,插入到响应 HTML 里的,攻击者刻意编写的“数据”被内嵌到“代码”中,被浏览器所执行。 预防这两种漏洞,有两种常见做法:
- 改成纯前端渲染,把代码和数据分隔开。
- 对 HTML 做充分转义。
预防 DOM 型 XSS 攻击 DOM 型 XSS 攻击,实际上就是网站前端 JavaScript 代码本身不够严谨,把不可信的数据当作代码执行了。 在使用 .innerHTML、.outerHTML、document.write() 时要特别小心,不要把不可信的数据作为 HTML 插到页面上,而应尽量使用 .textContent、.setAttribute() 等。 如果用 Vue/React 技术栈,并且不使用 v-html/dangerouslySetInnerHTML 功能,就在前端 render 阶段避免 innerHTML、outerHTML 的 XSS 隐患。 DOM 中的内联事件监听器,如 location、onclick、onerror、onload、onmouseover 等, 标签的 href 属性,JavaScript 的 eval()、setTimeout()、setInterval() 等,都能把字符串作为代码运行。如果不可信的数据拼接到字符串中传递给这些 API,很容易产生安全隐患,请务必避免。
还有更多的内容。。。(搬不动了);请看前端安全系列(一):如何防止XSS攻击?
什么事XSS?
XSS(跨站脚本攻击),它指的是恶意攻击者往Web页面里插入恶意html代码,当用户浏览该页之时,嵌入其中Web里面的html代码会被执行,从而达到恶意用户的特殊目的。
XSS攻击的分类
1.非持久型攻击: 非持久型xss攻击是一次性的,仅对当次的页面访问产生影响。非持久型xss攻击要求用户访问一个被攻击者篡改后的链接,用户访问该链接时,被植入的攻击脚本被用户游览器执行,从而达到攻击目的。 2.持久型攻击: 持久型xss,会把攻击者的数据存储在服务器端,攻击行为将伴随着攻击数据一直存在
也可以分成三类:
- 反射型:经过后端,不经过数据库
- 存储型:经过后端,经过数据库
- DOM:不经过后端,DOM—based XSS漏洞是基于文档对象模型Document Objeet Model,DOM)的一种漏洞,dom - xss是通过url传入参数去控制触发的。
如何防范
将用户输入的可能产生XSS攻击的尖括号,引号等进行转义(不要相信任何用户的输入,都要验证或转义)
XSS==Cross-Site Scripting(跨站脚本攻击)代码注入攻击,攻击中利用脚本获取用户信息。 有三种形式: 放射型:经过后端,不经过数据库。 存储型:经过后端,经过数据库。 DOM:不经过后端,直接通过输入代码注入脚本攻击。 防御: 对用户的输入进行转义和验证。.innerHTML、.outerHTML、document.write() 不能随便使用,
定义:Cross-Site Scripting(跨站脚本攻击)简称 XSS,是一种代码注入攻击。攻击者通过在目标网站上注入恶意脚本,使之在用户的浏览器上运行。利用这些恶意脚本,攻击者可获取用户的敏感信息如 Cookie、SessionID 等,进而危害数据安全。
分类:XSS 攻击可分为存储型、反射型和 DOM 型三种 措施: 禁止加载外域代码,防止复杂的攻击逻辑。 禁止外域提交,网站被攻击后,用户的数据不会泄露到外域。 禁止内联脚本执行(规则较严格,目前发现 GitHub 使用)。 禁止未授权的脚本执行(新特性,Google Map 移动版在使用)。 合理使用上报可以及时发现 XSS,利于尽快修复问题。 HTTP-only Cookie: 禁止 JavaScript 读取某些敏感 Cookie,攻击者完成 XSS 注入后也无法窃取此 Cookie。 验证码:防止脚本冒充用户提交危险操作。
1. XSS攻击
XSS(Cross-Site Scripting,跨站脚本攻击)是一种代码注入攻击。攻击者在目标网站上注入恶意代码,当被攻击者登陆网站时就会执行这些恶意代码,这些脚本可以读取 cookie,session tokens,或者其它敏感的网站信息,对用户进行钓鱼欺诈,甚至发起蠕虫攻击等。
XSS 的本质是:恶意代码未经过滤,与网站正常的代码混在一起;浏览器无法分辨哪些脚本是可信的,导致恶意脚本被执行。由于直接在用户的终端执行,恶意代码能够直接获取用户的信息,利用这些信息冒充用户向网站发起攻击者定义的请求。
XSS分类
根据攻击的来源,XSS攻击可以分为存储型(持久性)、反射型(非持久型)和DOM型三种。下面我们来详细了解一下这三种XSS攻击:
1.1 反射型XSS
当用户点击一个恶意链接,或者提交一个表单,或者进入一个恶意网站时,注入脚本进入被攻击者的网站。Web服务器将注入脚本,比如一个错误信息,搜索结果等,未进行过滤直接返回到用户的浏览器上。
反射型 XSS 的攻击步骤:
- 攻击者构造出特殊的
URL
,其中包含恶意代码。 - 用户打开带有恶意代码的
URL
时,网站服务端将恶意代码从URL
中取出,拼接在 HTML 中返回给浏览器。 - 用户浏览器接收到响应后解析执行,混在其中的恶意代码也被执行。
- 恶意代码窃取用户数据并发送到攻击者的网站,或者冒充用户的行为,调用目标网站接口执行攻击者指定的操作。
反射型 XSS 漏洞常见于通过 URL
传递参数的功能,如网站搜索、跳转等。由于需要用户主动打开恶意的 URL
才能生效,攻击者往往会结合多种手段诱导用户点击。
POST 的内容也可以触发反射型 XSS,只不过其触发条件比较苛刻(需要构造表单提交页面,并引导用户点击),所以非常少见。
如果不希望被前端拿到cookie,后端可以设置 httpOnly
(不过这不是 XSS攻击
的解决方案,只能降低受损范围)
如何防范反射型XSS攻击
对字符串进行编码。
对url的查询参数进行转义后再输出到页面。
app.get('/welcome', function(req, res) {
//对查询参数进行编码,避免反射型 XSS攻击
res.send(`${encodeURIComponent(req.query.type)}`);
});
1.2 DOM 型 XSS
DOM 型 XSS 攻击,实际上就是前端 JavaScript
代码不够严谨,把不可信的内容插入到了页面。在使用 .innerHTML
、.outerHTML
、.appendChild
、document.write()
等API时要特别小心,不要把不可信的数据作为 HTML 插到页面上,尽量使用 .innerText
、.textContent
、.setAttribute()
等。
DOM 型 XSS 的攻击步骤:
- 攻击者构造出特殊数据,其中包含恶意代码。
- 用户浏览器执行了恶意代码。
- 恶意代码窃取用户数据并发送到攻击者的网站,或者冒充用户的行为,调用目标网站接口执行攻击者指定的操作。
如何防范 DOM 型 XSS 攻击
防范 DOM 型 XSS 攻击的核心就是对输入内容进行转义(DOM 中的内联事件监听器和链接跳转都能把字符串作为代码运行,需要对其内容进行检查)。
1.对于url
链接(例如图片的src
属性),那么直接使用 encodeURIComponent
来转义。
2.非url
,我们可以这样进行编码:
function encodeHtml(str) {
return str.replace(/"/g, '"')
.replace(/'/g, ''')
.replace(/</g, '<')
.replace(/>/g, '>');
}
DOM 型 XSS 攻击中,取出和执行恶意代码由浏览器端完成,属于前端 JavaScript 自身的安全漏洞。
1.3 存储型XSS
恶意脚本永久存储在目标服务器上。当浏览器请求数据时,脚本从服务器传回并执行,影响范围比反射型和DOM型XSS更大。存储型XSS攻击的原因仍然是没有做好数据过滤:前端提交数据至服务端时,没有做好过滤;服务端在接受到数据时,在存储之前,没有做过滤;前端从服务端请求到数据,没有过滤输出。
存储型 XSS 的攻击步骤:
- 攻击者将恶意代码提交到目标网站的数据库中。
- 用户打开目标网站时,网站服务端将恶意代码从数据库取出,拼接在 HTML 中返回给浏览器。
- 用户浏览器接收到响应后解析执行,混在其中的恶意代码也被执行。
- 恶意代码窃取用户数据并发送到攻击者的网站,或者冒充用户的行为,调用目标网站接口执行攻击者指定的操作。
这种攻击常见于带有用户保存数据的网站功能,如论坛发帖、商品评论、用户私信等。
如何防范存储型XSS攻击:
- 前端数据传递给服务器之前,先转义/过滤(防范不了抓包修改数据的情况)
- 服务器接收到数据,在存储到数据库之前,进行转义/过滤
- 前端接收到服务器传递过来的数据,在展示到页面前,先进行转义/过滤
除了谨慎的转义,我们还需要其他一些手段来防范XSS攻击:
1.Content Security Policy
在服务端使用 HTTP的 Content-Security-Policy
头部来指定策略,或者在前端设置 meta
标签。
例如下面的配置只允许加载同域下的资源:
Content-Security-Policy: default-src 'self'
<meta http-equiv="Content-Security-Policy" content="form-action 'self';">
前端和服务端设置 CSP 的效果相同,但是meta
无法使用report
严格的 CSP 在 XSS 的防范中可以起到以下的作用:
- 禁止加载外域代码,防止复杂的攻击逻辑。
- 禁止外域提交,网站被攻击后,用户的数据不会泄露到外域。
- 禁止内联脚本执行(规则较严格,目前发现 GitHub 使用)。
- 禁止未授权的脚本执行(新特性,Google Map 移动版在使用)。
- 合理使用上报可以及时发现 XSS,利于尽快修复问题。
2.输入内容长度控制
对于不受信任的输入,都应该限定一个合理的长度。虽然无法完全防止 XSS 发生,但可以增加 XSS 攻击的难度。
3.输入内容限制
对于部分输入,可以限定不能包含特殊字符或者仅能输入数字等。
4.其他安全措施
- HTTP-only Cookie: 禁止 JavaScript 读取某些敏感 Cookie,攻击者完成 XSS 注入后也无法窃取此 Cookie。
- 验证码:防止脚本冒充用户提交危险操作。
什么是XSS攻击
XSS也称为跨脚本攻击,是一种恶意脚本,可以获取用户得cookie、token、session
XSS攻击的分类
-
反射型 反射型就是攻击者构造出恶意的url,其中包含了恶意代码,用户点击之后,服务端取出并且返回给到前端,然后在用户端执行了恶意代码,导致用户信息泄露等损失,如网站的搜索、跳转等
-
DOM型 DOM型指的就是攻击者输入恶意的代码前端没有做任何过滤被执行了,然后恶意代码发送到攻击者的网站,模拟用户的行为。
- 尽量少使用
appenChid
、innerHTML
、outerHTML
等标签,而使用innerText
、textContent
、setAttribute
- 前端过滤
url 可以使用encodeURIComponent
进行转义
encodeURIComponent('http://www.baidu.com')
"http%3A%2F%2Fwww.baidu.com"
非url
encodeHtml(str) {
if(str.length == 0) return "";
return str.replace(/"/g, '"')
.replace(/'/g, ''')
.replace(/</g, '<')
.replace(/>/g, '>')
.replace(/&/g,'&')
}
document.write("<script>alert('我是恶意代码')</script>")
document.write(encodeHtml("<script>alert('我是恶意代码')</script>"))
当然这是一个简单的demo,我们常使用Angular
、Vue
、React
框架都帮我们做好了
比如Angular
import { DomSanitizer } from '@angular/platform-browser';
export class myPage1{
constructor(private sanitizer: DomSanitizer) {
}
onInit():void{
this.html = this.sanitizer.bypassSecurityTrustHtml('html代码');
// this.sanitizer 还有很多方法
}
}
Vue
的 v-text
、v-html
- 储存型 储存型和反射型很相似,区别在于储存型是存在数据当中,而反射型是存在URL当中,常见的话就是商品的评论、发博文等
当然实际情况会跟更复杂,通常对于发生与用户交付的行为,比如input的输入,前端一定要做好校验,限制用户输入的长度、格式等
小伙伴说的 HTTP-only Cookie
,禁止读取敏感cookie。 第一次看见,长见识了
- Cross Site Scripting 跨站脚本攻击
- 分类
- 反射型 XSS
- 当用户点击一个恶意链接,或者提交一个表单,或者进入一个恶意网站时,注入脚本进入被攻击者的网站。Web 服务器将注入脚本,比如一个错误信息,搜索结果等 返回到用户的浏览器上。浏览器会执行这段脚本,因为,它认为这个响应来自可信任的服务器。
- 存储型 XSS
- 注入型脚本永久存储在目标服务器上。当浏览器请求数据时,脚本从服务器上传回并执行
- DOM 型 XSS
- 被执行的恶意脚本会修改页面脚本结构
- 反射型 XSS
- 防范
- 输入过滤
- 转义 HTML
- 在 cookie 中设置 HttpOnly 属性
XSS
介绍
* Cross-Site Scripting(跨站脚本攻击),是一种代码注入攻击。为了区别 CSS,改成 XSS。
* 本质:恶意代码混入正常代码中,浏览器无法分辨,导致恶意代码被执行。
分类
* 存储型
* 将恶意代码提交到网站的数据库中,当用户打开网站时,服务器端取出恶意代码拼接在 HTML 中,用户浏览器解析执行时,恶意代码也被执行。
* 常见于留言、评价等。
* 反射型
* 将恶意代码放在 URL 中,网站服务器从 URL 中获取数据将获取到恶意代码拼接在 HTML 中,用户浏览器解析执行时,恶意代码也被执行。
* 常见于网站搜索、跳转等。
* DOM型
* 将恶意代码放在 URL 中,前端 JS 取出 URL 中的恶意代码并执行。
* 区别
* 存储型为持久型攻击;反射型与 DOM 型为非持久型攻击。
* 存储型与反射型为服务器端安全漏洞;DOM 型为前端安全漏洞。
预防
* 存储型与反射型
* 改为纯前端渲染;
* 充分进行转义;
* DOM型
* 使用 .innerHTML、.outerHTML、document.write() 时,不要把不可信数据作为 HTML 插入页面;
* DOM 中的内联事件监听器,如 location、onclick、onerror、onload、onmouseover 等,<a> 标签的 href 属性,JavaScript 的 eval()、setTimeout()、setInterval() 等,都能把字符串作为代码运行。避免传入包含不可信数据的字符串。
* 其他
* 输入内容长度控制;
* Cookie 使用 http-only;
* 增加验证码验证。
xss是一种代码注入攻击,通过向网站注入恶意的HTML代码; 分类: 1:反射型 => 通过在请求地址上加入恶心的HTML代码 2:dom型 => 通过一些api向网站注入一些恶意的HTML代码 3:持久性 => 攻击者通过把代码提交到后台数据库中;当用户下次打开的时候就会从后台接收这些恶意的代码 防止方案:转义字符的设置、可以设置白名单如http-only的设置
XSS: Cross-Site Scripting(跨站脚本攻击)简称 XSS,是一种代码注入攻击。攻击者通过在目标网站上注入恶意脚本,使之在用户的浏览器上运行。利用这些恶意脚本,攻击者可获取用户的敏感信息如 Cookie、SessionID 等,进而危害数据安全。 XSS 的本质是:恶意代码未经过滤,与网站正常的代码混在一起;浏览器无法分辨哪些脚本是可信的,导致恶意脚本被执行。 而由于直接在用户的终端执行,恶意代码能够直接获取用户的信息,或者利用这些信息冒充用户向网站发起攻击者定义的请求。在部分情况下,由于输入的限制,注入的恶意脚本比较短。但可以通过引入外部的脚本,并由浏览器执行,来完成比较复杂的攻击策略 XSS分类: XSS 攻击可分为 存储型、反射型和 DOM 型三种。 存储型 XSS 存储型 XSS 的攻击步骤: 1.攻击者将恶意代码提交到目标网站的数据库中。 2.用户打开目标网站时,网站服务端将恶意代码从数据库取出,拼接在 HTML 中返回给浏览器。 3.用户浏览器接收到响应后解析执行,混在其中的恶意代码也被执行。 4.恶意代码窃取用户数据并发送到攻击者的网站,或者冒充用户的行为,调用目标网站接口执行攻击者指定的操作。 这种攻击常见于带有用户保存数据的网站功能,如论坛发帖、商品评论、用户私信等。 反射型 XSS 反射型 XSS 的攻击步骤: 1.攻击者构造出特殊的 URL,其中包含恶意代码。 2.用户打开带有恶意代码的 URL 时,网站服务端将恶意代码从 URL 中取出,拼接在 HTML 中返回给浏览器。 3.用户浏览器接收到响应后解析执行,混在其中的恶意代码也被执行。 4.恶意代码窃取用户数据并发送到攻击者的网站,或者冒充用户的行为,调用目标网站接口执行攻击者指定的操作。 反射型 XSS 跟存储型 XSS 的区别是:存储型 XSS 的恶意代码存在数据库里,反射型 XSS 的恶意代码存在 URL 里。 反射型 XSS 漏洞常见于通过 URL 传递参数的功能,如网站搜索、跳转等。 由于需要用户主动打开恶意的 URL 才能生效,攻击者往往会结合多种手段诱导用户点击。 POST 的内容也可以触发反射型 XSS,只不过其触发条件比较苛刻(需要构造表单提交页面,并引导用户点击),所以非常少见。 DOM 型 XSS DOM 型 XSS 的攻击步骤: 1.攻击者构造出特殊的 URL,其中包含恶意代码。 2.用户打开带有恶意代码的 URL。 3.用户浏览器接收到响应后解析执行,前端 JavaScript 取出 URL 中的恶意代码并执行。 4.恶意代码窃取用户数据并发送到攻击者的网站,或者冒充用户的行为,调用目标网站接口执行攻击者指定的操作。 DOM 型 XSS 跟前两种 XSS 的区别:DOM 型 XSS 攻击中,取出和执行恶意代码由浏览器端完成,属于前端 JavaScript 自身的安全漏洞,而其他两种 XSS 都属于服务端的安全漏洞。
防范XSS的方法:
- 输入过滤;
- 预防存储型和反射型 XSS 攻击;
- 纯前端渲染;
- 转义 HTML;
参考相关文章:https://www.freebuf.com/articles/web/185654.html(棒)
代码注入, XSS攻击又称CSS,全称Cross Site Script (跨站脚本攻击),其原理是攻击者向有XSS漏洞的网站中输入恶意的 HTML 代码,当用户浏览该网站时,这段 HTML 代码会自动执行,从而达到攻击的目的。XSS 攻击类似于 SQL 注入攻击,SQL注入攻击中以SQL语句作为用户输入,从而达到查询/修改/删除数据的目的,而在xss攻击中,通过插入恶意脚本,实现对用户游览器的控制,获取用户的一些信息。 XSS是 Web 程序中常见的漏洞,XSS 属于被动式且用于客户端的攻击方式。 攻击类型 xss攻击可以分成两种类型:一种是非持久型XSS攻击 一种是持久型XSS攻击 非持久型xss攻击:顾名思义,非持久型xss攻击是一次性的,仅对当次的页面访问产生影响。非持久型xss攻击要求用户访问一个被攻击者篡改后的链接,用户访问该链接时,被植入的攻击脚本被用户游览器执行,从而达到攻击目的。 持久型xss攻击:持久型xss,会把攻击者的数据存储在服务器端,攻击行为将伴随着攻击数据一直存在。 也可以分成三类: 反射型:经过后端,不经过数据库 存储型:经过后端,经过数据库 DOM:不经过后端,DOM- xss是通过url传入参数去控制触发的。 防范XSS攻击: 1.利用 php htmlentities()函数对传入参数的非法的 HTML 代码包括单双引号等进行转义。但是,中文情况下, htmlentities() 却会转化所有的 html 代码,连同里面的它无法识别的中文字符也给转化了。 2.利用 php htmlspecialchars()函数对传入参数的非法的 HTML 代码包括单双引号等进行转义,需要注意的是第二个参数默认是 ENT_COMPAT,函数默认只是转化双引号("),不对单引号(')做转义。更多的时候要加上第二个参数,应该这样用 : htmlspecialchars($string,ENT_QUOTES)对单双引号都进行转义。如果需要不转化任何的引号第二个参数使用ENT_NOQUOTES。 3.通过正则表达式过滤传入参数的html标签来防范XSS攻击 4、把用户的数据进行转义,不相信用户的操作
吐个小嘈,妈的,翻墙翻不出去了,折腾了好一会,委屈哭。
xss
直接上谷歌上收的第一个链接点进去。xss是Cross-site Scripting的缩写。 这是一种攻击的方式,如果你想了解所有的攻击,请点击所有的攻击 相信我,如果你有足够的时间再去看,因为我发现里面有13个子目录的攻击,太可怕了! xss是c开头子目录里面的一种。
xss是什么?
跨站点脚本(xss)攻击时一种注入类型,其中恶意代码被注入到其他良心和可信赖的网站中。当攻击者使用Web应用程序将恶意代码-通常以浏览器端脚本的形式发送给不同的终端用户,就会发生xss攻击。允许这些攻击成功的缺陷时非常容易传播的,而且发生在web应用程序在其输出的使用来自用户的输入而无需验证或者编码的地方。
一个攻击者可以使用XSS来发送恶毒的代码给毫无戒心的用户。终端的用户没办法知道这个脚本是否应该被信任,并且会去执行这个脚本。因为它认为这个脚本来自一个信任的源,恶毒的脚本可以活着任何的cookies,session tokens,或者其他被浏览器保存以及在这个网站是使用的敏感的信息。这些脚本甚至可以重写HTML网页的内容。有关不同类型的XSS漏洞的更多详细信息,请看:Types of Cross-Site Scripting.
什么时候发生
- 数据通过不受信任的来源进入Web应用程序,最常见的是Web请求。
- 数据包含在动态内容中,该动态内容在未经过恶意内容验证的情况下发送给web用户。 恶毒的内容发送到浏览器通常通过脚本的片段,但是也可能包含HTML,FLASH,或者任何其他会让浏览器执行的代码的类型。基于XSS的各种攻击几乎是无限的,但它们通常包括传输私有数据,像cookie或其他会话信息一样被攻击者控制,将受害者重定向到攻击者控制的Web内容,或者在易受攻击的站点的幌子下在用户的机器上执行其他恶意操作。
种类
XSS攻击可以简单的被分类称两种类型: stored and reflected.还有第三个,不太知名的XSS被称为基于DOM的XSS,这个会单独的讨论。
- Stored XSS Attacks: 存储攻击是指注入的脚本永久存储在目标服务器上的攻击,例如数据库,消息论坛,访问者日志,注释字段等。受害者会从服务器获取到恶毒的脚本,当服务器请求了存储的信息。存储的XSS有时候也称之为持久性XSS或者Type-1 XSS.
- Reflected XSS Attacks:反射攻击是指注入的脚本从Web服务器反射出来的攻击,例如:错误消息,搜索结果或包含作为请求的一部分发送到服务器的部分或全部输入的任何其他请求。反射的攻击通过另一条路径传递给受害者,例如在电子邮件中或其他一些网站上。当用户被欺骗点击恶意链接,提交特制表单,甚至只是浏览恶意网站时,注入的代码会传播到易受攻击的网站,这会将攻击反射回用户的浏览器。然后浏览器执行代码,因为它来自“可信”服务器。发射攻击有时候也称之为非持久性 XSS或者 Type-2 XSS.
- 其他类型的XSS漏洞 基于DOM的XSS是Client XSS的子集。
攻击后果
XSS攻击的后果是一样,无论是哪一种。区分就是有效负载如何到达服务器。不要认为“只读”或者“”宣传品“网站不容易收到严重反射的XSS攻击。XSS会给终端用户带来各种问题,从烦恼到账户完全泄漏。最严重的XSS攻击涉及披露用户的会话cookie,允许攻击者劫持用户的会话并接管帐户。其他破坏性攻击包括最终用户文件的泄露,特洛伊木马程序的安装,将用户重定向到其他页面或站点,或修改内容的呈现。
如何确定你是否易攻击
XSS可能很难从一个web应用上识别并且一处。最好的办法找到缺陷就是最代码执行安全性检查,并搜索HTTP请求的输入可能对HTML输出的所有位置。请注意可以使用各种不同的HTML标记来传输脚本。Nessus,Nikto和其他一些可用的工具可以帮助扫描网站中的这些缺陷,但只能检查表面。如果网站的某个部分容易受到攻击,那么很可能还存在其他问题。
如何防范 参考地址
- 对输入过滤
- 防止HTML中出现注入
- 防止JS执行时,执行恶意代码
- 预防存储型和反射型攻击
- 改成纯前端渲染,把数据和代码风格开
- 浏览器先加载一个静态 HTML,此 HTML 中不包含任何跟业务相关的数据。
- 然后浏览器执行 HTML 中的 JavaScript。
- JavaScript 通过 Ajax 加载业务数据,调用 DOM API 更新到页面上。
- 对HTML做充分转义 如果拼接 HTML 是必要的,就需要采用合适的转义库,对 HTML 模板各处插入点进行充分的转义。 常用的模板引擎,如 doT.js、ejs、FreeMarker 等,对于 HTML 转义通常只有一个规则,就是把 & < > " ' / 这几个字符转义掉,确实能起到一定的 XSS 防护作用,但并不完善。
- 改成纯前端渲染,把数据和代码风格开
- 预防 DOM 型 XSS 攻击
DOM 型 XSS 攻击,实际上就是网站前端 JavaScript 代码本身不够严谨,把不可信的数据当作代码执行了。
在使用 .innerHTML、.outerHTML、document.write() 时要特别小心,不要把不可信的数据作为 HTML 插到页面上,而应尽量使用 .textContent、.setAttribute() 等。
如果用 Vue/React 技术栈,并且不使用 v-html/dangerouslySetInnerHTML 功能,就在前端 render 阶段避免 innerHTML、outerHTML 的 XSS 隐患。
DOM 中的内联事件监听器,如 location、onclick、onerror、onload、onmouseover 等,a标签的 href 属性,JavaScript 的 eval()、setTimeout()、setInterval() 等,都能把字符串作为代码运行。如果不可信的数据拼接到字符串中传递给这些 API,很容易产生安全隐患,请务必避免。
什么是XSS攻击,XSS攻击可以分为哪几类?如何防范XSS攻击?
XSS定义
跨站脚本(英语:Cross-site scripting,通常简称为:XSS)是一种网站应用程序的安全漏洞攻击,是代码注入的一种。它允许恶意用户将代码注入到网页上,其他用户在观看网页时就会受到影响。这类攻击通常包含了HTML以及用户端脚本语言。
XSS攻击通常指的是通过利用网页开发时留下的漏洞,通过巧妙的方法注入恶意指令代码到网页,使用户加载并执行攻击者恶意制造的网页程序。这些恶意网页程序通常是JavaScript,但实际上也可以包括Java,VBScript,ActiveX,Flash或者甚至是普通的HTML。攻击成功后,攻击者可能得到更高的权限(如执行一些操作)、私密网页内容、会话和cookie等各种内容。
背景
当网景(Netscape)最初推出JavaScript语言时,他们也察觉到准许网页服务器发送可执行的代码给一个浏览器的安全风险(即使仅是在一个浏览器的沙盒里)。它所造成的一个关键的问题在于用户同时打开多个浏览器视窗时,在某些例子里,网页里的片断代码被允许从另一个网页或对象取出数据,而因为恶意的网站可以用这个方法来尝试窃取机密信息,所以在某些情形,这应是完全被禁止的。为了解决这个问题,浏览器采用了同源决策——仅允许来自相同域名系统和使用相同协议的对象与网页之间的任何交互。这样一来,恶意的网站便无法借由JavaScript在另一个浏览器窃取机密数据。此后,为了保护用户免受恶意的危害,其他的浏览器与伺服端指令语言采用了类似的访问控制决策。
XSS漏洞可以追溯到1990年代。大量的网站曾遭受XSS漏洞攻击或被发现此类漏洞 。研究表明,最近几年XSS已经超过缓冲区溢出成为最流行的攻击方式,有68%的网站可能遭受此类攻击。根据开放网页应用安全计划(Open Web Application Security Project)公布的2010年统计数据,在Web安全威胁前10位中,XSS排名第2,仅次于代码注入(Injection)。
检测方法
通常有一些方式可以测试网站是否有正确处理特殊字符:
-
><script>alert(document.cookie)</script>
-
='><script>alert(document.cookie)</script>
-
"><script>alert(document.cookie)</script>
-
<script>alert(document.cookie)</script>
-
<script>alert (vulnerable)</script>
-
%3Cscript%3Ealert('XSS')%3C/script%3E
-
<script>alert('XSS')</script>
-
<img src="javascript:alert('XSS')">
-
<img src="http://888.888.com/999.png" onerror="alert('XSS')">
-
<div style="height:expression(alert('XSS'),1)"></div>(这个仅于IE7(含)之前有效)
攻击手段与目的
攻击者使被攻击者在浏览器中执行脚本后,如果需要收集来自被攻击者的数据(如cookie或其他敏感信息),可以自行架设一个网站,让被攻击者通过JavaScript等方式把收集好的数据作为参数提交,随后以数据库等形式记录在攻击者自己的服务器上。
常用的XSS攻击手段和目的有:
-
盗用cookie,获取敏感信息。
-
利用植入Flash,通过crossdomain权限设置进一步获取更高权限;或者利用Java等得到类似的操作。
-
利用iframe、frame、XMLHttpRequest或上述Flash等方式,以(被攻击)用户的身份执行一些管理动作,或执行一些一般的如发微博、加好友、发私信等操作。
-
利用可被攻击的域受到其他域信任的特点,以受信任来源的身份请求一些平时不允许的操作,如进行不当的投票活动。
-
在访问量极大的一些页面上的XSS可以攻击一些小型网站,实现DDoS攻击的效果。
漏洞的防御和利用
过滤特殊字符
避免XSS的方法之一主要是将用户所提供的内容进行过滤,许多语言都有提供对HTML的过滤:
-
PHP的htmlentities()或是htmlspecialchars()。
-
Python的cgi.escape()。
-
ASP的Server.HTMLEncode()。
-
ASP.NET的Server.HtmlEncode()或功能更强的Microsoft Anti-Cross Site Scripting Library
-
Java的xssprotect (Open Source Library)。
-
Node.js的node-validator。
使用HTTP头指定类型
很多时候可以使用HTTP头指定内容的类型,使得输出的内容避免被作为HTML解析。如在PHP语言中使用以下代码:
<?php
header('Content-Type: text/javascript; charset=utf-8');
?>
即可强行指定输出内容为文本/JavaScript脚本(顺便指定了内容编码),而非可以引发攻击的HTML。
也可以设置 HTML 的 <meta>
标签:
<meta http-equiv="content-security-policy">
"content-security-policy" 内容安全策略 它允许页面作者定义当前页的 内容策略。 内容策略主要指定允许的服务器源和脚本端点,这有助于防止跨站点脚本攻击。