Open YvetteLau opened 5 years ago
xss是一种代码注入攻击,通过向网站注入恶意的HTML代码; 分类: a:反射型 => 通过在请求地址上加入恶心的HTML代码 b:dom型 => 通过一些api向网站注入一些恶意的HTML代码 c:持久性 => 攻击者通过把代码提交到后台数据库中;当用户下次打开的时候就会从后台接收这些恶意的代码
防范: a:前端通过转义来进行防范以及过滤 b:主要是通过后台来进行防卫
xss只记得叫跨站脚本攻击,分几种类型还不清楚,防范的话暂时只知道一些比如用innerHtml的地方可以使用innerText防范一下,其他的了解的就比较少了,多看看大佬们怎么回答的把
XSS 跨站脚本攻击,用户注入恶意的代码,浏览器和服务器没有对用户的输入进行过滤,导致用户注入的脚本嵌入到了页面中。由于浏览器无法识别这些恶意代码正常解析执行,攻击者的恶意操作被成功执行,比如可以获取用户的cookie数据然后发送给自己或者冒充正常用户向被攻击的服务器发送请求。
下面是一个简易版对用户的输入进行过滤的方法:
function escapeHTML(str) {
str.replace(/[<>& "]/g, function(match) {
switch (match) {
case '<':
return '<';
case '>':
return '>';
case '&':
return '&';
case ' ':
return ' ';
case '"':
return '"';
}
});
}
XSS(Cross-Site Scripting,又称跨站脚本攻击)是一种代码注入攻击,攻击者是通过在目标网站上注入恶意脚本,使之在用户的浏览器上运行。利用这些恶意脚本,攻击者可以获取用户的敏感信息,比如cookie,sessionID等 ,进而危害数据安全。
防止 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 中,拼接的数据突破了原本的限制
防范:
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攻击_又叫CSS (Cross Site Script) ,跨站脚本攻击。它指的是恶意攻击者往Web页面里插入恶意代码,当用户浏览该页之时,嵌入其中Web里面的恶意代码会被执行,从而达到读取 cookie,session tokens,或者其它敏感的网站信息,对用户进行钓鱼欺诈,甚至发起蠕虫攻击等的特殊目的。
一般是攻击者通过特定手法(如电子邮件),诱使用户去访问一个包含恶意代码的 URL,当受害者点击这些专门设计的链接的时候,恶意代码会直接在受害者主机上的浏览器执行。
对于访问者而言是一次性的,具体表现在我们把我们的恶意脚本通过 URL 的方式传递给了服务器,而服务器则只是不加处理的把脚本“反射”回访问者的浏览器而使访问者的浏览器执行相应的脚本。反射型 XSS 的触发有后端的参与,要避免反射性 XSS,必须需要后端的协调,后端解析前端的数据时首先做相关的字串检测和转义处理。
此类 XSS 通常出现在网站的搜索栏、用户登录口等地方,常用来窃取客户端 Cookies 或进行钓鱼欺骗。
攻击者事先将恶意代码上传或储存到漏洞服务器中,只要受害者浏览包含此恶意代码的页面就会执行恶意代码。这就意味着只要访问了这个页面的访客,都有可能会执行这段恶意脚本,因此储存型XSS的危害会更大
存储型 XSS 一般出现在网站留言、评论、博客日志等交互处,恶意脚本存储到客户端或者服务端的数据库中。
什么是XSS攻击? XSS攻击:全称跨站脚本攻击。XSS是一种经常出现在web应用中的计算机安全漏洞,它允许恶意web用户将代码植入到提供给其它用户使用的界面中。比如这些代码包括HTML代码和客户端脚本。攻击者利用XSS漏洞旁路掉访问控制——例如同源策略。 这种类型的漏洞由于被骇客用来编写更大的网络钓鱼(Phishing)攻击而变为广为人知。对于跨站脚本攻击,骇客界共识是:跨站脚本哦攻击是新型的“缓冲区溢出攻击”,而javaScript是新型的"ShellCode"。 XSS攻击可以分为哪几类? XXS漏洞按照攻击手法的不同,有以下三种类型:
如何防范XSS攻击? 1.前端数据传递给服务器之前,先转义/过滤(防范不了抓包修改数据的情况)。 2.服务器接收到数据,在存储到数据库之前,进行转义/过滤 3.前端接收到服务器传递过来的数据,在展示到页面钱,先进行转义/过滤
XSS(Cross Site Script)又称跨站脚本攻击,主要是将恶意代码注入了页面中,浏览器在解析时执行了该恶意代码,从而导致用户cookie,session等敏感信息的被不发分子利用。
XSS攻击主要分为3类,分别是:
反射型:反射型主要是攻击者伪造出恶意的url,诱导用户点击。恶意代码一般通过url参数注入,当用户点击url后,浏览器发出请求到服务器,服务器解析后将XSS代码随响应内容一起返回,浏览器解析响应内容,执行XSS代码。比如电子邮件。
存储型:存储型主要是攻击者将恶意代码提交到了数据库,用户浏览界面时,服务器从数据库取出带有恶意代码数据,返回给客户端,浏览器执行了恶意代码。比如论坛评论。
DOM型:DOM型不需要服务器的解析和参与,主要通过浏览器解析DOM。
// xss 攻击
// xss 即跨站脚本攻击 是一种常见的 web app 中的计算机安全漏洞 xss 通过在用户端注入的恶意可运行脚本 // 若服务器未对用户输入的内容做处理 直接将用户输入的内容输出到浏览器 则浏览器将会执行用户注入的恶意脚本
// 在HTML中常用到字符实体,将常用到的字符实体没有进行转译,导致完整的标签出现,在可输入的文本框等某些区域内输入特定的某些标签导致代码被恶意篡改。
// 我在数据交互的地方输入什么 我输入的内容被真实的显示出来 这样我们可以认为 没有被注入Xss
// 1.非持久型,也叫反射型XSS。通过GET和POST方法,向服务器端输入数据。用户输入的数据通常被放置在URL的query string中,或者是form 数据中。 // 如果服务器端对输入的数据不进行过滤,验证或编码,就直接将用户输入的信息直接呈现给客户,则可能会造成反射型XSS。
// 2.持久型,也叫存储型XSS。通常是因为服务器端将用户输入的恶意脚本没有通过验证就直接存储在数据库,并且每次通过调用数据库的方式,将数据呈现在浏览器上。 // 则该XSS跨站脚本攻击将一直存在。若其他用户访问该页面,则恶意脚本就会被触发,用于盗取其他用户的私人信息
// 服务器都会将JavaScript当做文本处理,在服务端整合进HTML文档中,在浏览器解析这些文本的过程,也就是XSS被执行的时候, // 所以主要的防御措施就是对任何用户提交到服务器上的文本都要经过编码或者转译。 原理可以参考这个 https://www.freebuf.com/articles/web/40520.html
XSS
叫做跨域脚本攻击,通过注入恶意代码来攻击目标网站
Xss全称为cross-site scripting (跨站脚本攻击),为了与css区分开来,故而称之为xss。xss攻击就是页面被注入了恶意代码。攻击者通过在目标网站上注入恶意代码,是指在用户浏览器中运行,利用这些恶意脚本,攻击者可以获取用户的敏感信息,如cookie,sessionid等,进而危害数据安全。 Xss的本质是:恶意代码未经过滤与正常代码混在一起,而浏览器是无法分出哪些是正常代码哪些是恶意代码的,从而发生xss攻击。 Xss可以分为三类:存储型,反射型,dom型。 其中存储型xss和反射型xss属于服务器端的安全漏洞,而dom型xss属于前端自身的安全漏洞。 预防xss攻击的方法:1、纯前端渲染,把代码和数据隔离开;2、对html进行充分转义。
跨站脚本,是发生在目标用户的浏览器层面,当渲染DOM树的过程中发生了不在预期内执行的JS代码事,XSS就发生了。
XSS 有以下一些危害
主要有三类: 反射型XSS,存储型XSS, DOM XSS.
也叫非持久型XSS,是指发生请求时, XSS代码出现在请求的URL中,作为参数提交到服务器,服务器解析并响应。响应结果中包含XSS代码,最后浏览器解析并执行。
服务器解析并响应。响应结果中包含XSS代码,最后浏览器解析并执行。最典型的例子是留言板XSS,用户提交一条包含XSS代码的留言存储到数据库,目标用户查看留言板时,那些留言的内容会从数据库查询出来并显示,浏览器发现有XSS代码,就当做正常的HTML与Js解析执行,于是触发了XSS攻击。
DOM XSS和反射型XSS、存储型XSS的差别在于DOM XSS的代码并不需要服务器参与,触发XSS靠的是浏览器端的DOM解析,完全是客户端的事情。
xss 的预防主要是不要完全相信用户的输入
< < > > 空格 & & " "
等response.setHeader("Set-cookie", "HTTPONly")
对于HTTPS ,还可以设置Secure 字段,对COOkie进行安全加密。
Cross-Site Scripting(跨站脚本攻击)简称 XSS,是一种代码注入攻击。攻击者通过在目标网站上注入恶意脚本,使之在用户的浏览器上运行。利用这些恶意脚本,攻击者可获取用户的敏感信息如 Cookie、SessionID 等,进而危害数据安全。
httpOnly: 在 cookie 中设置 HttpOnly 属性后,js脚本将无法读取到 cookie 信息。
输入过滤: 一般是用于对于输入格式的检查,例如:邮箱,电话号码,用户名,密码……等,按照规定的格式输入。不仅仅是前端负责,后端也要做相同的过滤检查。因为攻击者完全可以绕过正常的输入流程,直接利用相关接口向服务器发送设置。
转义 HTML: 如果拼接 HTML 是必要的,就需要对于引号,尖括号,斜杠进行转义,但这还不是很完善.想对 HTML 模板各处插入点进行充分的转义,就需要采用合适的转义库。
Cross-Site Scripting(跨站脚本攻击)简称 XSS,是一种代码注入攻击。攻击者通过在目标网站上注入恶意脚本,使之在用户的浏览器上运行。利用这些恶意脚本,攻击者可获取用户的敏感信息如 Cookie、SessionID 等,进而危害数据安全。 为了和 CSS 区分,这里把攻击的第一个字母改成了 X,于是叫做 XSS
根据攻击的来源,XSS 攻击可分为存储型、反射型和 DOM 型三种。
类型 | 存储区 | 插入点 |
---|---|---|
存储型 XSS | 后端数据库 | HTML |
反射型 XSS | URL | HTML |
DOM 型 XSS | 后端数据库/前端存储/URL | 前端 JavaScript |
存储型 XSS 存储型 XSS 的攻击步骤:
这种攻击常见于带有用户保存数据的网站功能,如论坛发帖、商品评论、用户私信等。
反射型 XSS 反射型 XSS 的攻击步骤:
反射型 XSS 跟存储型 XSS 的区别是:存储型 XSS 的恶意代码存在数据库里,反射型 XSS 的恶意代码存在 URL 里。 反射型 XSS 漏洞常见于通过 URL 传递参数的功能,如网站搜索、跳转等。 由于需要用户主动打开恶意的 URL 才能生效,攻击者往往会结合多种手段诱导用户点击。 POST 的内容也可以触发反射型 XSS,只不过其触发条件比较苛刻(需要构造表单提交页面,并引导用户点击),所以非常少见。
DOM 型 XSS DOM 型 XSS 的攻击步骤:
DOM 型 XSS 跟前两种 XSS 的区别:DOM 型 XSS 攻击中,取出和执行恶意代码由浏览器端完成,属于前端 JavaScript 自身的安全漏洞,而其他两种 XSS 都属于服务端的安全漏洞。
输入过滤 在用户提交时,由前端过滤输入,然后提交到后端。这样做是否可行呢? 答案是不可行。一旦攻击者绕过前端过滤,直接构造请求,就可以提交恶意代码了。 输入侧过滤能够在某些情况下解决特定的 XSS 问题,但会引入很大的不确定性和乱码问题。在防范 XSS 攻击时应避免此类方法。 当然,对于明确的输入类型,例如数字、URL、电话号码、邮件地址等等内容,进行输入过滤还是必要的。 既然输入过滤并非完全可靠,我们就要通过“防止浏览器执行恶意代码”来防范 XSS。这部分分为两类:
防止 HTML 中出现注入。 防止 JavaScript 执行时,执行恶意代码。
预防存储型和反射型 XSS 攻击 存储型和反射型 XSS 都是在服务端取出恶意代码后,插入到响应 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(跨站脚本攻击),它指的是恶意攻击者往Web页面里插入恶意html代码,当用户浏览该页之时,嵌入其中Web里面的html代码会被执行,从而达到恶意用户的特殊目的。
1.非持久型攻击: 非持久型xss攻击是一次性的,仅对当次的页面访问产生影响。非持久型xss攻击要求用户访问一个被攻击者篡改后的链接,用户访问该链接时,被植入的攻击脚本被用户游览器执行,从而达到攻击目的。 2.持久型攻击: 持久型xss,会把攻击者的数据存储在服务器端,攻击行为将伴随着攻击数据一直存在
也可以分成三类:
将用户输入的可能产生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。 验证码:防止脚本冒充用户提交危险操作。
XSS(Cross-Site Scripting,跨站脚本攻击)是一种代码注入攻击。攻击者在目标网站上注入恶意代码,当被攻击者登陆网站时就会执行这些恶意代码,这些脚本可以读取 cookie,session tokens,或者其它敏感的网站信息,对用户进行钓鱼欺诈,甚至发起蠕虫攻击等。
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 的攻击步骤:
这种攻击常见于带有用户保存数据的网站功能,如论坛发帖、商品评论、用户私信等。
如何防范存储型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 的防范中可以起到以下的作用:
2.输入内容长度控制
对于不受信任的输入,都应该限定一个合理的长度。虽然无法完全防止 XSS 发生,但可以增加 XSS 攻击的难度。
3.输入内容限制
对于部分输入,可以限定不能包含特殊字符或者仅能输入数字等。
4.其他安全措施
XSS也称为跨脚本攻击,是一种恶意脚本,可以获取用户得cookie、token、session
反射型 反射型就是攻击者构造出恶意的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
当然实际情况会跟更复杂,通常对于发生与用户交付的行为,比如input的输入,前端一定要做好校验,限制用户输入的长度、格式等
小伙伴说的 HTTP-only Cookie
,禁止读取敏感cookie。 第一次看见,长见识了
* 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攻击又称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是Cross-site Scripting的缩写。 这是一种攻击的方式,如果你想了解所有的攻击,请点击所有的攻击 相信我,如果你有足够的时间再去看,因为我发现里面有13个子目录的攻击,太可怕了! xss是c开头子目录里面的一种。
跨站点脚本(xss)攻击时一种注入类型,其中恶意代码被注入到其他良心和可信赖的网站中。当攻击者使用Web应用程序将恶意代码-通常以浏览器端脚本的形式发送给不同的终端用户,就会发生xss攻击。允许这些攻击成功的缺陷时非常容易传播的,而且发生在web应用程序在其输出的使用来自用户的输入而无需验证或者编码的地方。
一个攻击者可以使用XSS来发送恶毒的代码给毫无戒心的用户。终端的用户没办法知道这个脚本是否应该被信任,并且会去执行这个脚本。因为它认为这个脚本来自一个信任的源,恶毒的脚本可以活着任何的cookies,session tokens,或者其他被浏览器保存以及在这个网站是使用的敏感的信息。这些脚本甚至可以重写HTML网页的内容。有关不同类型的XSS漏洞的更多详细信息,请看:Types of Cross-Site Scripting.
XSS攻击可以简单的被分类称两种类型: stored and reflected.还有第三个,不太知名的XSS被称为基于DOM的XSS,这个会单独的讨论。
XSS攻击的后果是一样,无论是哪一种。区分就是有效负载如何到达服务器。不要认为“只读”或者“”宣传品“网站不容易收到严重反射的XSS攻击。XSS会给终端用户带来各种问题,从烦恼到账户完全泄漏。最严重的XSS攻击涉及披露用户的会话cookie,允许攻击者劫持用户的会话并接管帐户。其他破坏性攻击包括最终用户文件的泄露,特洛伊木马程序的安装,将用户重定向到其他页面或站点,或修改内容的呈现。
XSS可能很难从一个web应用上识别并且一处。最好的办法找到缺陷就是最代码执行安全性检查,并搜索HTTP请求的输入可能对HTML输出的所有位置。请注意可以使用各种不同的HTML标记来传输脚本。Nessus,Nikto和其他一些可用的工具可以帮助扫描网站中的这些缺陷,但只能检查表面。如果网站的某个部分容易受到攻击,那么很可能还存在其他问题。
跨站脚本(英语: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头指定内容的类型,使得输出的内容避免被作为HTML解析。如在PHP语言中使用以下代码:
<?php
header('Content-Type: text/javascript; charset=utf-8');
?>
即可强行指定输出内容为文本/JavaScript脚本(顺便指定了内容编码),而非可以引发攻击的HTML。
也可以设置 HTML 的 <meta>
标签:
<meta http-equiv="content-security-policy">
"content-security-policy" 内容安全策略 它允许页面作者定义当前页的 内容策略。 内容策略主要指定允许的服务器源和脚本端点,这有助于防止跨站点脚本攻击。
偷个懒引用一下
跨站脚本攻击:(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 都属于服务端的安全漏洞。
预防这两种漏洞,有两种常见做法:
1.改成纯前端渲染,把代码和数据分隔开。
2.对 HTML 做充分转义。 DOM 型 XSS 攻击,实际上就是网站前端 JavaScript 代码本身不够严谨,把不可信的数据当作代码执行了。
在使用 .innerHTML、.outerHTML、document.write() 时要特别小心,不要把不可信的数据作为 HTML 插到页面上,而应尽量使用 .textContent、.setAttribute() 等。
如果用 Vue/React 技术栈,并且不使用 v-html/dangerouslySetInnerHTML 功能,就在前端 render 阶段避免 innerHTML、outerHTML 的 XSS 隐患。
这方面的知识比较欠缺,参考别人的文章学习了一遍,暂时先了解个大概吧。
Cross-Site-Scripting
(跨站脚本攻击),简称XSS
,是一种代码注入攻击。攻击者通过在目标网站上注入恶意脚本,使之在用户的浏览器运行。利用这些恶意脚本,攻击者可获取用户的敏感信息如Cookie、SessionID等,进而危害数据安全。
为了和CSS区分,所以第一个字母改成了X,于是叫做XSS
。
XSS
的本质是:恶意代码未经过滤,与网站正常的代码混在一起;浏览器无法分辨哪些脚本是可信任的,导致恶意脚本被执行。
而由于直接在用户的终端运行,恶意代码能够直接获取用户信息,或者利用这些信息冒充用户向网站发起攻击者定义的请求。
根据攻击的来源,XSS
攻击可分为存储型、反射型和DOM型三种。
存储型XSS的攻击步骤:
这种攻击常见于带有用户保存数据的网站功能:如论坛发帖、商品评论、用户私信等。
反射型XSS的攻击步骤:
反射型XSS跟存储型XSS的区别是:存储型XSS的恶意代码存在数据库里,反射型XSS的恶意代码存在URL里。
反射型XSS漏洞常见于通过URL传递参数的功能:如网站搜索、跳转等。
用于需要用户主动打开恶意的URL才能生效,攻击者往往会结合各种手段诱导用户点击。
POST的内容也可以触发反射型XSS,只不过其触发条件比较苛刻(需要构造表单提交页面,并引导用户点击),所以非常少见。
DOM型XSS的攻击步骤:
DOM型XSS跟前面两种XSS的区别:DOM型XSS攻击中,取出和执行恶意代码由浏览器端完成,属于前端JavaScript自身的安全漏洞,而其他两种XSS都属于服务端的安全漏洞
通过前面的介绍可以得知,XSS
攻击有两大要素:
针对第一个要素:我们是否能够在用户输入的过程,过滤掉用户输入的恶意代码呢?
答案是不可行。一旦攻击者绕过前端过滤,直接构造请求,就可以提交恶意代码了。
我们举一个例子,一个正常的用户输入了5 > 7
这个内容,在写入数据库前被转义,变成了5 < 7
。
问题是:在提交阶段,我们并不确定内容要输出到哪里。
这里的“并不确定内容要输出到哪里”有两层含义:
escapeHTML()
,客户端显示的内容就变成了乱码(5 < 7
)。5 < 7
作为HTML拼接页面时,可以正常显示:<div class="comment">5 lt; 7</div>
5 lt; 7
通过Ajax返回,然后复制给JavaScript变量时,前端得到的字符串就是转移后的字符。这个字符不能用于Vue等模板的展示,也不能直接用于内容长度的计算。不能用于标题、alert等。疑问:展示的时候再进行一次转义是否可以?
所以,输入侧过滤能够在某些情况下解决特定的XSS问题,但会引入很大的不确定性和乱码问题。在防范XSS攻击时应避免此类方法。
当然,对于明确的输入类型,例如数字、URL、电话号码、邮件地址等内容,进行输入过滤还是必要的。
既然输入过滤并非完全可靠,我们就要通过“防止浏览器执行恶意代码”来防范XSS。这部分分为两类:
存储型和反射型XSS都是在服务端取出恶意代码后,插入到相应HTML里的,攻击者刻意编写的“数据”被内嵌到“代码”中,被浏览器执行。
预防这两种漏洞,有两种常见做法:
纯前端渲染的过程:
如果拼接HTML是必要的,就需要采用合适的转义库,对HTML模板各处插入点进行充分的转义。
常用的模板引擎,如doT.js、ejs、FreeMarker等,对于HTML转义通常只有一个规则,就是把& < > " ' /
这几个字符转义掉,确实能起到一定的XSS
防护作用,但是并不完善。
XSS安全漏斗 | 简单转义是否有防护作用 |
---|---|
HTML 标签文字内容 | 有 |
HTML属性值 | 有 |
CSS内联样式 | 无 |
内联JavaScript | 无 |
内联JSON | 无 |
跳转链接 | 无 |
所以要完善XSS
防护措施,我们要使用更完善更细致的转义策略。
DOM型XSS攻击,实际上就是网站前端JavaScript代码本身不够严谨,把不可信的数据当做代码执行了。
在使用.innerHTML
、outerHTML
、document.write()
时要特别小心,不要把不可信的数据作为HTMl插入到页面上,而应尽量使用.textContent
、setAttribute()
等。
如果使用Vue/React技术栈,并且不使用v-html
/dangerousSetInnerHTML
功能,就在前端render阶段避免innerHTML
、outerHTML
的XSS隐患。
DOM中的内联事件监听器,如location
、onclick
、onerror
、onload
、onmouseover
等,<a>
标签的href
属性,JavaScript的eval()
、setTimeout()
、setInterval()
等,都能把字符串作为代码运行。如果不可信的数据拼接到字符串中传递给这些API,很容易产生安全隐患,请务必避免。
虽然在渲染页面和执行JavaScript时,通过谨慎的转义可以防止XSS
的发生,但完全依靠开发的谨慎依然是不够的。以下介绍一些通用的方案,可以降低XSS
带来的风险和后果。
XSS
注入后也无法窃取此Cookie参考:
跨站脚本攻击(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, '>');
}
1.XSS, 即Cross Site Script ,跨站脚本攻击,为了区分层叠样式表(Cascading Style Sheet),因此叫为XSS
2.是一种代码注入工具,攻击者在目标网站上注入恶意代码,当用户访问目标网站时就可能执行这些代码,从而对客户端网页进行篡改,恶意操作,获取cookies,session tokens这些用户隐私数据or诱导被攻击者到钓鱼网站,等等恶意行为
XSS分类可以分为: 放射型(非持久型)、存储型(持久型)、 基于Dom型
放射型
放射型xss把用户输入的数据'反射'给浏览器,这种攻击往往需要用户点击某个恶意链接,或者提交表单,常见于利用通过URL传递参数的功能,如网站搜索,跳转等。 反射型 XSS 的攻击步骤:
由于需要用户主动打开恶意的 URL 才能生效,攻击者往往会结合多种手段诱导用户点击。
存储型XSS会把用户输入的数据“存储”到数据库中,当浏览器请求数据时,脚本从数据库取数据,脚本传回并且执行,这个攻击具有很强的稳定性 常见于带有用户保存数据的网站功能,如论坛发帖、商品评论、用户私信等。 存储型 XSS 的攻击步骤:
1.攻击者将恶意代码提交到目标网站的数据库中。 2.用户打开目标网站时,网站服务端将恶意代码从数据库取出,拼接在 HTML 中返回给浏览器。 3.用户浏览器接收到响应后解析执行,混在其中的恶意代码也被执行。 4.恶意代码窃取用户数据并发送到攻击者的网站,或者冒充用户的行为,调用目标网站接口执行攻击者指定的操作。
反射型 XSS 跟存储型 XSS 的区别是:存储型 XSS 的恶意代码存在数据库里,反射型 XSS 的恶意代码存在 URL 里。
DOM 型 XSS 的攻击步骤: 攻击者构造出特殊的 URL,其中包含恶意代码。 用户打开带有恶意代码的 URL。 用户浏览器接收到响应后解析执行,前端 JavaScript 取出 URL 中的恶意代码并执行。 恶意代码窃取用户数据并发送到攻击者的网站,或者冒充用户的行为,调用目标网站接口执行攻击者指定的操作。
DOM 型 XSS 跟前两种 XSS 的区别:DOM 型 XSS 攻击中,取出和执行恶意代码由浏览器端完成,属于前端 JavaScript 自身的安全漏洞,而其他两种 XSS 都属于服务端的安全漏洞。
现在主流的浏览器内置了防范 XSS 的措施,例如 CSP。但对于开发者来说,也应该寻找可靠的解决方案来防止 XSS 攻击。 比如
Content-Security-Policy: default-src ‘self’ //只允许加载本站资源
- 永远不要相信用户的输入原则:对输入输出内容进行转义,过滤
- 谨慎使用.innnerHTML , .outerHTML,document.write(),尽量使用.textContent, outerHTML代替
- 可以使用HttpOnly防止窃取Cookie
- ...
1.什么是XSS? XSS(Cross-Site Scripting)又称跨站脚本,XSS的重点不在于跨站点,而是在于脚本的执行。XSS是一种经常出现在 Web 应用程序中的计算机安全漏洞,是由于 Web 应用程序对用户的输入过滤不足而产生的 2.XSS分类 常见的 XSS 攻击有三种:反射型、DOM-based 型、存储型。 其中反射型、DOM-based 型可以归类为非持久型 XSS 攻击,存储型归类为持久型 XSS 攻击。 3.如何防范XSS攻击? XSS防御的总体思路是:对输入(和URL参数)进行过滤,对输出进行编码。
(微信名:RUN)
什么是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 做充分转义。
输入内容长度限制。
尽量使用 innerText setAttribute 等
可以使用HttpOnly防止窃取Cookie
(来自百度百科)
什么是XSS攻击 XSS攻击全名(Cross-Site-Script)跨域脚本攻击,为了跟CSS(Cascading-Style-Sheet)区分开来,所以缩写是XSS。
XSS攻击的原理 上一节说道的CSRF攻击是利用的是“伪请求”,这一节的XSS的原理是利用脚本注入的方式。 主要是依靠一切可能的手段,将浏览器中可以执行的脚本(javascript)植入到页面代码中,从而获取用户cookie甚至账号密码等敏感数据使用户造成的一定的损失。 通常利用的是目标网站的发帖、发布产品等需要用户输入的地方,将脚本混淆到html输入中,上传到服务器,再诱导别的用户打开此页面,执行脚本的一个过程。
XSS攻击的方法 xss漏洞是对web客户端(浏览器)的攻击,所以说植入的代码基本上以javascript和html标签(有时也有结合css样式的xss向量)为主。 一般有四种方法:
页面标签附带脚本 Dom 属性附带脚本 请求地址附带脚本 回车空格突破过滤限制 举两个小李子:
<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 = j ava script :a ler t(/xss/)> XSS攻击防御的手段 因为XSS的根本就是向网站插入脚本代码,并使它运行的一种手段。防御方法分为两种,服务端防御和客户端防御。 服务端防御:
1. HTML encode 将字符转换成HTMLEntities,一般会转(&、<、>、"、'、/)这6个字符。一般是在html标签属性输出的时候使用 2. JavaScriptEncode 使用”\“对特殊字符进行转义。 一般在script标签输出、事件输出、CSS输出 3. URL Encode 使用URLEncode的方法。
XSS的英文全称是Cross-Site Scripting,这会与层叠样式表(Cascading Style Sheets, CSS)的缩写混淆。因此有人将跨站脚本攻击缩写为XSS,也叫跨站点脚本,利用网站漏洞从用户那里恶意盗取信息。
来自应用安全国际组织OWASP的建议,对XSS最佳的防护应该结合以下两种方法:验证所有输入数据,有效检测攻击;对所有输出数据进行适当的编码,以防止任何已成功注入的脚本在浏览器端运行。具体如下: 输入验证:某个数据被接受为可被显示或存储之前,使用标准输入验证机制,验证所有输入数据的长度、类型、语法以及业务规则。 输出编码:数据输出前,确保用户提交的数据已被正确进行entity编码,建议对所有字符进行编码而不仅局限于某个子集。 明确指定输出的编码方式:不要允许攻击者为你的用户选择编码方式(如ISO 8859-1或 UTF 8)。 注意黑名单验证方式的局限性:仅仅查找或替换一些字符(如"<" ">"或类似"script"的关键字),很容易被XSS变种攻击绕过验证机制。 警惕规范化错误:验证输入之前,必须进行解码及规范化以符合应用程序当前的内部表示方法。请确定应用程序对同一输入不做两次解码。
当你打开一封Email或附件、浏览论坛帖子时,可能恶意脚本会自动执行,因此,在做这些操作时一定要特别谨慎。建议在浏览器设置中关闭JavaScript。如果使用IE浏览器,将安全级别设置到“高”。具体可以参照浏览器安全的相关文章。 这里需要再次提醒的是,XSS攻击其实伴随着社会工程学的成功应用,需要增强安全意识,只信任值得信任的站点或内容。可以通过一些检测工具进行xss的漏洞检测,类似工具有亿思网站安全检测平台。针对xss的漏洞带来的危害是巨大,如有发现,应立即修复漏洞。
XSS是一种代码注入攻击,攻击者是通过目标网站上注入恶意脚本,使之在用户的浏览器上运行。利用这些恶意脚本,攻击者可以获取用户的敏感信息,进而危害数据安全。
2.反射性XSS 攻击者构造出特殊的URL,其中包含恶意代码。当用户打开带有恶意代码的URL时,网站服务端将恶意代码从URL中取出,拼接在HTML中返回浏览器,之后用户浏览器收到响应后解析执行混入其中的恶意代码,恶意代码窃取用户数据并发送到攻击者的网站,或者冒充用户行为,调用目标网站接口执行攻击者指定的操作。 常见于通过URL传递参数的功能,如网站搜索、跳转。由于需要用户主动打开恶意的URL才能生效,攻击者往往会结合多种手段诱导用户点击。 3.DOM型XSS DOM型XSS主要和前端js有关,是前端js获取用户的输入没有进行过滤后拼接到html中 4.区别 存储型XSS:存储在数据库,属于服务端的安全漏斗 反射型XSS:存在URL中,属于服务端的安全漏洞 DOM型XSS:取出和执行恶意代码由浏览器完成,属于前端JavaScript自身的安全漏洞
- 使用encodeURLComponent对url中的参数进行编码(反射型)
- 对用户的输入进行过滤(适用于所有类型的xss攻击)
- 对用户的输入使用innerText或者textContent进行设置,而不是innerHTML或者outerHTML进行设置
- 服务器端设置cookie为httpOnly让前端无法通过js获取用户的cookie
- 关键请求使用验证码,比如转账请求,避免恶意脚本发送这些关键请求