遇到的图床问题

遇到的图床问题

看上去是一个白图

如果打开图片链接看到的是下面的图会不会觉得很疑惑,看到是一个白色的图

下载下来有812KB大小,把文件改个.ts后缀结尾还能进行播放,

看上去是一个Chrome图标

如果打开图片链接看到的是下面的图会不会觉得很疑惑,看到是一个Chrome图标

下载下来有3M大小,把文件改个.ts后缀结尾还能进行播放,

分析这些图片

参考网上同学的分析方法

FFmpeg 如何播放带「图片」的 M3U8 视频,IJKPlyaer 适配非标 TS 文件

m3u8视频切片ts伪装png文件欺骗CDN

转-MAC下或者Linux查看二进制文件

1、以二进制方式打开白图文件,vi -b 文件,可以看到FFmpeg.Service01信息,前面用了一个png头部信息,后面是一个ts文件,如下所示:

使用foremost对文件进行拆分,可以得到一个png文件和audit.txt信息,头部是一个150*195的513字节 png文件,就是我们看到的白图

2、以二进制方式打开图标文件, vi -b 文件,可以看到ae42 6082信息,前面用了一个png完整的信息,后面是一个ts文件,如下所示:

使用foremost对文件进行拆分,可以得到一个png文件和audit.txt信息,头部是一个50*50的352字节 png文件,就是我们看到的chrome图标文件

进行防护

1、Java自带的Image.io去判断上传的图片是否是一个TS视频伪装的图片(JAVA中BufferedImage、ImageIO、Graphics2D用法(转载)Java对上传的图片进行格式校验以及安全性校验),这种可以识别第一种伪装(把PNG的图片特征码一部分加到TS文件前面),对第二种伪装(把一个完整的PNG图片放到TS前面)会识别为一个正确的图片对象;

2、使用开源的binwalk(binwalk)去判断,对白图和图标两种伪装都可以完美识别。

3、自己写一个检测脚本来实现,比如用Python去判断文件开头和结尾是不是符合PNG文件特征码,缺点是需要自己去实现全部的图片格式特征码判断,比较麻烦。

if content[:8] == b'\x89\x50\x4e\x47\x0d\x0a\x1a\x0a' and content[-8:] == b'\x49\x45\x4e\x44\xae\x42\x60\x82':
    print(u"是一张正确的png图片")
    return True
else:
    print(u"不是一张正确的png图片")
    return False

总结

在CDN这里用TS视频伪装图片进行撸羊毛比较普遍,实现起来也不难,防护起来也是最难的。目前最好的防护还是将图片的上传交给后端服务,前端任何接口都不负责上传。通过图片接口上传验证秘钥,CDN域名添加流量预警等手段来防护,防止被利用而带来的流量费用损失。

留下回复

error: Content is protected !!