功能
这个站的功能很简单,就是主要做视频剪辑(云剪辑):我们可以上传视频、图片、音频等各种素材,然后对视频进行剪辑和增加特效等,最后生成一个成品视频。同时,网站本身也会提供一些精品素材,但是这些是需要VIP才可以使用的。
没用过的可以随便找一个云剪辑平台看看。
遇到这种功能,我想大部分人应该都会想要尝试一下绕过限制使用VIP素材吧?我也不例外。
绕过前端
首先尝试选择VIP素材插入,发现前端提示异常,普通用户无法选择VIP素材。
既然是前端的限制,那就太简单了,服务端返回的数据中肯定有一个是标记素材类型的,这里是"is_vip = 1
",直接在返回包中将对应的"is_vip = 1
"修改为"is_vip = 0
",这时前端的限制就被绕过了,在剪辑时可以正常插入VIP素材了。
关于修改返回包相关的技巧可以看之前的文章《SRC漏洞挖掘技巧:修改返回包的各种姿势》
服务端限制
然后直接导出视频,但是在导出时,发现服务端提示“存在收费素材,无法导出”。这就难办了,服务端做了限制,这怎么绕?
这时候我们需要了解它是根据什么来判断是否使用了收费素材的,所以需要分析一波请求数据包,关键数据包如下(忽略了大部分其它的数据包):
{
"materials":[//素材列表
{
"material_id":1,//素材1
"path":"https://video.xxx.com/aaaaa.mp4",
"name":"xxx"
},
{
"material_id":2,//素材2
"path":"https://video.xxx.com/xxxxx.mp4",
"name":"zzz"
}
]
}
这个数据包就是我们插入的素材信息,看到这个请求包,如果你有开发经验,并且简单了解过云剪辑,那么应该一眼可以看出来这里可能存在漏洞。
如果你没有看出来,可以暂停几秒思考一下~
问题很明显,素材信息既传递了ID,也传递了素材地址path,服务端如果要做限制,肯定是根据ID来限制,但是实际上在生成视频时,是按这里的path
地址下载素材,还是根据ID从数据库获取呢? 这里既然传了path
,那我猜测大概率可能是直接根据前端回传的path
下载素材生成视频的。
验证
要验证这个问题很简单,我们还是插入一个VIP素材,在生成视频时拦截请求包,将VIP的素材ID,修改为一个免费的素材ID,这样我们实际请求包就变成了这样:
{
"materials":[//素材列表
{
"material_id":5,//原素材ID为1(VIP素材),修改为免费素材ID 5
"path":"https://video.xxx.com/aaaaa.mp4",//path不变,还是VIP素材地址
"name":"xxx"
},
{
"material_id":2,//素材2
"path":"https://video.xxx.com/xxxxx.mp4",
"name":"zzz"
}
]
}
放行请求后,发现请求成功,视频可以成功导出,并且其中包含了我们选择的VIP素材。通过这种方式,我们成功地绕过了VIP素材的使用限制。
最后
这种场景,大家在挖类似的网站时,都可以尝试一下。而且不仅仅是局限于视频剪辑类型的,只要是包含这种收费资源的场景的,都可以会有这种漏洞。
它本质上还是服务端过于信任前端传递过来的数据,虽然对数据进行了校验,但是没有考虑到数据的完整性校验:即我们篡改了部分数据的这种场景。
希望这篇文章可以给各位师傅们带来一点新思路~