转载来自于:http://pirogue.org/2017/09/29/aliyunoss/

首先声明这是一篇标题党的文章,阿里云OSS不被这个锅,锅其实还是在企业或者说是用户。

前言

之所以要写这篇口水文,是因为最近在检测自家公司产品时发现存在这个问题,同时不久在测试某src的某系统时也存在类似这种问题,所以个人认为还是要提高一些警惕,让开发或测试者尽量消除不必要的麻烦,不要错误的认为文件托管在oss就可以忽略站内的上传功能存在的安全隐患。

概述

首先借用阿里云oss首页的介绍性文字来解释下oss是什么:


海量、安全、低成本、高可靠的云存储服务,提供99.99999999%的数据
可靠性。使用RESTful API 可以在互联网任何位置存储和访问,
容量和处理能力弹性扩展,多种存储类型供选择全面优化存储成本。


简单可以理解为企业自身的文件存储服务器。问题出在站点的上传功能,
存在任意文件上传,但因为上传到的是oss或文件存储服务器,所以不论是什么类型的脚本都是不解析的,访问会直接下载回来,
那作为开发者会高枕无忧了吗?然并卵,我还可以上传一个内容存在xss payload的hack.html的文件,服务器便会静态文件进行解析;
重点来了,可能企业在使用oss服务时,使用的域名是img-oss.yourcompanydomain.com,
而在你公司的sso或产品为了跨域在开发时set-cookie:*.yourcompanydomain.com,
那攻击者就可以拿着img-oss.yourcompanydomain.com/hack.html找对应的场景或发给公司的员工,
打开后cookie可能就被“借”走了。

总结两点:

  1. 任意文件上传;
  2. 站点可以跨域

你看不见我~文末我准备追加一种姿势

案例复现

案例一:

0x01:
set-cookie

set-cookie

0x02:

文件上传,前端验证

先上传图片,然后通过bp抓包,修改后缀为html,进行上传

set-cookie

访问即可打印弹出cookie

案例二:

0x01:

某src在上传文件时不仅会校验文件后缀,在后端也会校验文件头

checkjpg

0x02:

绕过上传

bypassSuffix

上传后的response

upload

html上传成功,发现其setcookie也是该业务系统全域名的,但使用的oss服务是阿里的oss相关域名isvstore.oss-cn-hangzhou.aliyuncs.com,不是使用其业务系统的域名,这样这两个域名之间是不能相互跨域的,但aliyuncs.com这个域名如果有业务系统,可能也会被利用。但在我测试过之后发现aliyuncs.com这个域名没有业务系统。所以没有影响,才在这里列出来。

但问题是相通的。

传统解决方案

  1. 后端校验文件后缀类型;
  2. 牛逼点对文件进行重绘;

针对oss解决方案

  1. oss接口开发key管理部分,不同的key可以配置不同类型文件上传权限(服务端改key即可);
  2. 在使用oss时,最好申请一个专用的域名提供文件服务器使用。

文末彩蛋

除了html,你是否知道还有一种文件在特殊场景下会被利用呢?那就是shtml!


shtml用的是SSI指令,SSI是为WEB服务器提供的一套命令,这些命令只要直接嵌入到HTML文档的注释内容之中即可。
<!--#include file="/home/www/user7511/nav_foot.htm"--> //可以用来读文件
<!--#exec cmd="ifconfig"--> //可以用来执行命令
<!--#include virtual="/includes/header.html" --> //也是读文件 与FILE不同他支持绝对路径和../来跳转到父目录 而file只能读取当前目录下的


在某众测项目时,曾利用过,当时的情景是一个上传附件的功能存在任意文件上传,asp、aspx、jsp、php等等上传之后,访问都会进行下载,而上传html则造成xss,而xss的奖金并不高;为了提升漏洞的危害,上传了一个shtml,里面的payload就是执行命令,命令执行奖金达到8K。

ps:shtml这个姿势从t00ls论坛上学到的。

---------------

shtml其他姿势

<!--#ECHO var="ALL_HTTP"-->
当前文件名称:<!--#ECHO var="DOCUMENT_NAME"-->
Web服务器的名称和版本:<!--#ECHO var="SERVER_SOFTWARE"-->
主机名:<!--#ECHO var="SERVER_NAME"-->
端口:<!--#ECHO var="SERVER_PORT"-->
客户或客户代理IP地址:<!--#ECHO var="REMOTE_ADDR"-->
客户或客户代理主机名:<!--#ECHO var="REMOTE_HOST"-->
PATH_INFO 的值,但带有扩展为某个目录规范的虚拟路径:
<!--#ECHO var="PATH_TRANSLATED"-->
客户端给出附加路径信息:<!--#ECHO var="PATH_INFO"-->
<!--#ECHO var="HTTP_ACCEPT"-->
<!--#ECHO var="DOCUMENT_URI"-->
<!--#include file="../../web.config"-->