一次 XML 上传导致域名被封的经历复盘(腾讯网址安全中心是不是只剩下机器人了)

48 天前
 bugly

事件背景

今年二月为客户开发了一个小程序页面,其中包含用户自定义头像功能。在上传白名单中,我们误将 xml 文件当作 svg 格式放行(后端校验存在疏漏)。不过很快就发现并修复了 bug ,但忽略了这一点竟然已被灰产利用,少数 xml 文件被上传至 OSS 。

问题根源

谁也想不到,这些仅 3KB 大小的 xml 文件中竟含有一行可执行的外部 JS 恶意脚本的代码。它们静静地存储了数月,直到被某些“有缘人”访问触发(看起来访问后会跳转到其他的链接,用来隐藏入口)。

遭遇危机

八月,我们为客户上线了一个宣传页面,投放了朋友圈广告。就在投放结束当晚域名突然被腾讯网址安全中心封禁,无法在微信生态中打开。找了三四天客服,只得到回应:拦截来自手机管家,无法直接处理,给了个入口让去申诉,我们尝试了多种方法申诉,比如:

能想到的所有方案都尝试了,提交的每次申诉,大约 1 小时后,都收到固定的邮件回复:网站存在恶意链接

事件影响

由于恰好发生在广告投放结束当晚,最后一波流量丢了,客户已印制的二维码物料也全部作废,承担了全部赔偿,这个项目等于白干,还丢了客户信任。

后续还有很多影响吧,一些存量客户的小程序嵌入的网页也因域名封禁无法打开,只能逐一协调迁移、更换域名。这件事已经过去半个月,一些过往案例在微信中也无法打开,我们已放弃申诉,损失惨重。

唉,每年各项业务向微信缴纳了大量的费用,却在需要解决问题的时候求助无门,没有标准文档,没有解决问题的方式,只有冷漠的机器回复。

5281 次点击
所在节点    程序员
58 条回复
anivie
48 天前
鸡蛋别放在同一个篮子里……老祖宗的智慧这一块 以后还是多研究一下支付宝小程序的好,至少有个备用方案
不过“遭遇危机”这一栏里,你们是已经把 xml 删掉了再申诉的吗,还是当时还没发现一直在申诉,后续才发觉的
busier
48 天前
垄断惯的毛病
bugly
48 天前
@est 我们是做 VR 、全景之类的在线创意服务,客户 A 定制的小程序允许用户上传头像,有恶意用户通过调用上传接口(接口允许 svg/xml ),然后 xml 被存储到了 bucket 中,接口返回了 url ,这个 url 就是上面提到的。

然后他们把这个 domain.com/xxx.xml 当成链接,引导别人访问,如上截图,会带上一些参数,再由内部的脚本解析参数,跳转到其他的页面。

客户 B 也和我们有合作,然后就是这些文件被识别到了,所在的主域名被封禁了,我们排查问题才发现这些 xml 的问题。。。。
bugly
48 天前
@anivie 第一次申诉会有提示是什么原因,哪些文件造成的,然后就立马删除这些文件了,并遍历了桶内的全部文件。

第二天申诉还是一样的邮件回复,一天只能提交 1 次,我们想了各种方法,比如上面提到的,都是完全一样的邮件回复,坚持申诉了一周多,感觉不会有改变,就放弃了。
bugly
48 天前
@tencentcloud 非常感谢 🙏🙏🙏 确实帮我们解决大问题!

我们后续会加强网站安全建设,避免被黑灰产再次利用。
drymonfidelia
48 天前
@est 因为它用户传的是 xml 根本不是 svg ,只是 svg 本身就是 xml 的一种,它没做好检测被绕过了
est
48 天前
@drymonfidelia 它传的就是 svg 。svg 可以用 js 来做动画。

然后黑产引导用户直接访问这个 svg 链接。这个情况下的确 js 是可以执行的。

然后腾讯检测到,就把 up 主的域名封了。

归根结底还是这个 bucket 没管理好,被人利用来传别的东西,然后当成链接分享出去霍霍了。
AV1
48 天前
svg 内嵌 script ?这个还真没想过
tes286
48 天前
嗯,调用 oss 资源没有签名吗,有签名也不会被黑产引导直接访问链接吧(时效限制)。

还有一些其他的措施,可以缓解,比如加上 Referer 限制,强制将 Content-Type 设置为 application/octet-stream 和 x-content-type-options 为 nosniff ,可以部分缓解该情况。

还有一些法子,应该有用但是不太常规。比如,存图片到 oss 时,先加密,然后展示时前端解密。不用太复杂,也没必要藏密钥。总之就是让机器人识别不出这是什么东西。用 xor 就可以(虽然可能绕过,但是足够应对非针对性的攻击)。

不过最好还是别允许 svg 了吧。
14
48 天前
不仅仅是 svg ,上次我发现有人构造带 script 的 pdf 上传过来
felixcode
48 天前
这个腾讯关不了的站就会有人工客服了
flynaj
48 天前
@jamel 你可能是新人,不知道 V2EX 有全球工单系统的功能。很多新闻都是从 V2EX 出来了。
hanxiV2EX
48 天前
牛逼
Fading2276
47 天前
被封了不奇怪,解封的过程简直是黑色幽默。
alinwu05
47 天前
曾经也经历过基于公众号的 H5 域名被封的经历,也是根本找不到人工客服!最后无奈换域名
busier
47 天前
@bugly 迟到的正义赔偿你损失了吗?
bthulu
47 天前
域名封了就封了啊. 我家附近的电驴充电桩, 经常被封, 昨天扫码跟今天扫码, 弹出来的小程序都可能不是同一个.
你事先就要备好多个域名多个小程序, 封了一个另一个马上补上就行了
liKeYunKeji
47 天前
svg 是可以执行 js 的,大家需要注意,下方是示例代码:
```
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 360 640" preserveAspectRatio="xMidYMid meet" xmlns:xlink="http://www.w3.org/1999/xlink">
<style>
text {
font-size: 24px;
text-anchor: middle;
dominant-baseline: middle;
fill: #333;
}
a {
text-decoration: none;
}
</style>
<a xlink:href="https://www.baidu.com">
<text x="50%" y="10%" id="hello">loading...</text>
</a>
<script type="application/ecmascript">
<![CDATA[
setTimeout(function() {
var textElement = document.getElementById('hello');
textElement.textContent = "点击跳转";
}, 1500);
]]>
</script>
</svg>
```
保存为 test.svg 双击即可运行 js 代码,改成 test.xml 也是一样的道理。
LioMore
47 天前
我们的图标库项目是使用 [svglint]( https://github.com/simple-icons/svglint) 严格要求 SVG 图片的格式
lusyoe
47 天前
感谢楼主,最近新上线的图床之前没注意到这点,现在把 SVG 格式直接禁掉了~
欢迎大家体验免费图床: https://img.lusyoe.com

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://ex.noerr.eu.org/t/1158792

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX