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.queryJavaScript变量中 - 参数值被反射到JavaScript上下文中
过滤器分析
基本过滤机制
-
常规过滤:
<后跟>字符会被编码(<→<,>→>)"被编码为\"\被编码为\\
-
特殊参数:
ori和dest参数使用不同的编码机制- 这两个参数不编码
<和>字符(除非同时出现<和>)
过滤器绕过思路
-
初始尝试:
- 传统XSS payload:
</script><script>alert(1)</script> - 或:
"}; alert(1); //(被编码阻止)
- 传统XSS payload:
-
关键发现:
ori和dest参数不编码单独出现的<或>- 但会编码同时包含
<和>的参数
绕过技术详解
分拆payload技术
-
利用标签闭合特性:
- 发现
</script/>可作为有效的闭合标签 - 将payload分拆到两个参数中:
ori参数:</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))// -
执行原理:
- 分拆的payload在反射后组合成有效的HTML标签闭合
- 浏览器解析为:
</script/","dest":">→ 仍被视为有效闭合标签
会话窃取风险
- Cookie保护缺陷:
_SID_Tokopedia标记为HttpOnly- 但意外存储在
dataSession.session.cookiesJavaScript变量中 - 通过XSS可窃取会话
教学总结
关键学习点
-
过滤器绕过技术:
- 分拆payload到不同参数绕过
<和>同时出现的检测 - 利用浏览器对标签闭合的宽松解析特性
- 分拆payload到不同参数绕过
-
漏洞挖掘方法:
- 对比不同参数的编码差异
- 测试特殊字符在不同上下文中的行为
- 利用浏览器XSS审计工具辅助验证
-
防御建议:
- 统一所有参数的编码机制
- 严格验证所有用户输入
- 避免在JavaScript中存储敏感信息
实践建议
-
测试流程:
- 检查所有输入参数的编码一致性
- 尝试分拆payload到不同参数
- 验证浏览器对非标准标签闭合的解析行为
-
防御措施:
- 实施内容安全策略(CSP)
- 确保HttpOnly cookie不通过其他方式暴露
- 对所有动态内容进行适当的编码
本案例展示了即使看似完善的过滤机制,也可能通过巧妙的payload构造被绕过,强调了全面安全测试的重要性。