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