某日在挖SRC的过程中发现一个比较有意思的上传点,成功绕过后深入研究了一下。
功能点上传如图所示。
该站是将所有的静态资源文件上传至七牛云的OSS上,七牛云OSS与目标某个用来存放静态文件的子域名绑定,然后通过访问静态服务器访问资源文件。
原始上传数据包如下(为了只截一张图,对数据包内容做了简化处理,非真实数据包)
POST / HTTP/1.1
Host: upload-xx.qiniup.com
User-Agent: QiniuAndroid/7.3.11 (7.1.2; samsung-SM-G955N; 1665282777682874; VQB5GprlYEdBhv2C)
Content-Type: multipart/form-data; boundary=10511da8-f3aa-4feb-8d6b-e2c7440b9e6d
Content-Length: 7859
Accept-Encoding: gzip, deflate
Connection: close
--10511da8-f3aa-4feb-8d6b-e2c7440b9e6d
Content-Disposition: form-data; name="file"; filename="20221009_103254.png"
Content-Type: application/octet-stream
Content-Length: 7129
[<image_data>] //上传的图片数据
--10511da8-f3aa-4feb-8d6b-e2c7440b9e6d
Content-Disposition: form-data; name="crc32"
Content-Length: 9
[<crc32_value>] //crc32检验值
--10511da8-f3aa-4feb-8d6b-e2c7440b9e6d
Content-Disposition: form-data; name="token"
Content-Length: 134
[<token_data>] //token值
--10511da8-f3aa-4feb-8d6b-e2c7440b9e6d
Content-Disposition: form-data; name="key"
Content-Length: 34
[<url_path>] //上传成功后映射至静态服务器的路径
--10511da8-f3aa-4feb-8d6b-e2c7440b9e6d--
当我将png后缀修改为html并在文件内容中加上xss语句时,返回包出现了crc32校验错误,如下。
{"error":"crc32 not match"}
查阅了网上各种资料,如何进行crc32校验的绕过,但是查到的都是与CTF杂项有关的东西。
正在我纠结如何Bypass时,我尝试将上传数据包中的crc32校验参数删除,意外的绕过了crc32校验。
如图。
将此块部分进行删除,重新发包。
返回包意外的从原来的
{"error":"crc32 not match"}
变成了
{"error":"file exists"}
于是我再次将包中的静态服务器映射路径进行了修改,成功Bypass上传。
由于业务用的是七牛云的对象存储,所以我去研究了一下为什么删除crc32值能够绕过。
我翻了一下七牛云的对象存储文档,内容如下。
https://developer.qiniu.com/kodo/1272/form-upload
crc32参数是非必填项,仅在客户端发送的包中有crc32参数时,七牛云的对象存储服务器才会对其进行crc检验,所以数据包中的crc32参数删除后,即可绕过。