bugbounty:赏金3000美元 在Tokopendia中bypass两个XSS
字数 1243 2025-08-26 22:11:29

Tokopedia XSS漏洞绕过分析与教学

漏洞概述

本教学文档详细分析Tokopedia火车票搜索功能中的反射型XSS漏洞,该漏洞通过巧妙绕过XSS过滤器实现,最终获得3000美元赏金。

漏洞发现背景

  • 时间线
    • 2018年5月:首次发现类似XSS漏洞(被标记为重复)
    • 2019年3月:重新测试并发现新绕过方法
    • 2019年3月28日:报告漏洞
    • 2019年4月8日:漏洞修复
    • 2019年6月11日:获得3000美元赏金

漏洞环境分析

目标URL

https://tiket.tokopedia.com/kereta-api/search/Jakarta-Gambir-GMR/Bandung-Bandung-BD?adult=1&infant=0&trip=departure&dep_date=16-09-2019&ori=GMR&dest=BD

关键点

  • 所有GET参数存储在dataJs.query JavaScript变量中
  • 参数值被反射到JavaScript上下文中

过滤器分析

基本过滤机制

  1. 常规过滤

    • <后跟>字符会被编码(<&lt;>&gt;
    • "被编码为\"
    • \被编码为\\
  2. 特殊参数

    • oridest参数使用不同的编码机制
    • 这两个参数不编码<>字符(除非同时出现<>

过滤器绕过思路

  1. 初始尝试

    • 传统XSS payload:</script><script>alert(1)</script>
    • 或:"}; alert(1); //(被编码阻止)
  2. 关键发现

    • oridest参数不编码单独出现的<>
    • 但会编码同时包含<>的参数

绕过技术详解

分拆payload技术

  1. 利用标签闭合特性

    • 发现</script/>可作为有效的闭合标签
    • 将payload分拆到两个参数中:
      • ori参数:</script/
      • dest参数:>
  2. 完整payload构造

    https://tiket.tokopedia.com/kereta-api/search/Jakarta-Gambir-GMR/Bandung-Bandung-BD?dep_date=26-06-2019&adult=1&infant=0&trip=departure&ori=</script//&dest=><svg/onload=alert(document.location.href))//
    
  3. 执行原理

    • 分拆的payload在反射后组合成有效的HTML标签闭合
    • 浏览器解析为:</script/","dest":"> → 仍被视为有效闭合标签

会话窃取风险

  • Cookie保护缺陷
    • _SID_Tokopedia标记为HttpOnly
    • 但意外存储在dataSession.session.cookies JavaScript变量中
    • 通过XSS可窃取会话

教学总结

关键学习点

  1. 过滤器绕过技术

    • 分拆payload到不同参数绕过<>同时出现的检测
    • 利用浏览器对标签闭合的宽松解析特性
  2. 漏洞挖掘方法

    • 对比不同参数的编码差异
    • 测试特殊字符在不同上下文中的行为
    • 利用浏览器XSS审计工具辅助验证
  3. 防御建议

    • 统一所有参数的编码机制
    • 严格验证所有用户输入
    • 避免在JavaScript中存储敏感信息

实践建议

  1. 测试流程

    • 检查所有输入参数的编码一致性
    • 尝试分拆payload到不同参数
    • 验证浏览器对非标准标签闭合的解析行为
  2. 防御措施

    • 实施内容安全策略(CSP)
    • 确保HttpOnly cookie不通过其他方式暴露
    • 对所有动态内容进行适当的编码

本案例展示了即使看似完善的过滤机制,也可能通过巧妙的payload构造被绕过,强调了全面安全测试的重要性。

Tokopedia XSS漏洞绕过分析与教学 漏洞概述 本教学文档详细分析Tokopedia火车票搜索功能中的反射型XSS漏洞,该漏洞通过巧妙绕过XSS过滤器实现,最终获得3000美元赏金。 漏洞发现背景 时间线 : 2018年5月:首次发现类似XSS漏洞(被标记为重复) 2019年3月:重新测试并发现新绕过方法 2019年3月28日:报告漏洞 2019年4月8日:漏洞修复 2019年6月11日:获得3000美元赏金 漏洞环境分析 目标URL : 关键点 : 所有GET参数存储在 dataJs.query JavaScript变量中 参数值被反射到JavaScript上下文中 过滤器分析 基本过滤机制 常规过滤 : < 后跟 > 字符会被编码( < → &lt; , > → &gt; ) " 被编码为 \" \ 被编码为 \\ 特殊参数 : ori 和 dest 参数使用不同的编码机制 这两个参数不编码 < 和 > 字符(除非同时出现 < 和 > ) 过滤器绕过思路 初始尝试 : 传统XSS payload: </script><script>alert(1)</script> 或: "}; alert(1); // (被编码阻止) 关键发现 : ori 和 dest 参数不编码单独出现的 < 或 > 但会编码同时包含 < 和 > 的参数 绕过技术详解 分拆payload技术 利用标签闭合特性 : 发现 </script/> 可作为有效的闭合标签 将payload分拆到两个参数中: ori 参数: </script/ dest 参数: > 完整payload构造 : 执行原理 : 分拆的payload在反射后组合成有效的HTML标签闭合 浏览器解析为: </script/","dest":"> → 仍被视为有效闭合标签 会话窃取风险 Cookie保护缺陷 : _SID_Tokopedia 标记为HttpOnly 但意外存储在 dataSession.session.cookies JavaScript变量中 通过XSS可窃取会话 教学总结 关键学习点 过滤器绕过技术 : 分拆payload到不同参数绕过 < 和 > 同时出现的检测 利用浏览器对标签闭合的宽松解析特性 漏洞挖掘方法 : 对比不同参数的编码差异 测试特殊字符在不同上下文中的行为 利用浏览器XSS审计工具辅助验证 防御建议 : 统一所有参数的编码机制 严格验证所有用户输入 避免在JavaScript中存储敏感信息 实践建议 测试流程 : 检查所有输入参数的编码一致性 尝试分拆payload到不同参数 验证浏览器对非标准标签闭合的解析行为 防御措施 : 实施内容安全策略(CSP) 确保HttpOnly cookie不通过其他方式暴露 对所有动态内容进行适当的编码 本案例展示了即使看似完善的过滤机制,也可能通过巧妙的payload构造被绕过,强调了全面安全测试的重要性。