文章目录
第一部分:概述
1.什么是 XSS?
跨站脚本(XSS)是一种代码注入攻击,允许攻击者在另一个用户的浏览器中执行恶意的 JavaScript 代码。攻击者利用受害者访问的网站漏洞,让网站传送恶意 JavaScript 代码,使其看起来像是网站的正常部分,而网站成为攻击者的帮凶。
2.恶意 JavaScript 代码的注入方式
攻击者在受害者浏览器中运行恶意 JavaScript 代码的方法是将其注入到受害者从网站加载的某个页面中。攻击者可以通过插入字符串使浏览器将其视为可执行代码。例如,在评论框中插入 <script>…</script>
可以成功执行攻击。
假设评论只包含文本。但是,由于用户输入直接包含在网页中,攻击者可以提交这样的评论:“”。(恶意代码)任何访问该页面的用户都会收到以下响应:
3.恶意 JavaScript 代码的危害
- JavaScript 可以访问用户的敏感信息,如 cookie。
- JavaScript 可以发送 HTTP 请求到任意目的地。
- JavaScript 可以修改当前页面的 HTML。
这些事实的结合可能导致严重的安全漏洞。
4.恶意 JavaScript 代码的后果
- Cookie 盗取: 攻击者可以访问用户的 cookie 信息,发送到自己的服务器,并提取敏感信息。
- 键盘记录: 攻击者可以记录用户按键,可能获取敏感信息,如密码和信用卡号。
- 网络钓鱼: 攻击者可以插入假的登录表单,引诱用户提交敏感信息。
- 流量劫持: 攻击者插入跳转链接,引导访问者点击并被重定向。
这些攻击都有一个共同点:攻击者将代码注入到网站提供的页面中,使恶意 JavaScript 在网站上下文中执行。
关键问题
如果攻击者能够在另一个用户的浏览器中执行任意 JavaScript,网站和用户的安全将受到威胁。
第二部分:跨站脚本攻击
一.XSS 攻击中的参与者
在详细描述 XSS 攻击的运作方式之前,我们需要定义参与 XSS 攻击的各方。 通常,一个 XSS 攻击涉及三个参与者: 网站、受害者和攻击者。
• 网站 (website): 为请求的用户提供 HTML 页面。在我们的例子中,它位于 http://website/。
• 网站数据库 (website’s database): 存储网站页面中包含的一些用户输入的数据库。
• 受害者 (victim): 网站的普通用户,使用浏览器请求其页面。
• 攻击者 (attacker): 网站的恶意用户,打算通过利用网站的 XSS 漏洞攻击受害者。
• 攻击者的服务器 (attacker’s server): 由攻击者控制的网络服务器,其唯一目的是窃取受害者的敏感信息。 在我们的例子中,它位于 http://attacker/。
请注意,这只是一个简化的模型,现实世界的 XSS 攻击可能涉及更多的参与者和更复杂的场景。
二. XSS 攻击类型
XSS 攻击通常分为三种类型:
- 存储型 XSS (Persistent XSS): 恶意字符串存储在网站数据库中,后续显示给用户。
- 反射型 XSS (Reflected XSS): 恶意字符串反射到用户浏览器,通过构造恶意链接触发攻击。
- DOM-based XSS: 恶意代码修改浏览器中的 DOM 环境,使客户端代码意外执行。
三. 存储型 XSS 攻击
存储型 XSS 是指攻击者通过某种方法将恶意字符串存储在网站的数据库中,并在以后显示给用户。
例如,一个网站允许用户在评论框中输入评论。攻击者可以利用此漏洞,在评论框中输入恶意 JavaScript 代码。当其他用户查看该评论时,恶意 JavaScript 代码就会在他们的浏览器中执行。
以下是一个存储型 XSS 攻击的典型例子:
随即,此条评论被存储到该网站某个数据库
受害者:
当其他用户查看该评论时,恶意 JavaScript 代码就会从数据库中取出并在他们的浏览器中执行,弹出一个警告框显示hello world!
以下图表展示了攻击者如何执行此示例攻击:
- 攻击者发现网站漏洞。
- 攻击者将恶意代码注入到网站数据库。
- 受害者向网站请求一个页面,网站在响应中包含来自数据库的恶意字符串,并将其发送给受害者。
- 受害者的浏览器执行响应中的恶意脚本,将受害者的 Cookie 发送到攻击者(攻击者服务器)。
四. 反射型 XSS 攻击
Reflected XSS(跨站脚本攻击)是指攻击者将恶意脚本注入到网站中,而网站将这些脚本反射回用户的浏览器。攻击者通过构造恶意的URL或其他用户可控制的输入,将恶意脚本注入到目标网页中,然后通过诱使用户点击包含恶意脚本的链接来触发攻击。这种类型的XSS攻击中,恶意脚本并不存储在目标网站的数据库中,而是在用户请求中直接反射到浏览器,然后由浏览器执行。
以下是反射型XSS攻击的详细示例(特别注意第3点)。
如果不理解上述示例,可以参考reflected xss示例
下图说明了这种情况:
- 攻击者发现网站漏洞可以注入脚本。
- 攻击者将可以盗取访问者cookie的恶意代码注入到网站,生成链接发送给目标用户。
- 受害者访问该网站(链接),恶意代码被执行。
- 将受害者的 Cookie 发送到攻击者(攻击者服务器)。
五. DOM-Based XSS 攻击
DOM-Based XSS(有时在某些文本中称为“type-0 XSS”)是一种跨站脚本攻击(XSS),其中攻击载荷由于修改了原始客户端端脚本在受害者浏览器中使用的DOM“环境”而执行,从而使客户端代码以“意外”的方式运行。也就是说,页面本身(即HTTP响应)没有发生变化,但由于DOM环境中发生的恶意修改,页面中包含的客户端代码会以不同的方式执行。
这与其他XSS攻击(存储型或反射型)形成对比,其中攻击载荷由于服务器端缺陷而被放置在响应页面中。
具体来说,DOM-Based XSS攻击利用了JavaScript在浏览器中处理用户输入的方式。攻击者通过操纵页面上的DOM元素,向页面注入并执行恶意脚本。这种攻击通常发生在客户端,而不涉及将恶意代码传递到服务器。
DOM-Based XSS 示例
在这个例子中,代码创建了一个表单,允许用户选择时区。查询字符串中还有一个默认时区,由default参数定义。代码如下:
页面是通过类似以下URL的方式调用的:
攻击场景: 攻击者可以构造一个URL,如下:
随后通过某种方式发送给受害者,如果受害者访问这个URL,恶意脚本将被写入select元素的选项中,并由浏览器执行。这可以允许攻击者窃取受害者的cookie,重定向到钓鱼站点,或执行其他恶意操作。
第三部分:XSS 防御
不同类型的XSS攻击需要采用不同的防御措施。以下是针对不同XSS类型的防御策略:
1. 存储型 XSS 防御:
输入验证: 对用户输入进行严格的验证,只允许合法的字符和格式。
- 输出编码: 在将用户输入输出到页面时,使用合适的编码函数(如HTML编码、JavaScript编码)来转义特殊字符,防止其被当作代码执行。
- 内容安全策略(CSP): 使用CSP头部限制页面中可以执行的脚本源,降低攻击面。
2. 反射型 XSS 防御:
- 输入验证: 对从URL参数、表单等获取的用户输入进行验证,只接受合法的输入。
- 输出编码: 在将用户输入输出到页面时,使用合适的编码函数,确保用户输入不会被当作代码执行。
- HTTP Only Cookie: 使用HTTP Only Cookie,限制JavaScript对cookie的访问,减少敏感信息泄露的风险。
3. DOM-Based XSS 防御:
安全编码实践: 使用安全的DOM API方法,避免使用危险的DOM操作,如document.write。
- 输入验证和转义: 对从URL或其他用户输入获取的数据进行验证和适当的编码,确保在DOM中不会执行恶意脚本。
- 限制脚本源: 使用CSP头部限制页面中可以执行的脚本源。
4. 客户端 XSS 防御:
- 内容安全策略(CSP): 在HTTP头中设置CSP策略,限制允许加载的资源和执行的脚本源。
- 禁用不必要的脚本: 禁用或限制网页中不必要的脚本,例如内联脚本或动态脚本加载。
- 使用安全框架: 使用现代的JavaScript框架,这些框架通常包含内置的防御机制。
5. 其他通用防御措施:
- 安全开发实践: 遵循安全的开发实践,包括代码审查、安全培训和漏洞扫描。
- 定期更新和维护: 及时应用安全补丁,保持系统组件和库的更新状态。
- 监控和日志: 设置监控机制,及时检测并记录可能的攻击行为,以便进行响应。
引用
• https://owasp.org/www-community/attacks/DOM_Based_XSS
• https://www.imperva.com/learn/application-security/cross-site-scripting-xss-attacks/
• https://www.imperva.com/learn/application-security/reflected-xss-attacks/#:~:text=Reflected%20XSS%20attacks%2C%20also%20known,enables%20execution%20of%20malicious%20scripts.
• https://www.imperva.com/learn/application-security/cross-site-scripting-xss-attacks/
• https://owasp.org/www-community/attacks/xss/#stored-and-reflected-xss-attacks
• https://cheatsheetseries.owasp.org/cheatsheets/XSS_Filter_Evasion_Cheat_Sheet.html