网站被安全部门发了一份漏洞报告,讲的是上传一个脚本文件到了云存储,经过仔细研究发现,确实 6

OSS 的签名直传签名一般涨这样
{
"accessid": "MlLTAI5Zt...",
"host": " oss-cn-shanghai.aliyuncs.com",
"policy": "eyJleHBpcmF0aW9uIjoiM....",
"signature": "TXKWgd+kz3Qy3bEOlZO+zPd4ZLY=",
"expire": 1743080451,
"callback": "ja1VybCeyJjYWxsYmFI6Im...",
}

解码一下上传策略policy
{
"expiration": "2025-03-22T10:00:51Z",
"conditions": [
["starts-with", "$key", "image/2025/"],
["content-length-range", 0, 2048],
["in", "$content-type", ["image/png"]]
]
}

看一眼 $key 和 $content-type
你通过脚本 curl 啥的都行组装一个form-data表单 把一个vme50.apk塞给表单

key = image/2025/vme50.apk
file = binary content-type image/png 人工陪成 签名里面要求的就行

然后你文件就传上去了,你通过对方的 url+/image/2025/vme50.apk 就能访问了
就是你找个大站,只要用 oss 直传的 你传个 html 都可以,整点视频,都可以随便传
网站要整改了:泪水哦~

也就是说签名只保护了路径前缀,甚至文件类型 OSS 没检验反而信任用户给的 header

为啥这样呢? 我都配了文件类型限制 $content-type,经客服提醒:OSS 不处理真实文件类型判断的,客户端说它是图片,OSS 就认为他是图片。直传这玩意不能就给前端,会出事。

只要是 oss 上传都行吗?

都可以:去支付宝 阿里云 找上传公开接口,可以丢个 html 上去玩

常规的 oss/s3 实现管 mime-type 吗(孤陋寡闻了)

如果你允许用户上传文件且允许上传之后的文件公开访问,理论上就可以被利用为 图床、x 床,因为用户完全可以通过修改文件后缀、分割大文件的方式来滥用上传和访问;
可以通过限制 referer 的方式避免站外引用;或者设置 bucket 为私有 + 登录后可访问(临时签名 token )的方式来实施上传、访问限制。

客户端直接上传就是这样,签名的时候把 Content-MD5 加进去就可以了

还不是可以随便定义,oss 好像连 Md5 都不会验证

差别很大!
图床:是视频前面+60 字节伪装成图片,起码你是直接不能打开的,费流量没危害
绕过:你拿个图片上传口子,可以把整个前端打包文件夹连图带脚本全部传上去传上去 连二级三级目录都能整

预签名上传能被恶意覆盖重传的问题确实一直存在,但敢用 starts-with 预签名还公开的确实有点搞 😂 只要前缀一样随便传,分分钟传一堆小垃圾上去

我的签名是同时限制尺寸、content-type 、文件完整路径(包括文件名),这么一看只有一个文件名能稍微限制一下这个问题

尺寸 还不是前端报给你的 只有 eq $key 有点用 但是你指定$key 123.png 其实他可以是个 mp4 文件,而且 123.png 类型的 mp4 文件丢给播放器不影响不放的,播放器取前 n 字节判断元数据的,反正 oss 随便绕

#12 限制文件名能限制你举例的 apk ,能防止用户意外下载到危险应用(好像也没什么危险的,现在手机安装个 apk 各种提醒各种限制,一般也不会莫名其妙安装上未知应用)。

至于你说的图片/视频问题,貌似只能通过 oss 限制跨域和#6 的方法,限制资源使用范围,来减轻影响了。

你这个本来就是上传策略写的有问题,正常应该就是写死具体上传路径比如前端请求的 abc.jpg ,你给他返回的就是只能上传到 images/2025/唯一标识-abc.jpg 这个路径,而不是通用前缀。至于他传上来的 abc.jpg 到底是图片还是视频文件本来就不重要。

应该是你自己策略的漏洞

即使限制死了整个路径,他也可以照样上传任意的文件内容进来,只不过别人下载下来要改一下后缀而已。

所以这其实就是图种嘛,高级一点的图种而已。只要 oss 不帮你严格校验内容,所有能上传的地方都是这样的。

跟你用什么花式策略无关!不管你写什么策略都能绕过。

qq 群里有很多流传引流的簧色小视频就是挂在各种 oss 里的

如果是指改后缀绕过的话,确实,上传时存储不会严格校验格式
不过可以考虑添加触发器自行对格式进行校验

content-type 验证确实没用。
之前自己站验证的 content-type,然我我 burpsite 抓下包。
改下 image/pn,php 木马就上传了。

脚本到 oss 就到呗,还整改,醉了。
传些木马到一些大站,举报他们网站有木马。

我没看懂啥意思。。。。
放开让用户传递,然后还允许用户直接访问,这不是摆明了就是随便玩了吗?

我记得很早的时候上传木马也还要找地址啥的,是一个道理吧?

对 OSS 这种我估计也是业务自己校验了

正常设计收上传的桶应该是个隔离暂存的桶,传完自己 check 过没问题再挪到持久存储的正式的存储中。其他各种稀奇古怪的垃圾直接用短 TTL 全鲨了