V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Recommended Services
Amazon Web Services
LeanCloud
New Relic
ClearDB
youloge
V2EX  ›  云计算

OSS 签名绕过上传任意文件到别人的网站

  •  1
     
  •   youloge · 3 天前 · 3121 次点击

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

    OSS 的签名直传签名一般涨这样

    {
        "accessid": "MlLTAI5Zt...",
        "host": "https://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 都可以,整点视频,都可以随便传

    网站要整改了:泪水哦~

    35 条回复    2025-03-31 00:33:15 +08:00
    yanqiyu
        1
    yanqiyu  
       3 天前 via Android
    也就是说签名只保护了路径前缀,甚至文件类型 OSS 没检验反而信任用户给的 header
    youloge
        2
    youloge  
    OP
       3 天前
    为啥这样呢? 我都配了文件类型限制 $content-type,经客服提醒:OSS 不处理真实文件类型判断的,客户端说它是图片,OSS 就认为他是图片。直传这玩意不能就给前端,会出事。
    timedivision
        3
    timedivision  
       3 天前 via iPhone
    只要是 oss 上传都行吗?
    youloge
        4
    youloge  
    OP
       3 天前
    都可以:去支付宝 阿里云 找上传公开接口,可以丢个 html 上去玩
    suhu
        5
    suhu  
       3 天前
    常规的 oss/s3 实现管 mime-type 吗(孤陋寡闻了)
    micate
        6
    micate  
       3 天前
    如果你允许用户上传文件且允许上传之后的文件公开访问,理论上就可以被利用为 图床、x 床,因为用户完全可以通过修改文件后缀、分割大文件的方式来滥用上传和访问;
    可以通过限制 referer 的方式避免站外引用;或者设置 bucket 为私有 + 登录后可访问(临时签名 token )的方式来实施上传、访问限制。
    my3157
        7
    my3157  
       3 天前
    客户端直接上传就是这样,签名的时候把 Content-MD5 加进去就可以了
    youloge
        8
    youloge  
    OP
       3 天前 via Android
    @my3157 还不是可以随便定义,oss 好像连 Md5 都不会验证
    youloge
        9
    youloge  
    OP
       3 天前 via Android
    @micate 差别很大!
    图床:是视频前面+60 字节伪装成图片,起码你是直接不能打开的,费流量没危害
    绕过:你拿个图片上传口子,可以把整个前端打包文件夹连图带脚本全部传上去传上去 连二级三级目录都能整
    coldle
        10
    coldle  
       3 天前 via Android
    预签名上传能被恶意覆盖重传的问题确实一直存在,但敢用 starts-with 预签名还公开的确实有点搞 😂 只要前缀一样随便传,分分钟传一堆小垃圾上去
    xiaoming1992
        11
    xiaoming1992  
       3 天前 via Android
    我的签名是同时限制尺寸、content-type 、文件完整路径(包括文件名),这么一看只有一个文件名能稍微限制一下这个问题
    youloge
        12
    youloge  
    OP
       3 天前 via Android
    @xiaoming1992 尺寸 还不是前端报给你的 只有 eq $key 有点用 但是你指定$key 123.png 其实他可以是个 mp4 文件,而且 123.png 类型的 mp4 文件丢给播放器不影响不放的,播放器取前 n 字节判断元数据的,反正 oss 随便绕
    xiaoming1992
        13
    xiaoming1992  
       3 天前 via Android
    @youloge #12 限制文件名能限制你举例的 apk ,能防止用户意外下载到危险应用(好像也没什么危险的,现在手机安装个 apk 各种提醒各种限制,一般也不会莫名其妙安装上未知应用)。

    至于你说的图片/视频问题,貌似只能通过 oss 限制跨域和#6 的方法,限制资源使用范围,来减轻影响了。
    night98
        14
    night98  
       3 天前
    你这个本来就是上传策略写的有问题,正常应该就是写死具体上传路径比如前端请求的 abc.jpg ,你给他返回的就是只能上传到 images/2025/唯一标识-abc.jpg 这个路径,而不是通用前缀。至于他传上来的 abc.jpg 到底是图片还是视频文件本来就不重要。
    rekulas
        15
    rekulas  
       2 天前
    应该是你自己策略的漏洞
    samnya
        16
    samnya  
       2 天前   ❤️ 1
    即使限制死了整个路径,他也可以照样上传任意的文件内容进来,只不过别人下载下来要改一下后缀而已。

    所以这其实就是图种嘛,高级一点的图种而已。只要 oss 不帮你严格校验内容,所有能上传的地方都是这样的。
    youloge
        17
    youloge  
    OP
       2 天前
    @rekulas 跟你用什么花式策略无关!不管你写什么策略都能绕过。
    xyholic
        18
    xyholic  
       2 天前
    qq 群里有很多流传引流的簧色小视频就是挂在各种 oss 里的
    rekulas
        19
    rekulas  
       2 天前
    @youloge 如果是指改后缀绕过的话,确实,上传时存储不会严格校验格式
    不过可以考虑添加触发器自行对格式进行校验
    lyxxxh2
        20
    lyxxxh2  
       2 天前
    content-type 验证确实没用。
    之前自己站验证的 content-type,然我我 burpsite 抓下包。
    改下 image/pn,php 木马就上传了。

    脚本到 oss 就到呗,还整改,醉了。
    传些木马到一些大站,举报他们网站有木马。
    hxndg
        21
    hxndg  
       2 天前
    我没看懂啥意思。。。。
    放开让用户传递,然后还允许用户直接访问,这不是摆明了就是随便玩了吗?

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

    对 OSS 这种我估计也是业务自己校验了
    mcfog
        22
    mcfog  
       2 天前   ❤️ 1
    正常设计收上传的桶应该是个隔离暂存的桶,传完自己 check 过没问题再挪到持久存储的正式的存储中。其他各种稀奇古怪的垃圾直接用短 TTL 全鲨了
    varrily
        23
    varrily  
       2 天前
    [
    "eq",
    "$key",
    "upload/6yKip7EGqYB.jpg"
    ],

    前端限制文件类型选择,后端随机文件名+限定扩展名,私有桶+签名访问。

    但用户把一个 apk 改成 jpg 肯定是防不住的,也没什么影响。
    fdrag0n
        24
    fdrag0n  
       2 天前
    云上传后端不处理文件,所以理论上可以上传任何文件。

    如果担心被盗刷流量可以考虑:限制外站引用+签名+限制返回 content-type 白名单+图片云端转码等方式来防止被拿去当盗版视频分片
    duzhuo
        25
    duzhuo  
       2 天前
    @xyholic 哈哈 是的 速度还飞快
    ColoThor
        26
    ColoThor  
       2 天前
    一般不是直接限制上传的完整路径吗
    009694
        27
    009694  
       2 天前
    我还以为是个啥 bug 。。 问题源于两点 1 不要以目录作为预授权 2 不要信任用户输入的任何内容
    contenttype 就是个申明,oss 怎么可能去真给你做内容校验。 最佳用法是固定完整 key 让用户上传到某个临时位置,再在后端通过事件触发或者前端通知的方式触发校验,校验通过再转移到永久 key 。 oss 开放直传的目的是利用大带宽,不是它帮你做完了所有安全措施
    pytth
        28
    pytth  
       1 天前 via Android
    很多不太会用对象存储的人,就容易出现上传漏洞。而且这种现象极为常见。就连大厂也常见,腾讯,阿里,360 ,字节我都见过很多这种漏洞,都被黑灰产传 html 做落地页。
    shellus
        29
    shellus  
       1 天前
    不对啊
    1. 路径是实体相关的,例如 path 中有<userid>部分,这样可以检测被利用后追究到账户
    2. 签名是后端生成的,可以对请求鉴权和限流

    所以我想不通被利用的点在哪,如果黑产知道你随时可以将它们连根拔除,那么它就不会来利用你的 OSS
    brightguo
        30
    brightguo  
       20 小时 46 分钟前
    一般上传的地址,都是只允许在有限的时间里上传( POST 、PUT ),并且一旦上传完成就不允许覆盖。
    同时该地址不允许下载( GET ),也没有对外的域名让你下载该原始文件。

    也就是 bucket 属性几乎都是私有的,正常的 oss 默认配置都这样。除非你赢要改成公共读,oss 也会标红提醒你存在的流量风险。
    realpg
        31
    realpg  
       18 小时 20 分钟前
    啊,这个漏洞爆出来了吗?哎...
    某些人某些项目的成本要翻几百倍了...

    这是白嫖存储的基本方法
    realpg
        32
    realpg  
       18 小时 16 分钟前
    哦 仔细看了 是 start-with 不是我想的那个漏洞
    那没事了
    IvanLi127
        33
    IvanLi127  
       8 小时 50 分钟前
    额,不用 OSS 不也会有这问题么?那个文件类型不是做校验用的吧。直传完成后,服务端不读出来校验下不就有这问题么?
    realpg
        34
    realpg  
       7 小时 52 分钟前
    @brightguo #30
    某个巨型几百强企业的离谱的公有云 oss 他没有静态建站功能 然后你访问他的根目录 就会 dump 出全 bucket 的文件列表给你看 xml 格式 他甚至没有静态建站功能

    如果你这个 bucket 文件过多 甚至这个 dump 出来的 xml index 文件能高达数百 MB 之大

    反正就是只要被人输入根目录 就几百 MB 公有云流出流量出去了

    这世界多草台班子...
    EMMMMMMMMM
        35
    EMMMMMMMMM  
       7 小时 16 分钟前 via Android
    哈哈,关注一下 oss
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1216 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 21ms · UTC 23:49 · PVG 07:49 · LAX 16:49 · JFK 19:49
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.