一次CRC32校验的文件上传意外Bypass
2022-10-14 08:32:56 Author: F12sec(查看原文) 阅读量:8 收藏

起因

某日在挖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参数删除后,即可绕过。


文章来源: http://mp.weixin.qq.com/s?__biz=Mzg5NjU3NzE3OQ==&mid=2247488270&idx=1&sn=dc58ec605fbb2a375d7379c86b6e04ed&chksm=c07fa8faf70821ec92a1528ed4d95f969ede658d1cf98586598daa22d343be9f2498c015e743#rd
如有侵权请联系:admin#unsafe.sh