V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
bugly
V2EX  ›  程序员

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

  •  3
     
  •   bugly · 1 天前 · 3220 次点击

    事件背景

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

    问题根源

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

    imgurl

    遭遇危机

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

    • 逐个清理资源文件,甚至整个文件夹,刷新 CDN 缓存,再提交申诉;
    • 将客户资源迁移至新的 OSS ,更换解析路线,再次申诉;
    • 甚至在夜里偷偷停止解析域名,再去填写申诉材料都无效。

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

    imgurl

    事件影响

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

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

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

    第 1 条附言  ·  1 天前
    在加班没看回复,感谢各位的关注,@tencentcloud 确实是官方,应该是通过🔗查询到了域名,已经核实帮我处理解封了,在此非常感谢。

    小公司没有那么多安全防御资源,我们有一直依靠采购云上的各种检测服务。早期为了解决跨域和资源共享的问题,都放在一个 bucket ,后续我们会做一些架构调整,真诚感谢大家的建议。
    52 条回复    2025-09-13 21:38:35 +08:00
    RihcardLu
        1
    RihcardLu  
       1 天前
    深有同感,之前一个小程序也因为一张莫名其妙的图片,被腾讯封了,前前后后耗时一个多月,最终也只是降级到“打开网址会有风险提示”这种程度
    NessajCN
        2
    NessajCN  
       1 天前
    你希望我们同情一下还是帮你喷一下腾讯呢
    你说你「无意」投放了带恶意链接的 xml
    姑且先不纠结为啥你们一开始会有这么个 xml,
    也信了你们只是菜而不是坏
    那既然你们行为确实恶劣影响,恶意脚本也实实在在让很多用户受害
    那仅仅封一个域名不是很轻的惩罚了吗,
    较真一点可以直接找网安调查一下你们才对。
    经济损失也是你们活该
    bugly
        3
    bugly  
    OP
       1 天前   ❤️ 3
    @NessajCN 不知道哪里恶劣了,黑灰产利用漏洞拿 xml 做了跳板,我们同为受害者。
    我分享经历只是让大家能注意到这个问题,避免更多人犯同样的低级错误。
    tencentcloud
        4
    tencentcloud  
       1 天前
    尊敬的用户您好,我们非常重视您反馈的问题,并对由此给您带来的不便深表歉意。腾讯云始终致力于为客户提供稳定可靠的服务,对于您遇到的域名封禁及申诉处理问题,我们已第一时间同步内部相关团队进行核查,并将积极协助您推进解决。为确保您的问题得到更高效的处理,请您将腾讯云账号 ID 或域名信息通过([email protected]) 邮箱发送给我们,感谢您的理解与支持。
    tomatocici2333
        5
    tomatocici2333  
       1 天前
    这个更多是你们开发者的问题吧。就不应该开放 svg 的上传..
    vace
        6
    vace  
       1 天前   ❤️ 1
    类似于 XXS 的 XXE 漏洞,如果使用 svg 图片作为矢量图要多注意:
    https://github.com/rtnthakur/CVE/blob/main/MODX/README.md
    JoeJoeJoe
        7
    JoeJoeJoe  
    PRO
       1 天前
    最好每个项目都独立域名, 手里最少存一个备案过得应急域名

    要不某个项目被风控, 就会牵连一大片项目.
    jamel
        8
    jamel  
       1 天前
    @tencentcloud 你是真的还是假的。v2 里面怎么还有官方???
    tencentcloud
        9
    tencentcloud  
       1 天前
    尊敬的用户您好!经复核您反馈的域名因存在恶意文件触发的安全拦截现已解除。我们对申诉流程中的不好体验深表歉意,后续我们将优化审核机制,提供更清晰的处置指引。若您有任何疑问或建议,请随时通过工单系统联系我们,我们将尽快协助您解决。感谢您的反馈与信任!
    python35
        10
    python35  
       1 天前 via iPhone
    @jamel 这个应该是真官方 具体能不能解问题就不知道了 这个主题应该发在全球工单系统🤣
    xiangbohua
        11
    xiangbohua  
       1 天前   ❤️ 1
    @NessajCN 好像 xml 是其他人利用漏洞上传上去的,不是 OP 自己上传上去的,总之这么一想真的还是挺吓人的
    lepig
        12
    lepig  
       1 天前
    上面的 @tencentcloud 已经反馈你们的安全拦截已被解除。 请楼主出来确认一下。
    Liuman
        13
    Liuman  
       1 天前
    @NessajCN 我看文中 是 OP 他们上传了一个页面,可以上传头像, 其他人上传了带恶意 js 的 svg 图片,所以导致的问题,不是 OP 投放的链接 XML
    devcai
        14
    devcai  
       1 天前
    腾讯的客服是真的弱 收钱是真的会收 最近注册公司做业务 一个公司四五个认证
    微信开放平台 微信服务号 微信公众号 企业微信 小程序 每个都要单独出钱年审, 垄断了没办法。
    unused
        15
    unused  
       1 天前
    封是真没什么问题,关键是要及时解
    lambdaq
        16
    lambdaq  
       1 天前
    svg 这个学习了!

    小程序嵌入的网页也因域名封禁无法打开 这个最好另外弄个域名跳转,避免牵连
    Configuration
        17
    Configuration  
       1 天前   ❤️ 5
    @tencentcloud 真够讽刺的,官方渠道全是机器人,外部私人论坛倒是有活人盯着!
    zturns
        18
    zturns  
       1 天前
    连 LOL 买皮肤不到账找一圈官网都找不到客服,腾讯系不会再充钱
    est
        19
    est  
       1 天前   ❤️ 2
    @bugly @vace @tomatocici2333 @Liuman

    有一个技术细节问题,svg 我之前研究过 https://blog.est.im/2023/stdout-10

    svg 如果放到 <img> ,那么浏览器会禁止加载任何外部资源,脚本也禁止执行

    除非你放到 <object>, <embed>, <iframe> 里,或者直接把 svg 内容嵌入到 .html 的 <svg> 里

    LZ 你这个怎么触发的?
    est
        20
    est  
       1 天前
    我猜,这个头像,没有在你们 小程序 里出的问题,而是头像资源被嵌入到别的什么页面里引起和你们无关的人访问,然后腾讯把你们域名给牵连了?
    anivie
        21
    anivie  
       1 天前
    鸡蛋别放在同一个篮子里……老祖宗的智慧这一块 以后还是多研究一下支付宝小程序的好,至少有个备用方案
    不过“遭遇危机”这一栏里,你们是已经把 xml 删掉了再申诉的吗,还是当时还没发现一直在申诉,后续才发觉的
    busier
        22
    busier  
       1 天前 via Android
    垄断惯的毛病
    bugly
        23
    bugly  
    OP
       1 天前
    @est 我们是做 VR 、全景之类的在线创意服务,客户 A 定制的小程序允许用户上传头像,有恶意用户通过调用上传接口(接口允许 svg/xml ),然后 xml 被存储到了 bucket 中,接口返回了 url ,这个 url 就是上面提到的。

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

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

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

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

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

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

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

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

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

    不过最好还是别允许 svg 了吧。
    14
        30
    14  
       23 小时 45 分钟前
    不仅仅是 svg ,上次我发现有人构造带 script 的 pdf 上传过来
    felixcode
        31
    felixcode  
       23 小时 40 分钟前 via Android   ❤️ 2
    这个腾讯关不了的站就会有人工客服了
    flynaj
        32
    flynaj  
       21 小时 16 分钟前 via Android
    @jamel 你可能是新人,不知道 V2EX 有全球工单系统的功能。很多新闻都是从 V2EX 出来了。
    hanxiV2EX
        33
    hanxiV2EX  
       17 小时 47 分钟前 via Android
    牛逼
    testver
        34
    testver  
       15 小时 19 分钟前   ❤️ 1
    被封了不奇怪,解封的过程简直是黑色幽默。
    alinwu05
        35
    alinwu05  
       14 小时 28 分钟前
    曾经也经历过基于公众号的 H5 域名被封的经历,也是根本找不到人工客服!最后无奈换域名
    busier
        36
    busier  
       14 小时 8 分钟前 via iPhone
    @bugly 迟到的正义赔偿你损失了吗?
    bthulu
        37
    bthulu  
       14 小时 8 分钟前
    域名封了就封了啊. 我家附近的电驴充电桩, 经常被封, 昨天扫码跟今天扫码, 弹出来的小程序都可能不是同一个.
    你事先就要备好多个域名多个小程序, 封了一个另一个马上补上就行了
    pytth
        38
    pytth  
       13 小时 45 分钟前
    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
        39
    LioMore  
       13 小时 41 分钟前
    我们的图标库项目是使用 [svglint]( https://github.com/simple-icons/svglint) 严格要求 SVG 图片的格式
    lusyoe
        40
    lusyoe  
       13 小时 18 分钟前
    感谢楼主,最近新上线的图床之前没注意到这点,现在把 SVG 格式直接禁掉了~
    欢迎大家体验免费图床: https://img.lusyoe.com
    bugly
        41
    bugly  
    OP
       12 小时 47 分钟前
    @tes286
    我们的业务大部分不涉及后端,前端开发完流水线同步发布到 oss ,通过用 CDN 访问,由于全景之类的项目会生成很多 xml 文件,文件内又有各种资源的引用,还要考虑性能等各种限制,所以对资源进行签名难度比较高。而且我们一直把 xml 当作一种可信任的配置格式。


    @busier
    被封禁能理解,主要是解决问题的过程曲折,损失的部分是学费吧。


    @bthulu
    一直兢兢业业,平时也很注意安全,连诱导分享都不敢做,所以没有提前准备对抗手段。😭
    jjx
        42
    jjx  
       12 小时 16 分钟前
    封可以

    但应该提示正确的问题原因

    解决后解封

    关键不是封,而是处理方式太恶心
    lscho
        43
    lscho  
       11 小时 19 分钟前
    @bugly 感觉你 #3 这句 “黑灰产利用漏洞拿 xml 做了跳板,我们同为受害者”这种心态存在很大误区,包括其他很多从业者,都存在很大误区。。。

    主体是受害人没错,但更大的是责任人,是责任人,是责任人。。是你们自己开发存在漏洞,才导致后续一系列后果。第一责任人是你们自己。如果因为漏洞造成用户的损失,第一责任人还是你们。
    unused
        44
    unused  
       11 小时 13 分钟前 via Android
    @pytth 感谢你的示例,v2ex 马上被封
    illl
        45
    illl  
       10 小时 44 分钟前 via iPhone
    @vace 这个就是 xss 漏洞,不是 xxe
    bugly
        46
    bugly  
    OP
       10 小时 42 分钟前
    @lscho 第一责任人不应该是干坏事和因此获利的人吗,谁能保证自己业务的几十万行代码,每一行都安全呢。如果这样推论:坏人去 A 家拿了菜刀砍人,A 是第一责任人,就因为 A 没锁上厨房的门、没把菜刀放保险箱?

    再向上推论微信平台、手机的存在才导致这一系列的后果,如果没有微信、没有手机、没有互联网,就不会有人在网上上当受骗。
    thirteen7
        47
    thirteen7  
       10 小时 38 分钟前
    讲个笑话,网易云都被搞过,更何况小企业了.
    justfun
        48
    justfun  
       8 小时 42 分钟前
    我两年前刚注册的域名都被微信直接屏蔽 说有危险链接,可是我甚至还未个这个域名做任何解析。也是申诉了将近一个月 才找到真人客服帮我处理了。
    pytth
        49
    pytth  
       5 小时 20 分钟前   ❤️ 1
    现在黑产因为需要依赖微信内的正常访问的域名,自己注册域名的风险很高,因此是每天都要去挖漏洞,来避免一些问题,1 是避免被查; 2 是降低域名的开销; 3 是减慢被封的速度;尤其是大厂大公司知名企业的域名,很多黑产都是比较喜欢的,因此腾讯、百度、网易、小米、美团、新浪、阿里等企业的域名很多都存在 XSS 以及文件上传漏洞。
    -
    常见于以下地方:
    1 、微信小程序头像上传、反馈、发布;
    2 、APP 的头像上传、文件上传、实名认证、营业执照上传等地;
    3 、网页的文件上传例如富文本编辑器、头像上传、附件上传;
    -
    漏洞常见问题:
    1 、对象存储可通过重放,html 文件改后缀为 png 即可上传,一般没有做文件类型校验的对象存储;
    2 、重放时 Content-Type:image/png ,改为 text/html 也可以轻松绕过,仍然是文件类型校验不严谨所致;
    3 、验证 Content-Type 和后缀名,但是并未验证真实的二进制数据,在 html 代码中混入图片的头信息当然可以传上去;
    4 、后缀名只限制 html ,但是未限制 htm\xhtml\xhtm\shtml\mhtm 等类型,这些仍然存在上传的风险;
    5 、未限制 svg 和 xml 的上传,这些是存在执行 js 代码的风险的;
    6 、对象存储容易通过 URL 传递?response-content-type=临时改变文件执行类型,上传的是 png ,链接虽然得到,但是无法执行 html ,对象存储可以拼接 ?response-content-type=text/html 即可将 png 作为 html 执行,即可出发 js 代码
    -
    以上是本人分析过很多很多黑产的一些常见案例。
    lscho
        50
    lscho  
       5 小时 11 分钟前
    @illl 写代码存在漏洞和被人强行攻击是两码事,所以你的举例不对。。。。代码有漏洞是你盖的房子有质量问题,并不是 A 没上锁。

    如果是被 ddos 攻击,这才和你的举例一样。感觉你从头到尾都没有理解网络安全。因为网站是因为主体的需求而产生的,并不是因为“再向上推论微信平台、手机的存在”,因为主体的需求才产生了这个业务,如果因为主体没有做好安全防护,导致客户收到损失,主体就是第一责任人。

    中华人民共和国网络安全法已经写的很清楚了
    bugly
        51
    bugly  
    OP
       1 小时 56 分钟前
    @lscho 我觉得你说的对,

    一:我因为此次事件对我客户造成的损失,确实是第一责任人,这个道理我明白,也承担了客户的全部损失。
    二,微信因为恶意文件的存在,封禁我的域名,我也能理解,我按照流程复查处理、申诉;
    三:假如有人通过访问这个 xml 文件,再跳转到诈骗页面,这个人上当受骗,我也还是第一责任人吗?
    lscho
        52
    lscho  
       1 小时 39 分钟前
    @bugly 网络安全法中对网络安全实行的是等级保护制度。

    如果你们企业履行了符合自身等级的网络安全等级保护制度,那么你们有可能不是第一责任人。但是从你的描述中,几乎可以确定没有履行。所以你们就是第一责任人。因为用户和平台是契约关系,至于平台被攻击,那是平台和攻击人之间的事,这是两个概念。

    其实也就是事情发生到你们身上,你才觉得难以理解。换个说法,你一看就明白了。

    假设支付宝有漏洞,你使用支付宝的时候,有人利用支付宝漏洞强制把用户的钱扣了。你觉得用户该找谁?用户肯定报案找支付宝追责,支付宝得去报案找攻击者追责,这是两码事。
    关于   ·   帮助文档   ·   自助推广系统   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2606 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 15:17 · PVG 23:17 · LAX 08:17 · JFK 11:17
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.