一次 XML 上传导致域名被封的经历复盘

2025-09-16
https://www.v2ex.com/t/1158792

防不住,除非你上传的时候做二进制核验,读取文件的真实数据,进一步拦截伪造的图片文件。攻击者会将 test.html 修改后缀名为 test.png ,然后 test.png 内是 html 代码,其中 html 代码前面包含了图片头信息,二进制信息,可以绕过上传检测。,上传后得到 https://xxxxxx.oss-cn-hangzhou.aliyuncs.com/file/test.png ,执行后虽然是一个加载不出来的图片,但是,拼接 response-content-type 就可以指定这个文件的执行类型,例如:

https://xxxxxx.oss-cn-hangzhou.aliyuncs.com/file/test.png?response-content-type=text/html ,意味着 test.png 会以 text/html 类型执行,那么 test.png 等同于 test.html 了,里面的 js 就会被执行,除非你有严格的对象存储配置,禁止这样的参数去定义执行类型。

我从样本中溯源了一个 xml ,看起来是一个售卖视频的页面,加载流程基本如下,下面的域名不固定,感觉会根据可用性判断跳转地点:

1 => 从某个上级渠道带参数进入我方 xml 执行 JS ,继续生成参数跳转到下一个域名

2 => 进入新的 htm 地址: https://img.yeepay.com/spaceTravel/img/2508122039270000006.htm

3 => 在页面调用了个后端接口: https://web.游小戏.cn/index/index/get?buck=XXXXXX&str=XXXXXX&sign=1111

4 => 生成一个访问 URL ,调用新的接口: https://mam.云途腾.cn/api/url.php?k=1&jump=1&buck=XXXXXX&ur=&t=1111

5 => 根据 4 中返回的 url 又进入一个域名: http://uploadn.luoxiangqiche.com/jiahui-cms-lab/prod/ee9d1d0fe5f1d1f722236c69ee67dd0a.html

做了这么多,只是为了保护 5 的目标地址? 5 从源码看有支付功能,后端接口是 3 ,域名是一个做挂车的公司持有 😅 ,在微信中依然能访问,我已经给他们留言了。

现在黑产因为需要依赖微信内的正常访问的域名,自己注册域名的风险很高,因此是每天都要去挖漏洞,来避免一些问题,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 代码
-
以上是本人分析过很多很多黑产的一些常见案例。

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 也是一样的道理。

NEXT
[Git] 取消最近的一次commit