文章首发公众号: 海天二路搬砖工
一、什么是XSS攻击
XSS (Cross-site scripting)攻击,即跨站脚本攻击。
攻击者通过在受害者的浏览器中注入恶意代码,攻击受害者的登录凭证、盗取敏感信息或控制受害者的会话等。
XSS攻击是很场景的Web应用攻击类型。
二、XSS攻击的不同类型和原理分析
根据攻击者的角色和攻击载体,XSS攻击可以分为三种类型:
攻击载体 | 攻击者角色 | |
---|---|---|
反射型XSS攻击 | 攻击者制作的网页或链接 | 能够诱发被攻击者打开某个网页的人员 |
存储型XSS攻击 | 攻击者与被攻击者共同使用的Web应用 | 要攻击的网站的用户 |
DOM型XSS攻击 | 目标网站的DOM元素被恶意修改 | 普通用户 |
三、反射型XSS攻击
1. 什么是反射型XSS攻击
反射型XSS攻击是将注入的恶意脚本添加到一个网址中,然后给用户发送这个网址。一旦用户打开这个网址,就会执行脚本并导致攻击。攻击负载和脚本跟随用户点击链接,并被嵌入到响应中,在浏览器上执行。
2. 反射型XSS攻击的原理&步骤
- 攻击者构造一个带有恶意脚本的链接,其链接参数包含用户的输入。
- 将链接发送给受害者。
- 受害者点击链接时,恶意脚本会被浏览器解析并执行,从而执行攻击者的意图。
3. XSS攻击的示例
(1) 攻击者针对www.example.com的一个搜索页定制下面链接
bash
http://www.example.com/search?query=<script>alert('XSS')</script>
(2) 攻击者将连接发送给被攻击者
(3) 被攻击者点开链接后,会执行嵌入的XSS脚本,从而实现攻击者的意图。(比如后去用户Session)
4. 如何预防和防御XSS攻击
从Web应用搭建的维度,可以通过下列措施防范XSS攻击
- **入参的强校验&过滤:**服务器端对参数进行强校验,检查是否存在不安全的字符或脚本(carrot, <,>,/等),并过滤掉它们。所有恶意代码将被替换为相应的字符,它们将被禁止对用户浏览器执行。
- **输出编码/转义:**将用户的输入作为消息从服务器返回时,确保将HTML标签和JavaScript等脚本代码中的特殊字符转义或编码。例如,将<>等字符编码为 <和>以避免它们被浏览器解释为HTML标签。
- **使用HTTPOnly cookie:**HTTPOnly cookie在请求不被攻击者利用基于脚本的执行语言时无法访问,也不能通过document.cookie来访问。这一点可以有效的降低反射型XSS的压力。
- **使用安全控件:**对于特殊页面(例如登录页面),使用验证码和其他安全性控件。
从用户的角度,可以通过下列措施防范XSS攻击
- 提示用户小心恶意链接的存在,防止用户在没有意识到危险的情况下点击恶意链接。
- 浏览器端X-XSS-Protection:这是一个现代浏览器提供的防御措施,可以在发现反射型XSS攻击时自动阻止并提供阻止攻击的选项。使用此功能的网站需要设置X-XSS-Protection标头,并将其设置为1来启用此功能: X-XSS-Protection: 1; mode=block。
四、存储型XSS攻击
1. 什么是存储型XSS攻击
存储型 XSS 攻击指的是攻击者将恶意脚本提交到受害网站的数据库中,当其他用户浏览包含该恶意脚本链接的页面时,就会执行该脚本,从而导致攻击者的目的得以实现。
由于是将恶意脚本保存在数据库中,所有访问包含恶意代码的页面的用户都受到攻击。而且这种攻击方式难解决。
2. 存储型XSS攻击的原理&步骤
(1)攻击者在受害网站上查找存在漏洞的输入表单,例如评论框或搜索框等。
(2)攻击者将恶意代码或脚本插入到输入表单中,以便在提交表单时存储到数据库中。例如,攻击者可以在评论框中插入一段 JavaScript 代码,用于窃取存储在 Cookie 中的会话标识符。
(3)网站接收到含有恶意代码的表单数据,将其存储到数据库中。此时,攻击者的恶意代码已经写入到数据库中并保存下来。
(4)受害用户访问这个包含恶意代码的页面时,恶意代码从数据库中提取出来并在受害用户的浏览器上执行,触发攻击者设定的操作。
(5)攻击者利用受害用户的会话标记等获取受害者的身份和敏感信息。例如,可以利用恶意脚本窃取用户的个人信息、登录凭据或信用卡信息,并发送给攻击者。
3. 如何防御存储型XSS攻击
存储型 XSS 攻击通常比反射型 XSS 攻击更难防止。以下是几种常见的防御措施:
- **输入过滤和验证:**对用户的输入进行强校验。过滤不安全的字符,校验数据类型、长度和格式等是否合法,防止不安全的数据被存储。
- **输出编码/转义:**在输出用户数据之前,对数据进行编码转义,可以使用 HTML 或 URL 编码来处理特殊字符、脚本和标记,以防止恶意代码被执行。
- **防御性编程:**使用安全的 API、利用验证机制、进行限制访问控制。
- **CSP:**Content Security Policy 可以设置白名单和黑名单,限制页面加载的资源类型和来源,防止恶意脚本和样式被加载。
- **使用 HTTPS:**使用 HTTPS 可以防止攻击者在传输过程中窃取会话标识符和敏感数据等信息。
- **限制和控制用户输入:**限制用户可以输入的数据内容、长度和格式。例如,可以使用 HTML5 的 input 标签提供的 pattern 属性限制用户输入的数据类型和格式。
存储型XSS攻击最好的防御措施是:
永远不要相信前端,永远不要相信用户的输入。
五、DOM型XSS攻击
1. 什么是DOM型XSS攻击
DOM 型 XSS 攻击是一种利用 DOM 基于 HTML 解析过程中的安全漏洞进行的跨站攻击。
DOM 型 XSS 攻击不涉及服务器的参与,完全基于客户端的机制,攻击者通过篡改网页中的 DOM 元素和属性,注入恶意代码进而达到攻击目的。
2. DOM型XSS攻击的原理和步骤
DOM型XSS攻击的过程与反射型XSS攻击极其类似,主要差异在于反射型XSS会把攻击脚本传递给服务器,而DOM型XSS不需要,从而可以达到绕过WAF、躲避服务端的检测效果。
DOM型XSS攻击通常分为以下几个步骤:
- 攻击者诱导用户访问一个恶意网站或者跨站点的合法网站。
- 网站中的 JavaScript 脚本将用户输入的数据组合成 DOM 片段。
- 攻击者篡改了 DOM 片段或者修改了 DOM 的属性,注入恶意的脚本,从而执行了非法行为。
- 当浏览器解析 DOM 片段时,执行了恶意脚本,使恶意代码被执行。
- 攻击者成功地窃取了用户敏感信息或者完成了其他非法操作。
3. 如何防御DOM型XSS攻击
DOM型XSS攻击可以通过下面的措施进行防御:
- **输入过滤和验证:**对用户的输入进行强校验。过滤不安全的字符,校验数据类型、长度和格式等是否合法,防止不安全的数据被存储。
- **输出编码/转义:**在输出用户数据之前,对数据进行编码转义,可以使用 HTML 或 URL 编码来处理特殊字符、脚本和标记,以防止恶意代码被执行。
- **使用 innerText 或 textContent 而不是 innerHTML:**避免将用户输入的数据直接插入到 innerHTML 中。可以使用白名单机制过滤不安全的标记,或使用innerText、textContent 等安全的API。
- **使用Content Security Policy(CSP):**CSP 可以设置白名单和黑名单,限制页面加载的资源类型和来源,从而防止恶意脚本和样式被加载。
- **使用安全沙箱:**应用沙盒技术限制 JavaScript 运行的环境,从而可以防止恶意 JS 脚本操作或者篡改文档 DOM 等。
- **更新和升级浏览器:**定期升级浏览器,减少已知红旗漏洞的影响。
六、总结
XSS攻击可以分为三种类型:反射型XSS攻击、存储型XSS攻击以及DOM型XSS攻击。
反射型XSS攻击是将攻击脚本注入到URL中,服务器解析时将注入代码反射到浏览器中,从而实现攻击目的。
存储型XSS攻击是攻击者将恶意脚本代码提交到受害网站的数据库中,当其他用户浏览包含该恶意脚本链接的页面时,就会执行该脚本,从而导致攻击者的目的得以实现。
DOM 型 XSS 攻击则是一种利用 DOM 基于 HTML 解析过程中的安全漏洞进行的跨站攻击,攻击者通过篡改网页中的 DOM 元素和属性,注入恶意代码从而窃取用户的敏感信息或实施其他违法操作。
针对上述三种XSS攻击,开发者应该实施多项安全措施。比如对输入和输出数据进行过滤和编码,限制用户的输入内容及长度、格式等,避免直接将用户输入内容放到 innerHTML 函数中;采用Content Security Policy(CSP)等安全措施来防御DOM型XSS攻击;使用安全沙箱、限制访问控制、升级浏览器等应对反射型 XSS 和存储型 XSS 攻击。开发者需要加强对 Xss攻击的了解及安全方案的实施,保护用户的网络安全。