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

2 天前
 bugly

事件背景

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

问题根源

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

遭遇危机

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

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

事件影响

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

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

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

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

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

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

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

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

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

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

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

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

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

不过最好还是别允许 svg 了吧。
14
2 天前
不仅仅是 svg ,上次我发现有人构造带 script 的 pdf 上传过来
felixcode
2 天前
这个腾讯关不了的站就会有人工客服了
flynaj
1 天前
@jamel 你可能是新人,不知道 V2EX 有全球工单系统的功能。很多新闻都是从 V2EX 出来了。
hanxiV2EX
1 天前
牛逼
testver
1 天前
被封了不奇怪,解封的过程简直是黑色幽默。
alinwu05
1 天前
曾经也经历过基于公众号的 H5 域名被封的经历,也是根本找不到人工客服!最后无奈换域名
busier
1 天前
@bugly 迟到的正义赔偿你损失了吗?
bthulu
1 天前
域名封了就封了啊. 我家附近的电驴充电桩, 经常被封, 昨天扫码跟今天扫码, 弹出来的小程序都可能不是同一个.
你事先就要备好多个域名多个小程序, 封了一个另一个马上补上就行了
pytth
1 天前
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
1 天前
我们的图标库项目是使用 [svglint]( https://github.com/simple-icons/svglint) 严格要求 SVG 图片的格式
lusyoe
1 天前
感谢楼主,最近新上线的图床之前没注意到这点,现在把 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