挖洞经验丨印尼电商平台Tokopedia的反射型XSS漏洞
字数 1139 2025-08-18 11:38:45

反射型XSS漏洞挖掘与绕过技术详解

漏洞背景

本文详细分析印尼电商平台Tokopedia火车票票务系统中存在的反射型XSS漏洞(Reflected Cross-Site Scripting),该漏洞通过参数分离构造成功绕过了系统的XSS过滤防护机制。

漏洞发现过程

初始发现

  • 2018年5月首次发现简单XSS漏洞,但被标记为重复报告
  • 2019年3月重新测试发现漏洞依然存在

漏洞位置

  • 存在于火车票票务系统的查票功能中
  • 触发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

技术分析

系统防护机制

  1. 请求参数存储在JS变量dataJs.query
  2. 系统对大多数参数中的危险字符进行编码:
    • " 编码为 \"
    • \ 编码为 \\
    • <> 会被编码(当同时出现时)
  3. 异常行为:
    • oridest参数未对">进行编码
    • 仅对<.*>样式字符串实现过滤

漏洞利用条件

由于上下文环境为JS,需要实现以下方法之一:

  1. 突破JS环境限制:插入</script><script>alert(1)</script>
  2. 突破JS变量限制:插入"}; alert(1); //

过滤绕过技术

  1. 初始尝试:

    • 单独插入<>不被过滤
    • 同时插入<>会被编码
    • 插入><不被编码
  2. 关键绕过技术:

    • 使用//代替>关闭标签(来自AwesomeXSS库的技术)
    • </script/>分离为两部分:
      • </script/放在ori参数
      • >放在dest参数
    • 构造形式:</script/","dest":">

最终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))//

漏洞危害

  1. 会话窃取:
    • 虽然会话cookie _SID_Tokopedia有HTTP-only属性
    • 但系统错误地将其存储在JS变量dataSession.session.cookies
  2. 攻击者可诱骗用户点击恶意链接实现账户劫持

防御建议

  1. 对所有用户输入进行严格的输出编码
  2. 统一所有参数的过滤机制
  3. 避免在JS变量中存储敏感信息
  4. 保持HTTP-only属性的正确实施
  5. 实现内容安全策略(CSP)

漏洞处理时间线

  • 2019.3.28 漏洞初报
  • 2019.4.8 确认为高危漏洞并修复
  • 2019.6.11 发放奖励IDR 3,000,000(约1456元人民币)

参考资源

反射型XSS漏洞挖掘与绕过技术详解 漏洞背景 本文详细分析印尼电商平台Tokopedia火车票票务系统中存在的反射型XSS漏洞(Reflected Cross-Site Scripting),该漏洞通过参数分离构造成功绕过了系统的XSS过滤防护机制。 漏洞发现过程 初始发现 2018年5月首次发现简单XSS漏洞,但被标记为重复报告 2019年3月重新测试发现漏洞依然存在 漏洞位置 存在于火车票票务系统的查票功能中 触发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 技术分析 系统防护机制 请求参数存储在JS变量 dataJs.query 中 系统对大多数参数中的危险字符进行编码: " 编码为 \" \ 编码为 \\ <> 会被编码(当同时出现时) 异常行为: ori 和 dest 参数未对 " 和 > 进行编码 仅对 <.*> 样式字符串实现过滤 漏洞利用条件 由于上下文环境为JS,需要实现以下方法之一: 突破JS环境限制:插入 </script><script>alert(1)</script> 突破JS变量限制:插入 "}; alert(1); // 过滤绕过技术 初始尝试: 单独插入 < 或 > 不被过滤 同时插入 <> 会被编码 插入 >< 不被编码 关键绕过技术: 使用 // 代替 > 关闭标签(来自AwesomeXSS库的技术) 将 </script/> 分离为两部分: </script/ 放在 ori 参数 > 放在 dest 参数 构造形式: </script/","dest":"> 最终Payload构造 漏洞危害 会话窃取: 虽然会话cookie _SID_Tokopedia 有HTTP-only属性 但系统错误地将其存储在JS变量 dataSession.session.cookies 中 攻击者可诱骗用户点击恶意链接实现账户劫持 防御建议 对所有用户输入进行严格的输出编码 统一所有参数的过滤机制 避免在JS变量中存储敏感信息 保持HTTP-only属性的正确实施 实现内容安全策略(CSP) 漏洞处理时间线 2019.3.28 漏洞初报 2019.4.8 确认为高危漏洞并修复 2019.6.11 发放奖励IDR 3,000,000(约1456元人民币) 参考资源 AwesomeXSS漏洞利用库 输出编码最佳实践 OWASP XSS防护指南