共计 2388 个字符,预计需要花费 6 分钟才能阅读完成。
xss
xss 概念
Cross-Site Scripting(跨站脚本攻打)简称 XSS,是一种代码注入攻打。攻击者通过在指标网站上注入歹意脚本,使之在用户的浏览器上运行。利用这些歹意脚本,攻击者可获取用户的敏感信息如 Cookie、SessionID 等,进而危害数据安全。
为了和 CSS 辨别,这里把攻打的第一个字母改成了 X,于是叫做 XSS。
XSS 的实质是:恶意代码未经过滤,与网站失常的代码混在一起;浏览器无奈分辨哪些脚本是可信的,导致歹意脚本被执行。
而因为间接在用户的终端执行,恶意代码可能间接获取用户的信息,或者利用这些信息假冒用户向网站发动攻击者定义的申请。
在局部状况下,因为输出的限度,注入的歹意脚本比拟短。但能够通过引入内部的脚本,并由浏览器执行,来实现比较复杂的攻打策略。
xss 分类
依据攻打的起源,XSS 攻打可分为存储型、反射型和 DOM 型三种。
类型 | 存储区 * | 插入点 * |
---|---|---|
存储型 XSS | 后端数据库 | HTML |
反射型 XSS | URL | HTML |
DOM 型 XSS | 后端数据库 / 前端存储 /URL | URL |
JavaScript
- 存储区:恶意代码寄存的地位。
- 插入点:由谁获得恶意代码,并插入到网页上。
存储型 XSS
存储型 XSS 的攻打步骤:
- 攻击者将恶意代码提交到指标网站的数据库中。
- 用户关上指标网站时,网站服务端将恶意代码从数据库取出,拼接在 HTML 中返回给浏览器。
- 用户浏览器接管到响应后解析执行,混在其中的恶意代码也被执行。
- 恶意代码窃取用户数据并发送到攻击者的网站,或者假冒用户的行为,调用指标网站接口执行攻击者指定的操作。
这种攻打常见于带有用户保留数据的网站性能,如论坛发帖、商品评论、用户私信等。
反射型 XSS
反射型 XSS 的攻打步骤:
- 攻击者结构出非凡的 URL,其中蕴含恶意代码。
- 用户关上带有恶意代码的 URL 时,网站服务端将恶意代码从 URL 中取出,拼接在 HTML 中返回给浏览器。
- 用户浏览器接管到响应后解析执行,混在其中的恶意代码也被执行。
- 恶意代码窃取用户数据并发送到攻击者的网站,或者假冒用户的行为,调用指标网站接口执行攻击者指定的操作。
反射型 XSS 跟存储型 XSS 的区别是:存储型 XSS 的恶意代码存在数据库里,反射型 XSS 的恶意代码存在 URL 里。
反射型 XSS 破绽常见于通过 URL 传递参数的性能,如网站搜寻、跳转等。
因为须要用户被动关上歹意的 URL 能力失效,攻击者往往会联合多种手段诱导用户点击。
DOM 型 XSS
DOM 型 XSS 的攻打步骤:
- 攻击者结构出非凡的 URL,其中蕴含恶意代码。
- 用户关上带有恶意代码的 URL。
- 用户浏览器接管到响应后解析执行,前端 JavaScript 取出 URL 中的恶意代码并执行。
- 恶意代码窃取用户数据并发送到攻击者的网站,或者假冒用户的行为,调用指标网站接口执行攻击者指定的操作。
DOM 型 XSS 跟前两种 XSS 的区别:DOM 型 XSS 攻打中,取出和执行恶意代码由浏览器端实现,属于前端 JavaScript 本身的安全漏洞,而其余两种 XSS 都属于服务端的安全漏洞。
XSS 攻打的预防
1 输出过滤:在用户提交时,由前端与后端都须要校验下是否符合规范
2 纯前端渲染 在纯前端渲染中,咱们会明确的通知浏览器:上面要设置的内容是文本(.innerText
),还是属性(.setAttribute
),还是款式(.style
)等等。浏览器不会被轻易的被坑骗,执行预期外的代码了。
3 本义 HTML HTML 的编码是十分复杂的,在不同的上下文里要应用相应的本义规定。
4 防止在字符串中拼接不可信数据。DOM 中的内联事件监听器,如 location
、onclick
、onerror
、onload
、onmouseover
等,<a>
标签的 href
属性,JavaScript 的 eval()
、setTimeout()
、setInterval()
等,都能把字符串作为代码运行。如果不可信的数据拼接到字符串中传递给这些 API,很容易产生安全隐患,请务必防止。在应用 .innerHTML
、.outerHTML
、document.write()
时要特地小心,不要把不可信的数据作为 HTML 插到页面上,而应尽量应用 .textContent
、.setAttribute()
等。
5 Content Security Policy
严格的 CSP 在 XSS 的防备中能够起到以下的作用:
- 禁止加载外域代码,避免简单的攻打逻辑。
- 禁止外域提交,网站被攻打后,用户的数据不会泄露到外域。
- 禁止内联脚本执行(规定较严格,目前发现 GitHub 应用)。
- 禁止未受权的脚本执行(新个性,Google Map 挪动版在应用)。
- 正当应用上报能够及时发现 XSS,利于尽快修复问题。
6 其余安全措施
- HTTP-only Cookie: 禁止 JavaScript 读取某些敏感 Cookie,攻击者实现 XSS 注入后也无奈窃取此 Cookie。
- 验证码:避免脚本假冒用户提交危险操作。
CSRF
CSRF(Cross-site request forgery)跨站申请伪造:攻击者诱导受害者进入第三方网站,在第三方网站中,向被攻打网站发送跨站申请。利用受害者在被攻打网站曾经获取的注册凭证,绕过后盾的用户验证,达到假冒用户对被攻打的网站执行某项操作的目标。
一个典型的 CSRF 攻打有着如下的流程:
- 受害者登录 a.com,并保留了登录凭证(Cookie)。
- 攻击者诱惑受害者拜访了 b.com。
- b.com 向 a.com 发送了一个申请:a.com/act=xx。浏览器会默认携带 a.com 的 Cookie。
- a.com 接管到申请后,对申请进行验证,并确认是受害者的凭证,误以为是受害者本人发送的申请。
- a.com 以受害者的名义执行了 act=xx。
- 攻打实现,攻击者在受害者不知情的状况下,假冒受害者,让 a.com 执行了本人定义的操作。
防护策略
阻止不明外域的拜访
- 同源检测
- Samesite Cookie
提交时要求附加本域能力获取的信息
- CSRF Token
- 双重 Cookie 验证