让美团作为我的图片加速站
前言
在很久之前我发现过美团一处文件上传的小漏洞,但是业务那边肯定是不会认这种上传到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真的很舒服。
如果你细心的话,你会发现本文的所有图片都是直接使用的美团存储桶^^。