🔍 什么是XSS漏洞?
跨站脚本攻击(Cross-Site Scripting,简称XSS)是一种常见的Web安全漏洞,
攻击者通过在网页中注入恶意脚本代码,当其他用户浏览该网页时,
注入的恶意代码会在用户浏览器中执行,从而窃取用户信息、劫持用户会话或进行其他恶意操作。
⚠️ 为什么叫XSS而不是CSS?
为了避免与层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,
跨站脚本攻击缩写为XSS。
📋 XSS的三种主要类型
反射型XSS
(Reflected XSS)
反射型XSS是最常见的XSS类型。攻击代码通过URL参数或表单提交传递给服务器,
服务器将恶意代码直接反射回浏览器并执行。这种攻击通常需要诱导用户点击特制的恶意链接。
典型场景:
搜索功能、错误提示页面、URL参数回显
// 漏洞代码示例
<div>搜索结果:<?php echo $_GET['keyword']; ?></div>
// 攻击URL
http://example.com/search?keyword=<script>alert('XSS')</script>
存储型XSS
(Stored XSS)
存储型XSS是危害最大的XSS类型。攻击代码被永久存储在服务器端(如数据库、文件系统),
当其他用户访问包含恶意代码的页面时,代码会自动执行。这种攻击影响范围广,持续时间长。
典型场景:
留言板、评论系统、用户资料、文章内容
// 漏洞代码示例
<div class="comment">
<?php echo $comment['content']; ?>
</div>
// 攻击payload存储在数据库
INSERT INTO comments (content) VALUES ('<img src=x onerror=alert(1)>');
DOM型XSS
(DOM-based XSS)
DOM型XSS是一种特殊的XSS类型,攻击代码不经过服务器,
完全在客户端通过JavaScript操作DOM时触发。这种攻击难以被传统的服务器端防护措施检测。
典型场景:
前端路由、动态内容渲染、URL片段处理
// 漏洞代码示例
<script>
var keyword = location.search.substring(1);
document.getElementById('result').innerHTML = keyword;
</script>
// 攻击URL
http://example.com/#<img src=x onerror=alert(1)>
🛡️ XSS防御措施
1. 输入验证和过滤
- 对所有用户输入进行严格验证
- 使用白名单而非黑名单
- 限制输入长度和格式
2. 输出编码
- HTML实体编码:将 < > " ' & 等特殊字符转义
- JavaScript编码:对插入到JS代码中的数据进行编码
- URL编码:对URL参数进行编码
- CSS编码:对插入到CSS中的数据进行编码
// PHP示例
echo htmlspecialchars($userInput, ENT_QUOTES, 'UTF-8');
// JavaScript示例
function escapeHtml(text) {
return text.replace(/[<>"'&]/g, function(m) {
return {'<':'<','>':'>','"':'"',"'":''','&':'&'}[m];
});
}
3. 使用安全的API
- 使用 textContent 而不是 innerHTML
- 使用 setAttribute 而不是直接操作属性
- 避免使用 eval()、setTimeout(string) 等危险函数
4. Content Security Policy (CSP)
通过HTTP头部设置CSP策略,限制页面可以加载和执行的资源:
Content-Security-Policy: default-src 'self'; script-src 'self' 'unsafe-inline'
5. HttpOnly Cookie
设置Cookie的HttpOnly标志,防止JavaScript访问Cookie:
Set-Cookie: sessionid=xxx; HttpOnly; Secure; SameSite=Strict
🎯 开始实战练习
现在你已经了解了XSS漏洞的基本原理和防御方法,
是时候通过实战练习来提升你的安全测试技能了!
我们为你准备了9个不同难度的XSS挑战关卡,
从简单的无过滤注入到复杂的WAF绕过,
每个关卡都会让你学到新的攻击技巧和绕过方法。
⚠️ 安全声明
本靶场仅用于安全学习和测试目的。请勿将所学技术用于攻击真实网站或进行任何非法活动。
作为安全研究者,我们应该遵守法律法规,负责任地使用安全知识。