Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

什么是XSS攻击,XSS攻击可以分为哪几类?如何防范XSS攻击? #18

Open
YvetteLau opened this issue Jun 3, 2019 · 40 comments

Comments

@YvetteLau
Copy link
Owner

No description provided.

@yangjianwei1223
Copy link

XSS攻击又称CSS,全称Cross Site Script  (跨站脚本攻击),其原理是攻击者向有XSS漏洞的网站中输入恶意的 HTML 代码,当用户浏览该网站时,这段 HTML 代码会自动执行,从而达到攻击的目的。

xss攻击可以分成两种类型:一种是非持久型XSS攻击 一种是持久型XSS攻击。

通过正则表达式过滤传入参数的html标签来防范XSS攻击。

@shenanheng
Copy link

xss是一种代码注入攻击,通过向网站注入恶意的HTML代码;
分类:
a:反射型 => 通过在请求地址上加入恶心的HTML代码
b:dom型 => 通过一些api向网站注入一些恶意的HTML代码
c:持久性 => 攻击者通过把代码提交到后台数据库中;当用户下次打开的时候就会从后台接收这些恶意的代码

防范:
a:前端通过转义来进行防范以及过滤
b:主要是通过后台来进行防卫

@chaoZhang9527
Copy link

xss只记得叫跨站脚本攻击,分几种类型还不清楚,防范的话暂时只知道一些比如用innerHtml的地方可以使用innerText防范一下,其他的了解的就比较少了,多看看大佬们怎么回答的把

@AILINGANGEL
Copy link

什么是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 '&lt;';
            case '>':
                return '&gt;';
            case '&':
                return '&amp;';
            case ' ':
                return '&nbsp;';
            case '"':
                return '&quot;';
        }
    });
}
  • 对用户的输入使用innerText或者textContent进行设置,而不是使用innerHTML或者outerHTML进行设置
  • 服务器端设置cookie为httpOnly让前端无法通过js获取到用户的cookie
  • 关键请求使用验证码,比如转账请求,避免恶意脚本发送这些关键请求

@HappyChenchen
Copy link

HappyChenchen commented Jun 3, 2019

一、 什么是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。
  • 验证码:防止脚本冒充用户提交危险操作。

@sinaine
Copy link

sinaine commented Jun 3, 2019

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 中的恶意代码并执行。

防范:

  1. 对用户输入进行校验,防止不安全的输入被写入网页或者数据库
    2.转义html
  2. HTTP-only Cookie: 禁止 JavaScript 读取某些敏感 Cookie

@lianbo666
Copy link

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 标签的方式

@tianyuandsb
Copy link

  1. 什么是XSS攻击
    XSS(Cross-Site Scripting,跨站脚本攻击)是一种代码注入攻击。攻击者在目标网站上注入恶意代码,当被攻击者登陆网站时就会执行这些恶意代码,这些脚本可以读取 cookie,session tokens,或者其它敏感的网站信息,对用户进行钓鱼欺诈,甚至发起蠕虫攻击等。
    XSS 的本质是:恶意代码未经过滤,与网站正常的代码混在一起;浏览器无法分辨哪些脚本是可信的,导致恶意脚本被执行。由于直接在用户的终端执行,恶意代码能够直接获取用户的信息,利用这些信息冒充用户向网站发起攻击者定义的请求。
  2. 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攻击的原因仍然是没有做好数据过滤:前端提交数据至服务端时,没有做好过滤;服务端在接受到数据时,在存储之前,没有做过滤;前端从服务端请求到数据,没有过滤输出。
  3. 防止XSS攻击
    1.防止反射型XSS: 对字符串进行编码,对url的查询参数进行转义后再输出到页面。
    2.如何防范 DOM 型 XSS 攻击: 防范 DOM 型 XSS 攻击的核心就是对输入内容进行转义(DOM 中的内联事件监听器和链接跳转都能把字符串作为代码运行,需要对其内容进行检查)。
    3.如何防范存储型XSS攻击:
    3.1前端数据传递给服务器之前,先转义/过滤(防范不了抓包修改数据的情况)
    3.2服务器接收到数据,在存储到数据库之前,进行转义/过滤
    3.3前端接收到服务器传递过来的数据,在展示到页面前,先进行转义/过滤

@gaoluona
Copy link

gaoluona commented Jun 3, 2019

**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攻击

  1. 前端数据传递给服务器之前,先转义/过滤(防范不了抓包修改数据的情况)
  2. 服务器接收到数据,在存储到数据库之前,进行转义/过滤
  3. 前端接收到服务器传递过来的数据,在展示到页面前,先进行转义/过滤

@Cain-kz
Copy link

Cain-kz commented Jun 3, 2019

什么是XSS攻击?
XSS攻击:全称跨站脚本攻击。XSS是一种经常出现在web应用中的计算机安全漏洞,它允许恶意web用户将代码植入到提供给其它用户使用的界面中。比如这些代码包括HTML代码和客户端脚本。攻击者利用XSS漏洞旁路掉访问控制——例如同源策略。 这种类型的漏洞由于被骇客用来编写更大的网络钓鱼(Phishing)攻击而变为广为人知。对于跨站脚本攻击,骇客界共识是:跨站脚本哦攻击是新型的“缓冲区溢出攻击”,而javaScript是新型的"ShellCode"。
XSS攻击可以分为哪几类?
XXS漏洞按照攻击手法的不同,有以下三种类型:

  1. 本地利用漏洞,这种漏洞存在于页面中客户端脚本自身。
    2.反射式漏洞,这种漏洞和1有些类似,不同的是Web客户端使用Server端脚本生成页面为用户提供数据时,如果未经验证的用户数据被包含在页面中而未经HTML实体编码,客户端代码便能够注入到动态页面中。
    3.存储式漏洞,该类型是应用最为广泛而且有可能影响到Web服务器自身安全的漏洞,骇客将攻击脚本上传到Web服务器上,使得所有访问该页面的用户都面临信息泄漏的可能,其中也包括了Web服务器的管理员。

如何防范XSS攻击?
1.前端数据传递给服务器之前,先转义/过滤(防范不了抓包修改数据的情况)。
2.服务器接收到数据,在存储到数据库之前,进行转义/过滤
3.前端接收到服务器传递过来的数据,在展示到页面钱,先进行转义/过滤

@riluocanyang
Copy link

XSS攻击

XSS(Cross Site Script)又称跨站脚本攻击,主要是将恶意代码注入了页面中,浏览器在解析时执行了该恶意代码,从而导致用户cookie,session等敏感信息的被不发分子利用。

XSS攻击分类

XSS攻击主要分为3类,分别是:

  1. 反射型:反射型主要是攻击者伪造出恶意的url,诱导用户点击。恶意代码一般通过url参数注入,当用户点击url后,浏览器发出请求到服务器,服务器解析后将XSS代码随响应内容一起返回,浏览器解析响应内容,执行XSS代码。比如电子邮件。

  2. 存储型:存储型主要是攻击者将恶意代码提交到了数据库,用户浏览界面时,服务器从数据库取出带有恶意代码数据,返回给客户端,浏览器执行了恶意代码。比如论坛评论。

  3. DOM型:DOM型不需要服务器的解析和参与,主要通过浏览器解析DOM。

防范XSS攻击

  1. 对html进行字符转义,比如“<"转义为"&lt",">"转义为"<gt"
  2. HTTP-only-Cookie: ,禁止js读取敏感数据。
  3. CSP(内容安全策略),在meta或者响应头中设置 Content-Security-Policy

@zhangxianhui
Copy link

// 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

@CCZX
Copy link

CCZX commented Jun 3, 2019

XSS叫做跨域脚本攻击,通过注入恶意代码来攻击目标网站

  • 反射型:通过URL传参的方式来攻击
  • DOM型:通过插入恶意HTML代码
  • 持久型:保存再服务器上
    防范
    后端进行字符串转译

@yangyiqiqia
Copy link

Xss全称为cross-site scripting (跨站脚本攻击),为了与css区分开来,故而称之为xss。xss攻击就是页面被注入了恶意代码。攻击者通过在目标网站上注入恶意代码,是指在用户浏览器中运行,利用这些恶意脚本,攻击者可以获取用户的敏感信息,如cookie,sessionid等,进而危害数据安全。
Xss的本质是:恶意代码未经过滤与正常代码混在一起,而浏览器是无法分出哪些是正常代码哪些是恶意代码的,从而发生xss攻击。
Xss可以分为三类:存储型,反射型,dom型。
其中存储型xss和反射型xss属于服务器端的安全漏洞,而dom型xss属于前端自身的安全漏洞。
预防xss攻击的方法:1、纯前端渲染,把代码和数据隔离开;2、对html进行充分转义。

@yelin1994
Copy link

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 的预防主要是不要完全相信用户的输入

  • 对于用户的输入(一些字符要进行转换), 比如< &lt; > &gt; 空格 &nbsp;& &amp; " &quot;
  • 对重要的cookie设置httpOnly, 防止客户端通过document.cookie读取cookie。服务端可以设置此字段。
response.setHeader("Set-cookie", "HTTPONly")

对于HTTPS ,还可以设置Secure 字段,对COOkie进行安全加密。

  • 对用户上传的数据进行编码,解码,过滤等。服务端配置富文本标签和属性白名单。不应许出现其他标签(script, iframe, form).也就是过滤阶段

@huangsiyuan2015
Copy link

XSS 攻击

Cross-Site Scripting(跨站脚本攻击)简称 XSS,是一种代码注入攻击。攻击者通过在目标网站上注入恶意脚本,使之在用户的浏览器上运行。利用这些恶意脚本,攻击者可获取用户的敏感信息如 Cookie、SessionID 等,进而危害数据安全。

XSS 攻击分类

  • 存储型 XSS
  • 反射型 XSS
  • DOM型 XSS

如何防范

  • httpOnly: 在 cookie 中设置 HttpOnly 属性后,js脚本将无法读取到 cookie 信息。

  • 输入过滤: 一般是用于对于输入格式的检查,例如:邮箱,电话号码,用户名,密码……等,按照规定的格式输入。不仅仅是前端负责,后端也要做相同的过滤检查。因为攻击者完全可以绕过正常的输入流程,直接利用相关接口向服务器发送设置。

  • 转义 HTML: 如果拼接 HTML 是必要的,就需要对于引号,尖括号,斜杠进行转义,但这还不是很完善.想对 HTML 模板各处插入点进行充分的转义,就需要采用合适的转义库。

@lqzo
Copy link

lqzo commented Jun 3, 2019

什么是 XSS攻击

Cross-Site Scripting(跨站脚本攻击)简称 XSS,是一种代码注入攻击。攻击者通过在目标网站上注入恶意脚本,使之在用户的浏览器上运行。利用这些恶意脚本,攻击者可获取用户的敏感信息如 Cookie、SessionID 等,进而危害数据安全。
为了和 CSS 区分,这里把攻击的第一个字母改成了 X,于是叫做 XSS

XSS攻击类型

根据攻击的来源,XSS 攻击可分为存储型、反射型和 DOM 型三种。

类型 存储区 插入点
存储型 XSS 后端数据库 HTML
反射型 XSS URL HTML
DOM 型 XSS 后端数据库/前端存储/URL 前端 JavaScript

存储型 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 问题,但会引入很大的不确定性和乱码问题。在防范 XSS 攻击时应避免此类方法。
当然,对于明确的输入类型,例如数字、URL、电话号码、邮件地址等等内容,进行输入过滤还是必要的。
既然输入过滤并非完全可靠,我们就要通过“防止浏览器执行恶意代码”来防范 XSS。这部分分为两类:

防止 HTML 中出现注入。
防止 JavaScript 执行时,执行恶意代码。

预防存储型和反射型 XSS 攻击
存储型和反射型 XSS 都是在服务端取出恶意代码后,插入到响应 HTML 里的,攻击者刻意编写的“数据”被内嵌到“代码”中,被浏览器所执行。
预防这两种漏洞,有两种常见做法:

  1. 改成纯前端渲染,把代码和数据分隔开。
  2. 对 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攻击?

@lovelycarrot
Copy link

什么事XSS?

XSS(跨站脚本攻击),它指的是恶意攻击者往Web页面里插入恶意html代码,当用户浏览该页之时,嵌入其中Web里面的html代码会被执行,从而达到恶意用户的特殊目的。

XSS攻击的分类

1.非持久型攻击: 非持久型xss攻击是一次性的,仅对当次的页面访问产生影响。非持久型xss攻击要求用户访问一个被攻击者篡改后的链接,用户访问该链接时,被植入的攻击脚本被用户游览器执行,从而达到攻击目的。
2.持久型攻击: 持久型xss,会把攻击者的数据存储在服务器端,攻击行为将伴随着攻击数据一直存在

也可以分成三类:

  1. 反射型:经过后端,不经过数据库
  2. 存储型:经过后端,经过数据库
  3. DOM:不经过后端,DOM—based XSS漏洞是基于文档对象模型Document Objeet Model,DOM)的一种漏洞,dom - xss是通过url传入参数去控制触发的。

如何防范

将用户输入的可能产生XSS攻击的尖括号,引号等进行转义(不要相信任何用户的输入,都要验证或转义)

@haxisi001
Copy link

XSS==Cross-Site Scripting(跨站脚本攻击)代码注入攻击,攻击中利用脚本获取用户信息。
有三种形式:
放射型:经过后端,不经过数据库。
存储型:经过后端,经过数据库。
DOM:不经过后端,直接通过输入代码注入脚本攻击。
防御:
对用户的输入进行转义和验证。.innerHTML、.outerHTML、document.write() 不能随便使用,

@xujianamos
Copy link

定义:Cross-Site Scripting(跨站脚本攻击)简称 XSS,是一种代码注入攻击。攻击者通过在目标网站上注入恶意脚本,使之在用户的浏览器上运行。利用这些恶意脚本,攻击者可获取用户的敏感信息如 Cookie、SessionID 等,进而危害数据安全。

分类:XSS 攻击可分为存储型、反射型和 DOM 型三种
措施:
禁止加载外域代码,防止复杂的攻击逻辑。
禁止外域提交,网站被攻击后,用户的数据不会泄露到外域。
禁止内联脚本执行(规则较严格,目前发现 GitHub 使用)。
禁止未授权的脚本执行(新特性,Google Map 移动版在使用)。
合理使用上报可以及时发现 XSS,利于尽快修复问题。
HTTP-only Cookie: 禁止 JavaScript 读取某些敏感 Cookie,攻击者完成 XSS 注入后也无法窃取此 Cookie。
验证码:防止脚本冒充用户提交危险操作。

@YvetteLau
Copy link
Owner Author

1. XSS攻击

XSS(Cross-Site Scripting,跨站脚本攻击)是一种代码注入攻击。攻击者在目标网站上注入恶意代码,当被攻击者登陆网站时就会执行这些恶意代码,这些脚本可以读取 cookie,session tokens,或者其它敏感的网站信息,对用户进行钓鱼欺诈,甚至发起蠕虫攻击等。

XSS 的本质是:恶意代码未经过滤,与网站正常的代码混在一起;浏览器无法分辨哪些脚本是可信的,导致恶意脚本被执行。由于直接在用户的终端执行,恶意代码能够直接获取用户的信息,利用这些信息冒充用户向网站发起攻击者定义的请求。

XSS分类

根据攻击的来源,XSS攻击可以分为存储型(持久性)、反射型(非持久型)和DOM型三种。下面我们来详细了解一下这三种XSS攻击:

1.1 反射型XSS

当用户点击一个恶意链接,或者提交一个表单,或者进入一个恶意网站时,注入脚本进入被攻击者的网站。Web服务器将注入脚本,比如一个错误信息,搜索结果等,未进行过滤直接返回到用户的浏览器上。

反射型 XSS 的攻击步骤:

  1. 攻击者构造出特殊的 URL,其中包含恶意代码。
  2. 用户打开带有恶意代码的 URL 时,网站服务端将恶意代码从 URL 中取出,拼接在 HTML 中返回给浏览器。
  3. 用户浏览器接收到响应后解析执行,混在其中的恶意代码也被执行。
  4. 恶意代码窃取用户数据并发送到攻击者的网站,或者冒充用户的行为,调用目标网站接口执行攻击者指定的操作。

反射型 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.appendChilddocument.write()等API时要特别小心,不要把不可信的数据作为 HTML 插到页面上,尽量使用 .innerText.textContent.setAttribute() 等。

DOM 型 XSS 的攻击步骤:

  1. 攻击者构造出特殊数据,其中包含恶意代码。
  2. 用户浏览器执行了恶意代码。
  3. 恶意代码窃取用户数据并发送到攻击者的网站,或者冒充用户的行为,调用目标网站接口执行攻击者指定的操作。

如何防范 DOM 型 XSS 攻击

防范 DOM 型 XSS 攻击的核心就是对输入内容进行转义(DOM 中的内联事件监听器和链接跳转都能把字符串作为代码运行,需要对其内容进行检查)。

1.对于url链接(例如图片的src属性),那么直接使用 encodeURIComponent 来转义。

2.非url,我们可以这样进行编码:

function encodeHtml(str) {
    return str.replace(/"/g, '&quot;')
            .replace(/'/g, '&apos;')
            .replace(/</g, '&lt;')
            .replace(/>/g, '&gt;');
}

DOM 型 XSS 攻击中,取出和执行恶意代码由浏览器端完成,属于前端 JavaScript 自身的安全漏洞。

1.3 存储型XSS

恶意脚本永久存储在目标服务器上。当浏览器请求数据时,脚本从服务器传回并执行,影响范围比反射型和DOM型XSS更大。存储型XSS攻击的原因仍然是没有做好数据过滤:前端提交数据至服务端时,没有做好过滤;服务端在接受到数据时,在存储之前,没有做过滤;前端从服务端请求到数据,没有过滤输出。

存储型 XSS 的攻击步骤:

  1. 攻击者将恶意代码提交到目标网站的数据库中。
  2. 用户打开目标网站时,网站服务端将恶意代码从数据库取出,拼接在 HTML 中返回给浏览器。
  3. 用户浏览器接收到响应后解析执行,混在其中的恶意代码也被执行。
  4. 恶意代码窃取用户数据并发送到攻击者的网站,或者冒充用户的行为,调用目标网站接口执行攻击者指定的操作。

这种攻击常见于带有用户保存数据的网站功能,如论坛发帖、商品评论、用户私信等。

如何防范存储型XSS攻击:

  1. 前端数据传递给服务器之前,先转义/过滤(防范不了抓包修改数据的情况)
  2. 服务器接收到数据,在存储到数据库之前,进行转义/过滤
  3. 前端接收到服务器传递过来的数据,在展示到页面前,先进行转义/过滤

除了谨慎的转义,我们还需要其他一些手段来防范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 的防范中可以起到以下的作用:

  1. 禁止加载外域代码,防止复杂的攻击逻辑。
  2. 禁止外域提交,网站被攻击后,用户的数据不会泄露到外域。
  3. 禁止内联脚本执行(规则较严格,目前发现 GitHub 使用)。
  4. 禁止未授权的脚本执行(新特性,Google Map 移动版在使用)。
  5. 合理使用上报可以及时发现 XSS,利于尽快修复问题。

2.输入内容长度控制

对于不受信任的输入,都应该限定一个合理的长度。虽然无法完全防止 XSS 发生,但可以增加 XSS 攻击的难度。

3.输入内容限制

对于部分输入,可以限定不能包含特殊字符或者仅能输入数字等。

4.其他安全措施

  • HTTP-only Cookie: 禁止 JavaScript 读取某些敏感 Cookie,攻击者完成 XSS 注入后也无法窃取此 Cookie。
  • 验证码:防止脚本冒充用户提交危险操作。

@MissNanLan
Copy link

MissNanLan commented Jun 3, 2019

什么是XSS攻击

XSS也称为跨脚本攻击,是一种恶意脚本,可以获取用户得cookie、token、session

XSS攻击的分类

  • 反射型
    反射型就是攻击者构造出恶意的url,其中包含了恶意代码,用户点击之后,服务端取出并且返回给到前端,然后在用户端执行了恶意代码,导致用户信息泄露等损失,如网站的搜索、跳转等

  • DOM型
    DOM型指的就是攻击者输入恶意的代码前端没有做任何过滤被执行了,然后恶意代码发送到攻击者的网站,模拟用户的行为。

  1. 尽量少使用appenChidinnerHTMLouterHTML等标签,而使用innerTexttextContentsetAttribute
  2. 前端过滤

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, '&quot;')
            .replace(/'/g, '&apos;')
            .replace(/</g, '&lt;')
            .replace(/>/g, '&gt;')
            .replace(/&/g,'&amp;')
}

document.write("<script>alert('我是恶意代码')</script>")
document.write(encodeHtml("<script>alert('我是恶意代码')</script>"))

当然这是一个简单的demo,我们常使用AngularVueReact框架都帮我们做好了
比如Angular

import { DomSanitizer } from '@angular/platform-browser';

export class myPage1{
  constructor(private sanitizer: DomSanitizer) {
  }

  onInit():void{
      this.html = this.sanitizer.bypassSecurityTrustHtml('html代码');
     // this.sanitizer 还有很多方法
  }
}

Vuev-textv-html

  • 储存型
    储存型和反射型很相似,区别在于储存型是存在数据当中,而反射型是存在URL当中,常见的话就是商品的评论、发博文等

当然实际情况会跟更复杂,通常对于发生与用户交付的行为,比如input的输入,前端一定要做好校验,限制用户输入的长度、格式

小伙伴说的 HTTP-only Cookie,禁止读取敏感cookie。 第一次看见,长见识了

@ccvaille
Copy link

ccvaille commented Jun 3, 2019

  • Cross Site Scripting 跨站脚本攻击
  • 分类
    • 反射型 XSS
      • 当用户点击一个恶意链接,或者提交一个表单,或者进入一个恶意网站时,注入脚本进入被攻击者的网站。Web 服务器将注入脚本,比如一个错误信息,搜索结果等 返回到用户的浏览器上。浏览器会执行这段脚本,因为,它认为这个响应来自可信任的服务器。
    • 存储型 XSS
      • 注入型脚本永久存储在目标服务器上。当浏览器请求数据时,脚本从服务器上传回并执行
    • DOM 型 XSS
      • 被执行的恶意脚本会修改页面脚本结构
  • 防范
    • 输入过滤
    • 转义 HTML
    • 在 cookie 中设置 HttpOnly 属性

@daibin0809
Copy link

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;
    * 增加验证码验证。

@Talljack
Copy link

Talljack commented Jun 3, 2019

xss是一种代码注入攻击,通过向网站注入恶意的HTML代码;
分类:
1:反射型 => 通过在请求地址上加入恶心的HTML代码
2:dom型 => 通过一些api向网站注入一些恶意的HTML代码
3:持久性 => 攻击者通过把代码提交到后台数据库中;当用户下次打开的时候就会从后台接收这些恶意的代码
防止方案:转义字符的设置、可以设置白名单如http-only的设置

@0xBrooke
Copy link

0xBrooke commented Jun 3, 2019

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的方法

  1. 输入过滤;
  2. 预防存储型和反射型 XSS 攻击;
  3. 纯前端渲染;
  4. 转义 HTML;

参考相关文章:https://www.freebuf.com/articles/web/185654.html(棒)

@darlingyz
Copy link

代码注入, 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、把用户的数据进行转义,不相信用户的操作

@ZadaWu
Copy link

ZadaWu commented Jun 4, 2019

吐个小嘈,妈的,翻墙翻不出去了,折腾了好一会,委屈哭。

xss

直接上谷歌上收的第一个链接点进去。xss是Cross-site Scripting的缩写。
这是一种攻击的方式,如果你想了解所有的攻击,请点击所有的攻击
相信我,如果你有足够的时间再去看,因为我发现里面有13个子目录的攻击,太可怕了!
xss是c开头子目录里面的一种。

xss是什么?

跨站点脚本(xss)攻击时一种注入类型,其中恶意代码被注入到其他良心和可信赖的网站中。当攻击者使用Web应用程序将恶意代码-通常以浏览器端脚本的形式发送给不同的终端用户,就会发生xss攻击。允许这些攻击成功的缺陷时非常容易传播的,而且发生在web应用程序在其输出的使用来自用户的输入而无需验证或者编码的地方。

一个攻击者可以使用XSS来发送恶毒的代码给毫无戒心的用户。终端的用户没办法知道这个脚本是否应该被信任,并且会去执行这个脚本。因为它认为这个脚本来自一个信任的源,恶毒的脚本可以活着任何的cookies,session tokens,或者其他被浏览器保存以及在这个网站是使用的敏感的信息。这些脚本甚至可以重写HTML网页的内容。有关不同类型的XSS漏洞的更多详细信息,请看:Types of Cross-Site Scripting.

什么时候发生

  1. 数据通过不受信任的来源进入Web应用程序,最常见的是Web请求。
  2. 数据包含在动态内容中,该动态内容在未经过恶意内容验证的情况下发送给web用户。
    恶毒的内容发送到浏览器通常通过脚本的片段,但是也可能包含HTML,FLASH,或者任何其他会让浏览器执行的代码的类型。基于XSS的各种攻击几乎是无限的,但它们通常包括传输私有数据,像cookie或其他会话信息一样被攻击者控制,将受害者重定向到攻击者控制的Web内容,或者在易受攻击的站点的幌子下在用户的机器上执行其他恶意操作。

种类

XSS攻击可以简单的被分类称两种类型: stored and reflected.还有第三个,不太知名的XSS被称为基于DOM的XSS,这个会单独的讨论。

  1. Stored XSS Attacks: 存储攻击是指注入的脚本永久存储在目标服务器上的攻击,例如数据库,消息论坛,访问者日志,注释字段等。受害者会从服务器获取到恶毒的脚本,当服务器请求了存储的信息。存储的XSS有时候也称之为持久性XSS或者Type-1 XSS.
  2. Reflected XSS Attacks:反射攻击是指注入的脚本从Web服务器反射出来的攻击,例如:错误消息,搜索结果或包含作为请求的一部分发送到服务器的部分或全部输入的任何其他请求。反射的攻击通过另一条路径传递给受害者,例如在电子邮件中或其他一些网站上。当用户被欺骗点击恶意链接,提交特制表单,甚至只是浏览恶意网站时,注入的代码会传播到易受攻击的网站,这会将攻击反射回用户的浏览器。然后浏览器执行代码,因为它来自“可信”服务器。发射攻击有时候也称之为非持久性 XSS或者 Type-2 XSS.
  3. 其他类型的XSS漏洞
    基于DOM的XSS是Client XSS的子集。

攻击后果

XSS攻击的后果是一样,无论是哪一种。区分就是有效负载如何到达服务器。不要认为“只读”或者“”宣传品“网站不容易收到严重反射的XSS攻击。XSS会给终端用户带来各种问题,从烦恼到账户完全泄漏。最严重的XSS攻击涉及披露用户的会话cookie,允许攻击者劫持用户的会话并接管帐户。其他破坏性攻击包括最终用户文件的泄露,特洛伊木马程序的安装,将用户重定向到其他页面或站点,或修改内容的呈现。

如何确定你是否易攻击

XSS可能很难从一个web应用上识别并且一处。最好的办法找到缺陷就是最代码执行安全性检查,并搜索HTTP请求的输入可能对HTML输出的所有位置。请注意可以使用各种不同的HTML标记来传输脚本。Nessus,Nikto和其他一些可用的工具可以帮助扫描网站中的这些缺陷,但只能检查表面。如果网站的某个部分容易受到攻击,那么很可能还存在其他问题。

如何防范 参考地址

  1. 对输入过滤
    • 防止HTML中出现注入
    • 防止JS执行时,执行恶意代码
  2. 预防存储型和反射型攻击
    • 改成纯前端渲染,把数据和代码风格开
      1. 浏览器先加载一个静态 HTML,此 HTML 中不包含任何跟业务相关的数据。
      2. 然后浏览器执行 HTML 中的 JavaScript。
      3. JavaScript 通过 Ajax 加载业务数据,调用 DOM API 更新到页面上。
    • 对HTML做充分转义
      如果拼接 HTML 是必要的,就需要采用合适的转义库,对 HTML 模板各处插入点进行充分的转义。
      常用的模板引擎,如 doT.js、ejs、FreeMarker 等,对于 HTML 转义通常只有一个规则,就是把 & < > " ' / 这几个字符转义掉,确实能起到一定的 XSS 防护作用,但并不完善。
  3. 预防 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,很容易产生安全隐患,请务必避免。

@KRISACHAN
Copy link

KRISACHAN commented Jun 4, 2019

什么是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" 内容安全策略
它允许页面作者定义当前页的 内容策略。 内容策略主要指定允许的服务器源和脚本端点,这有助于防止跨站点脚本攻击。

@0uzu0
Copy link

0uzu0 commented Jun 4, 2019

偷个懒引用一下

前端安全系列(一):如何防止XSS攻击?

@yaxinlove
Copy link

跨站脚本攻击:(Cross Site Script 简称CSS,为了区分css,简称xss),是指恶意攻击者通过向页面插入恶意html代码,当用户浏览页面时,嵌入web中的html代码就会执行,从而达到攻击者的目的;
2.分类;
根据攻击的来源,可以分为存储型,反射型,DOM型;
存储型:
1.攻击者将恶意代码提交到目标网站的数据库中。

2.用户打开目标网站时,网站服务端将恶意代码从数据库取出,拼接在 HTML 中返回给浏览器。

3.用户浏览器接收到响应后解析执行,混在其中的恶意代码也被执行。

4.恶意代码窃取用户数据并发送到攻击者的网站,或者冒充用户的行为,调用目标网站接口执行攻击者指定的操作。

这种攻击常见于带有用户保存数据的网站功能,如论坛发帖、商品评论、用户私信等。
反射型:
1.攻击者构造出特殊的 URL,其中包含恶意代码。

2.用户打开带有恶意代码的 URL 时,网站服务端将恶意代码从 URL 中取出,拼接在 HTML 中返回给浏览器。

3.用户浏览器接收到响应后解析执行,混在其中的恶意代码也被执行。

4.恶意代码窃取用户数据并发送到攻击者的网站,或者冒充用户的行为,调用目标网站接口执行攻击者指定的操作。

反射型 XSS 跟存储型 XSS 的区别是:存储型 XSS 的恶意代码存在数据库里,反射型 XSS 的恶意代码存在 URL 里。

反射型 XSS 漏洞常见于通过 URL 传递参数的功能,如网站搜索、跳转等。

由于需要用户主动打开恶意的 URL 才能生效,攻击者往往会结合多种手段诱导用户点击。

POST 的内容也可以触发反射型 XSS,只不过其触发条件比较苛刻(需要构造表单提交页面,并引导用户点击),所以非常少见。
DOM型:
1.攻击者构造出特殊的 URL,其中包含恶意代码。

2.用户打开带有恶意代码的 URL。

3.用户浏览器接收到响应后解析执行,前端 JavaScript 取出 URL 中的恶意代码并执行。

4.恶意代码窃取用户数据并发送到攻击者的网站,或者冒充用户的行为,调用目标网站接口执行攻击者指定的操作。

DOM 型 XSS 跟前两种 XSS 的区别:DOM 型 XSS 攻击中,取出和执行恶意代码由浏览器端完成,属于前端 JavaScript 自身的安全漏洞,而其他两种 XSS 都属于服务端的安全漏洞。
3. XSS 攻击的预防
存储型和反射型 XSS 都是在服务端取出恶意代码后,插入到响应 HTML 里的,攻击者刻意编写的“数据”被内嵌到“代码”中,被浏览器所执行。

预防这两种漏洞,有两种常见做法:

1.改成纯前端渲染,把代码和数据分隔开。

2.对 HTML 做充分转义。
DOM 型 XSS 攻击,实际上就是网站前端 JavaScript 代码本身不够严谨,把不可信的数据当作代码执行了。

在使用 .innerHTML、.outerHTML、document.write() 时要特别小心,不要把不可信的数据作为 HTML 插到页面上,而应尽量使用 .textContent、.setAttribute() 等。

如果用 Vue/React 技术栈,并且不使用 v-html/dangerouslySetInnerHTML 功能,就在前端 render 阶段避免 innerHTML、outerHTML 的 XSS 隐患。

@DazhiFe
Copy link

DazhiFe commented Jun 4, 2019

这方面的知识比较欠缺,参考别人的文章学习了一遍,暂时先了解个大概吧。

什么是XSS攻击

Cross-Site-Scripting(跨站脚本攻击),简称XSS,是一种代码注入攻击。攻击者通过在目标网站上注入恶意脚本,使之在用户的浏览器运行。利用这些恶意脚本,攻击者可获取用户的敏感信息如Cookie、SessionID等,进而危害数据安全。

为了和CSS区分,所以第一个字母改成了X,于是叫做XSS

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攻击有两大要素:

  1. 攻击者提交恶意代码
  2. 浏览器执行恶意代码

针对第一个要素:我们是否能够在用户输入的过程,过滤掉用户输入的恶意代码呢?

1.输入过滤

在用户提交时,由前端过滤输入,然后提交到后端。这样做是否可行?

答案是不可行。一旦攻击者绕过前端过滤,直接构造请求,就可以提交恶意代码了。

那么换一个过滤时机:后端在写入数据库前,对输入进行过滤,然后把“安全”的内容,返回给前端。这样是否可行呢?

我们举一个例子,一个正常的用户输入了5 > 7这个内容,在写入数据库前被转义,变成了5 &lt; 7

问题是:在提交阶段,我们并不确定内容要输出到哪里。

这里的“并不确定内容要输出到哪里”有两层含义:

  1. 用户输入的内容可能同时提供给前端和客户端,而一旦经过escapeHTML(),客户端显示的内容就变成了乱码(5 &lt; 7)。
  2. 在前端中,不同的位置所需的编码也不同。
  • 5 &lt; 7作为HTML拼接页面时,可以正常显示:
<div class="comment">5 lt; 7</div>
  • 5 lt; 7通过Ajax返回,然后复制给JavaScript变量时,前端得到的字符串就是转移后的字符。这个字符不能用于Vue等模板的展示,也不能直接用于内容长度的计算。不能用于标题、alert等。

疑问:展示的时候再进行一次转义是否可以?

所以,输入侧过滤能够在某些情况下解决特定的XSS问题,但会引入很大的不确定性和乱码问题。在防范XSS攻击时应避免此类方法。

当然,对于明确的输入类型,例如数字、URL、电话号码、邮件地址等内容,进行输入过滤还是必要的。

既然输入过滤并非完全可靠,我们就要通过“防止浏览器执行恶意代码”来防范XSS。这部分分为两类:

  • 防止HTML中出现注入
  • 防止JavaScript执行时,执行恶意代码

2.预防存储型和反射型XSS攻击

存储型和反射型XSS都是在服务端取出恶意代码后,插入到相应HTML里的,攻击者刻意编写的“数据”被内嵌到“代码”中,被浏览器执行。

预防这两种漏洞,有两种常见做法:

  • 改成纯前端渲染,把代码和数据分隔开
  • 对HTML做充分转义

纯前端渲染

纯前端渲染的过程:

  1. 浏览器先加载一个静态的HTML,此HTMl中不包含任何跟业务相关的数据
  2. 然后浏览器执行HTML中的JavaScript
  3. JavaScript通过Ajax加载业务数据,调用DOM API更新到页面上

转义HTML

如果拼接HTML是必要的,就需要采用合适的转义库,对HTML模板各处插入点进行充分的转义。

常用的模板引擎,如doT.js、ejs、FreeMarker等,对于HTML转义通常只有一个规则,就是把& < > " ' /这几个字符转义掉,确实能起到一定的XSS防护作用,但是并不完善。

XSS安全漏斗 简单转义是否有防护作用
HTML 标签文字内容
HTML属性值
CSS内联样式
内联JavaScript
内联JSON
跳转链接

所以要完善XSS防护措施,我们要使用更完善更细致的转义策略。

3.预防DOM型XSS攻击

DOM型XSS攻击,实际上就是网站前端JavaScript代码本身不够严谨,把不可信的数据当做代码执行了。

在使用.innerHTMLouterHTMLdocument.write()时要特别小心,不要把不可信的数据作为HTMl插入到页面上,而应尽量使用.textContentsetAttribute()等。

如果使用Vue/React技术栈,并且不使用v-html/dangerousSetInnerHTML功能,就在前端render阶段避免innerHTMLouterHTML的XSS隐患。

DOM中的内联事件监听器,如locationonclickonerroronloadonmouseover等,<a>标签的href属性,JavaScript的eval()setTimeout()setInterval()等,都能把字符串作为代码运行。如果不可信的数据拼接到字符串中传递给这些API,很容易产生安全隐患,请务必避免。

4.其他XSS防范措施

虽然在渲染页面和执行JavaScript时,通过谨慎的转义可以防止XSS的发生,但完全依靠开发的谨慎依然是不够的。以下介绍一些通用的方案,可以降低XSS带来的风险和后果。

4.1 Content Security Policy

4.2 输入内容长度限制

其他安全措施

  • HTTP-only Cookie:禁止JavaScript读取某些敏感Cookie,攻击者完成XSS注入后也无法窃取此Cookie
  • 验证码:防止脚本冒充用户提交危险操作

参考:

前端安全系列(一):如何防止XSS攻击?

@jodiezhang
Copy link

jodiezhang commented Jun 4, 2019

跨站脚本攻击(Cross Site Scripting),为了与CSS相区别,简写为XSS,恶意攻击者往web页面插入恶意的script代码,当用户浏览该页面时,嵌入Web里面的script代码会被执行,从而达到恶意攻击用户的目的。
XSS分为以下几类:
反射型XSS:不是持久化的,需要欺骗用户自己点击链接才能触发XSS代码,服务器中没有这样的页面和内容,反射型XSS大多数是用来盗取用户的Cookie信息。
存储型XSS:是持久化的,代码存储在服务器中,如在发表文章的地方,如果存储这些内容没有过滤或者过滤不严,这些代码将存储在服务器中,用户访问含有恶意内容的页面时就会触发这些代码。
DOM型XSS:这样的漏洞是基于文档对象模型(DOM)的,在使用 .innerHTML,.outerHTML,.appendChild,document.write等API时,要特别小心,尽量使用.innerText,.textContent,.setAttribute()等

如何防范反射型XSS
对url的查询参数进行转义后再输出到页面。

app.get('/welcome', function(req, res) {
    //对查询参数进行编码,避免反射型 XSS攻击
    res.send(`${encodeURIComponent(req.query.type)}`); 
});

如何防范存储型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, '>');
}

@jackluson
Copy link

什么是XSS攻击

1.XSS, 即Cross Site Script ,跨站脚本攻击,为了区分层叠样式表(Cascading Style Sheet),因此叫为XSS

2.是一种代码注入工具,攻击者在目标网站上注入恶意代码,当用户访问目标网站时就可能执行这些代码,从而对客户端网页进行篡改,恶意操作,获取cookies,session tokens这些用户隐私数据or诱导被攻击者到钓鱼网站,等等恶意行为

XSS分类可以分为: 放射型(非持久型)、存储型(持久型)、 基于Dom型

  • 放射型

放射型xss把用户输入的数据'反射'给浏览器,这种攻击往往需要用户点击某个恶意链接,或者提交表单,常见于利用通过URL传递参数的功能,如网站搜索,跳转等。
反射型 XSS 的攻击步骤:

  1. 攻击者构造出特殊的 URL,其中包含恶意代码。
  2. 用户打开带有恶意代码的 URL 时,服务端将恶意代码从 URL 中取出,拼接在 HTML 中返回给浏览器。
  3. 用户浏览器接收到响应后解析执行,混在其中的恶意代码也被执行。
  4. 恶意代码窃取用户数据并发送到攻击者的网站,或者冒充用户的行为,调用目标网站接口执行攻击者指定的操作。

由于需要用户主动打开恶意的 URL 才能生效,攻击者往往会结合多种手段诱导用户点击。

  • 存储型

存储型XSS会把用户输入的数据“存储”到数据库中,当浏览器请求数据时,脚本从数据库取数据,脚本传回并且执行,这个攻击具有很强的稳定性
常见于带有用户保存数据的网站功能,如论坛发帖、商品评论、用户私信等。
存储型 XSS 的攻击步骤:

1.攻击者将恶意代码提交到目标网站的数据库中。
2.用户打开目标网站时,网站服务端将恶意代码从数据库取出,拼接在 HTML 中返回给浏览器。
3.用户浏览器接收到响应后解析执行,混在其中的恶意代码也被执行。
4.恶意代码窃取用户数据并发送到攻击者的网站,或者冒充用户的行为,调用目标网站接口执行攻击者指定的操作。

反射型 XSS 跟存储型 XSS 的区别是:存储型 XSS 的恶意代码存在数据库里,反射型 XSS 的恶意代码存在 URL 里。

  • DOM 型 XSS

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

DOM 型 XSS 跟前两种 XSS 的区别:DOM 型 XSS 攻击中,取出和执行恶意代码由浏览器端完成,属于前端 JavaScript 自身的安全漏洞,而其他两种 XSS 都属于服务端的安全漏洞。

XSS 攻击的预防

现在主流的浏览器内置了防范 XSS 的措施,例如 CSP。但对于开发者来说,也应该寻找可靠的解决方案来防止 XSS 攻击。
比如

Content-Security-Policy: default-src ‘self’
//只允许加载本站资源
  • 永远不要相信用户的输入原则:对输入输出内容进行转义,过滤
  • 谨慎使用.innnerHTML , .outerHTML,document.write(),尽量使用.textContent, outerHTML代替
  • 可以使用HttpOnly防止窃取Cookie
  • ...

@MissWXiang
Copy link

1.什么是XSS?
XSS(Cross-Site Scripting)又称跨站脚本,XSS的重点不在于跨站点,而是在于脚本的执行。XSS是一种经常出现在 Web 应用程序中的计算机安全漏洞,是由于 Web 应用程序对用户的输入过滤不足而产生的
2.XSS分类
常见的 XSS 攻击有三种:反射型、DOM-based 型、存储型。 其中反射型、DOM-based 型可以归类为非持久型 XSS 攻击,存储型归类为持久型 XSS 攻击。
3.如何防范XSS攻击?
XSS防御的总体思路是:对输入(和URL参数)进行过滤,对输出进行编码。

(微信名:RUN)

@chongyangwang
Copy link

chongyangwang commented Jun 5, 2019

什么是xss攻击

  xss攻击就是攻击者在目标网站嵌入了恶意代码,  浏览器在解析时没办法有效区分恶意代码与正常代码,导致渲染时会将恶意代码一并执行,利用这些恶意代码,可以窃取到用户的敏感信息  如 cookie  和session等,从而进行一些不安全的数据操作(利用这些信息攻击者可以自定义一些请求)。

xss攻击可以哪几类
xss攻击可以分为存储型,反射型,dom型等。

存储型:
客户端在一些表单提交的时候没有对内容进行过滤,攻击者往往会提交一些恶意代码或脚本,服务端在接收时也没有对提交的内容进行过滤,直接存储进数据库,浏览器在读取记录时会将全部内容读取解析,并将恶意代码执行,存储型xss一般出现在网站留言 评论 博客日志等交互处 恶意脚本提交到服务端的数据库中。

放射型:
放射型XSS主要是将恶意代码拼接至url地址之中 构造出一个特殊的url地址,当用户点击这个url的时候 服务端将恶意代码从url取出 拼接在html中返回给浏览器 浏览器在解析时恶意代码也会执行 ,从而窃取用户信息,进行恶意操作,放射型xss常见于 用户跳转 如网站搜索等。

dom型:
dom型主要是在客户端 jsvascript脚本中在 使用 .innerHTML、.outerHTML、document.write() 等方式时将恶意代码直接渲染至html页面 从而由攻击者进行恶意的操作。

如何预防xss攻击

1.浏览器内置CSP 即 Content-Security-Policy: default-src ‘self’

2.永远不要相信用户的输入原则:对输入输出内容进行转义,过滤
前端数据传递给服务器之前,先转义/过滤(防范不了抓包修改数据的情况)

服务器接收到数据,在存储到数据库之前,进行转义/过滤

前端接收到服务器传递过来的数据,在展示到页面前,先进行转义/过滤

纯前端渲染,把代码和数据分隔开。

对 HTML 做充分转义。

  1. 输入内容长度限制。

  2. 尽量使用 innerText setAttribute 等

  3. 可以使用HttpOnly防止窃取Cookie

@ivan0525
Copy link

ivan0525 commented Jun 5, 2019

(来自百度百科)

  1. 什么是XSS攻击?
    XSS(Cross Site Scripting)攻击全称跨站脚本攻击,是为不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,故将跨站脚本攻击缩写为XSS,XSS是一种在web应用中的计算机安全漏洞,它允许恶意web用户将代码植入到提供给其它用户使用的页面中。
  2. XSS攻击可以分为哪几类?
    XSS漏洞按照攻击利用手法的不同,有以下三种类型:
    类型A,本地利用漏洞,这种漏洞存在于页面中客户端脚本自身。其攻击过程如下所示:
    Alice给Bob发送一个恶意构造了Web的URL。
    Bob点击并查看了这个URL。
    恶意页面中的JavaScript打开一个具有漏洞的HTML页面并将其安装在Bob电脑上。
    具有漏洞的HTML页面包含了在Bob电脑本地域执行的JavaScript。
    Alice的恶意脚本可以在Bob的电脑上执行Bob所持有的权限下的命令。
    类型B,反射式漏洞,这种漏洞和类型A有些类似,不同的是Web客户端使用Server端脚本生成页面为用户提供数据时,如果未经验证的用户数据被包含在页面中而未经HTML实体编码,客户端代码便能够注入到动态页面中。其攻击过程如下:
    Alice经常浏览某个网站,此网站为Bob所拥有。Bob的站点运行Alice使用用户名/密码进行登录,并存储敏感信息(比如银行帐户信息)。
    Charly发现Bob的站点包含反射性的XSS漏洞。
    Charly编写一个利用漏洞的URL,并将其冒充为来自Bob的邮件发送给Alice。
    Alice在登录到Bob的站点后,浏览Charly提供的URL。
    嵌入到URL中的恶意脚本在Alice的浏览器中执行,就像它直接来自Bob的服务器一样。此脚本盗窃敏感信息(授权、信用卡、帐号信息等)然后在Alice完全不知情的情况下将这些信息发送到Charly的Web站点。
    类型C,存储式漏洞,该类型是应用最为广泛而且有可能影响到Web服务器自身安全的漏洞,骇客将攻击脚本上传到Web服务器上,使得所有访问该页面的用户都面临信息泄漏的可能,其中也包括了Web服务器的管理员。其攻击过程如下:
    Bob拥有一个Web站点,该站点允许用户发布信息/浏览已发布的信息。
    Charly注意到Bob的站点具有类型C的XSS漏洞。
    Charly发布一个热点信息,吸引其它用户纷纷阅读。
    Bob或者是任何的其他人如Alice浏览该信息,其会话cookies或者其它信息将被Charly盗走。
    类型A直接威胁用户个体,而类型B和类型C所威胁的对象都是企业级Web应用。
  3. 如何防范XSS攻击?
  • 过滤用户输入的 检查用户输入的内容中是否有非法内容。如<>(尖括号)、”(引号)、 ‘(单引号)、%(百分比符号)、;(分号)、()(括号)、&(& 符号)、+(加号)等。、严格控制输出

@web-data-MrLi
Copy link

什么是XSS攻击
XSS攻击全名(Cross-Site-Script)跨域脚本攻击,为了跟CSS(Cascading-Style-Sheet)区分开来,所以缩写是XSS。

XSS攻击的原理
上一节说道的CSRF攻击是利用的是“伪请求”,这一节的XSS的原理是利用脚本注入的方式。
主要是依靠一切可能的手段,将浏览器中可以执行的脚本(javascript)植入到页面代码中,从而获取用户cookie甚至账号密码等敏感数据使用户造成的一定的损失。
通常利用的是目标网站的发帖、发布产品等需要用户输入的地方,将脚本混淆到html输入中,上传到服务器,再诱导别的用户打开此页面,执行脚本的一个过程。

XSS攻击的方法
xss漏洞是对web客户端(浏览器)的攻击,所以说植入的代码基本上以javascript和html标签(有时也有结合css样式的xss向量)为主。
一般有四种方法:

页面标签附带脚本
Dom 属性附带脚本
请求地址附带脚本
回车空格突破过滤限制
举两个小李子:

<script>alert('xss')</script>

<img scr=1 onerror=alert('xss')>

<a href=javascrip:alert('xss')>s

<iframe src=javascript:alert('xss');height=0 width=0 />

<img src=x onerror=appendChild(createElement('script')).src='js_url' />

<img src = “#”/**/onerror = alert(/XSS/)>
<img src = j
ava script :a ler t(/xss/)>
XSS攻击防御的手段
因为XSS的根本就是向网站插入脚本代码,并使它运行的一种手段。防御方法分为两种,服务端防御和客户端防御。
服务端防御:

  1. HttpOnly
    可以限制javascript不能读取cookie,防止会话ID泄露
    2.处理富文本
    过滤掉富文本中的敏感标签如(script、iframe、form),还有敏感词(javascript:) 等等
    客户端防御:
  2. 输入检查
    防止输入敏感字段,如javascript、cookie等等
  3. 检查输出
    脚本都是通过混淆在HTML当中,被当成html代码的一部分才得到执行。
    可以通过编码转义的办法,使得混淆在其中的脚本被当成文本处理,不会被执行。
    编码转义的话,有三种方法:

1. HTML encode
将字符转换成HTMLEntities,一般会转(&、<、>、"、'、/)这6个字符。一般是在html标签属性输出的时候使用
2. JavaScriptEncode
使用”\“对特殊字符进行转义。
一般在script标签输出、事件输出、CSS输出
3. URL Encode
使用URLEncode的方法。

@luohong123
Copy link

什么是XSS 攻击

XSS的英文全称是Cross-Site Scripting,这会与层叠样式表(Cascading Style Sheets, CSS)的缩写混淆。因此有人将跨站脚本攻击缩写为XSS,也叫跨站点脚本,利用网站漏洞从用户那里恶意盗取信息。

XSS攻击可以分为哪几类

  1. 持久型跨站:最直接的危害类型,跨站代码存储在服务器(数据库)。
  2. 非持久型跨站:反射型跨站脚本漏洞,最普遍的类型。用户访问服务器-跨站链接-返回跨站代码。
  3. DOM跨站(DOM XSS):DOM(document object model文档对象模型),客户端脚本处理逻辑导致的安全问题。

如何防范XSS攻击

从网站开发者角度,如何防护XSS攻击?

来自应用安全国际组织OWASP的建议,对XSS最佳的防护应该结合以下两种方法:验证所有输入数据,有效检测攻击;对所有输出数据进行适当的编码,以防止任何已成功注入的脚本在浏览器端运行。具体如下:
输入验证:某个数据被接受为可被显示或存储之前,使用标准输入验证机制,验证所有输入数据的长度、类型、语法以及业务规则。
输出编码:数据输出前,确保用户提交的数据已被正确进行entity编码,建议对所有字符进行编码而不仅局限于某个子集。
明确指定输出的编码方式:不要允许攻击者为你的用户选择编码方式(如ISO 8859-1或 UTF 8)。
注意黑名单验证方式的局限性:仅仅查找或替换一些字符(如"<" ">"或类似"script"的关键字),很容易被XSS变种攻击绕过验证机制。
警惕规范化错误:验证输入之前,必须进行解码及规范化以符合应用程序当前的内部表示方法。请确定应用程序对同一输入不做两次解码。

从网站用户角度,如何防护XSS攻击?

当你打开一封Email或附件、浏览论坛帖子时,可能恶意脚本会自动执行,因此,在做这些操作时一定要特别谨慎。建议在浏览器设置中关闭JavaScript。如果使用IE浏览器,将安全级别设置到“高”。具体可以参照浏览器安全的相关文章。
这里需要再次提醒的是,XSS攻击其实伴随着社会工程学的成功应用,需要增强安全意识,只信任值得信任的站点或内容。可以通过一些检测工具进行xss的漏洞检测,类似工具有亿思网站安全检测平台。针对xss的漏洞带来的危害是巨大,如有发现,应立即修复漏洞。

总体来说,防范XSS 可以遵循如下规则:

  1. 不要在允许位置插入不可信数据
  2. 在向HTML元素内容插入不可信数据前对HTML解码
  3. 在向HTML常见属性插入不可信数据前进行属性解码
  4. 在向HTML JavaScript Data Values插入不可信数据前,进行JavaScript解码
  5. 在向HTML 样式属性值插入不可信数据前,进行CSS解码
  6. 在向HTML URL属性插入不可信数据前,进行URL解码

@Diamondjcx
Copy link

一:什么是XSS攻击?

 XSS是一种代码注入攻击,攻击者是通过目标网站上注入恶意脚本,使之在用户的浏览器上运行。利用这些恶意脚本,攻击者可以获取用户的敏感信息,进而危害数据安全。

二:根据攻击来源,XSS攻击可以分为三类:

  1. 存储型XSS
    攻击者将恶意代码提交到目标网站的数据库中,用户打开网站时,网站服务端将恶意代码从数据库中取出,拼接在HTML中返回浏览器,之后用户浏览器收到响应后解析执行混入其中的恶意代码,恶意代码窃取用户数据并发送攻击者网站,或冒充用户行为,调用目标网站接口执行攻击者指定的操作
    常见于带有用户保存数据的网站功能,比如论坛发帖、商品评价、用户私信

2.反射性XSS
攻击者构造出特殊的URL,其中包含恶意代码。当用户打开带有恶意代码的URL时,网站服务端将恶意代码从URL中取出,拼接在HTML中返回浏览器,之后用户浏览器收到响应后解析执行混入其中的恶意代码,恶意代码窃取用户数据并发送到攻击者的网站,或者冒充用户行为,调用目标网站接口执行攻击者指定的操作。
常见于通过URL传递参数的功能,如网站搜索、跳转。由于需要用户主动打开恶意的URL才能生效,攻击者往往会结合多种手段诱导用户点击。
3.DOM型XSS
DOM型XSS主要和前端js有关,是前端js获取用户的输入没有进行过滤后拼接到html中
4.区别
存储型XSS:存储在数据库,属于服务端的安全漏斗
反射型XSS:存在URL中,属于服务端的安全漏洞
DOM型XSS:取出和执行恶意代码由浏览器完成,属于前端JavaScript自身的安全漏洞

三 预防XSS攻击

 - 使用encodeURLComponent对url中的参数进行编码(反射型)
 -  对用户的输入进行过滤(适用于所有类型的xss攻击)
 -  对用户的输入使用innerText或者textContent进行设置,而不是innerHTML或者outerHTML进行设置
 -   服务器端设置cookie为httpOnly让前端无法通过js获取用户的cookie
 -   关键请求使用验证码,比如转账请求,避免恶意脚本发送这些关键请求

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests