^

让美团作为我的图片加速站

前言

在很久之前我发现过美团一处文件上传的小漏洞,但是业务那边肯定是不会认这种上传到s3的是漏洞,因为不可以上传可以执行xss脚本的文件。

但是由于这个文件上传是不需要任何鉴权的,是前台上传。面对我卡的要死的博客,我心生一计,为什么不把美团的存储搞过来当博客的文件存储呢?

关于OSS

我的博客是由depyseve开发而来的,内置了oss文件存储功能。可以使用七牛云、腾讯云作为文件存储桶。但是我只是在当初开发框架的时候内置进去了而已(接入官方给的sdk),只做了简单的测试。因为我很穷,买不起存储桶的流量,于是测试完毕可以在客户场景使用我就把状态改成false了。

我的博客目前的文件上传模式是这样的:

1.前端获取文件上传操作

2.后端判断是否开启了oss

3.如果没开启 直接上传文件到本地文件夹 (同时接入depywaf做恶意流量、行为监测,文件后缀文件名文件内容检测)

4.开启了oss 则去配置文件找一下用了哪个oss 检测上传模式 如果是客户端上传就直接做前端接口传输 否则就先上传临时文件 服务端再上传

5.然后使用相关sdk 把文件传到存储桶 (如果上传失败就捕获异常报错 这个步骤不需要接入内容检测和waf 毕竟存储桶随他去了)

6.返回文件地址给前端 做进一步操作

动手编写相关SDK

所以我们先去配置文件 启动oss,为oss type使用服务端传输文件,使用美团sdk很显然,这只涉及到一个post请求,所以根本就没有sdk,需要我们手动编写。

编写可以参考阿里的sdk,但是更加简单。以php为例:

无关代码以及敏感内容已经打码,贴出来脱敏比较麻烦,直接截图了。

思路很简单,tmpinfo是一个从前端上传文件并server上传oss后获取的内容,是编写oss相关操作的时候就给的标准。

他是一个存储了临时文件地址和后缀的数组,从数组取值获取文件内容,然后构造一个post请求包做操作。这里的check方法只是一个模拟post请求,代码如下

function check($header,$url,$method,$body) {
        
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $url); //设置要请求的网站
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

		curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); // https请求 不验证证书和hosts
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
		if($method == "post"){
			// POST数据
			curl_setopt($ch, CURLOPT_POST, 1);
			// 把post的变量加上
			curl_setopt($ch, CURLOPT_POSTFIELDS, $body);
		}


        curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30); //超时验证
        curl_setopt($ch, CURLOPT_TIMEOUT, 30);
		curl_setopt($ch, CURLOPT_HTTPHEADER, $header);//设置header
        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); //跟踪跳转
     
        
        $result = curl_exec($ch);
		curl_close($ch);
        return $result;
}

通过接口地址,所需header,构造body,把文件内容对目标接口地址做请求。之后目标接口会返回什么json格式,需要取什么值就看你自己的业务需求。

这里有个小trick是,美团这个bug上传的文件是http返回的地址,需要手动替换一次https。并且由于这个是不可控的图床,保不准哪天美团会做修改调整,导致图片丢失。所以在上传美团后,获取到文件名再本地保存一份。在php里只需要copy函数一下即可。这样我的网站就变快了,白嫖cdn真的很舒服。

如果你细心的话,你会发现本文的所有图片都是直接使用的美团存储桶^^。