允许用户上传自定义图片或视频的场景,如何防止被上传恶意代码?

2020-10-18 09:55:41 +08:00
 black11black
如题,假如应用场景是想要做一个图床的话,允许用户自定义上传,如果系统做的特别糟糕是有可能被上传二进制并执行的。

很好奇现在通用的安全防范做法是什么,如何确保用户上传的图片确实是图片?

自己写二进制分析感觉不太靠谱,工作量太大且不准确。如果交给 ffmpeg 这种工具转码一次的话能规避吗? ffmpeg 等工具有没有出现过 0day 被利用的情况?

另外统一转码的话开销也很大,图片的话有损压缩会导致失真,视频的话则是太慢。以前记得 B 站做过直传视频后码率合规就不转码的操作,他们怎么处理的,如果用户传的视频外挂了二进制文件会怎么办

很好奇,谢谢大家
4341 次点击
所在节点    问与答
44 条回复
nvkou
2020-10-18 13:08:33 +08:00
@black11black
如果文件头不符合标准,在一些鲁棒性比较差的库中就直接报错说文件打不开了.这一点可以反向利用.反正你生成缩略图要把文件当做图片使用
另外就是浏览器判断文件实际上是靠 MIME 声明. 你声明这是个 jpg,实际内容是 js.对于浏览器来说就是图裂了
buffzty
2020-10-18 13:41:04 +08:00
很多用户上传二进制文件到图床并不是要攻击图床网站.而是把图床网站当作木马母站. 一般的 linux 木马都是一些脚本.脚本中会向木马母站请求下载二进制木马. 如果黑客用自己网站容易被查,所以会用第三方网站.我见过很多都是放在图床上.
要我说 2 个措施 1. 后台任务读文件前一定字节判断是否为匹配格式. 2.保存文件上传时间,上传者源 ip,源端口,jc 叔叔能根据这 2 个找到当时哪个主机在使用这个 ip 和端口
muzuiget
2020-10-18 16:41:53 +08:00
只要你理解“URL 中的路径和硬盘中的路径没有对应关系”这个概念,这个问题不攻自破。

所以我猜楼主的写 PHP 的?
anerinck
2020-10-18 16:48:12 +08:00
@muzuiget lz 的意思是防止图床网站变成病毒分发网站吧,想自己做一个过滤
Felldeadbird
2020-10-18 19:20:32 +08:00
首先,严格判断文件后缀和初步获取文件的信息。

图片 上传过来都做一个 压缩。确保是图片。

视频做转码。也可以先上传,不回调上传地址。待解码完成后再更新地址。
walkersz
2020-10-18 19:46:02 +08:00
用户上传的图片或视频不要保存原文件。
图片读一遍,自己另存一份分比率、品质相同的。主要是为了防止有人在图片中夹带私货。比如这个文件( https://vkceyugu.cdn.bspapp.com/VKCEYUGU-imgbed/aec34c98-6265-4fec-8267-8df015e54399.jpg ),我在里面夹带了一首歌
视频也转码一下。
geebos
2020-10-18 19:55:47 +08:00
对于图片可以验证分辨率,一般来说图片的大小是由分辨率来决定的,碰到大小异常的基本可以确定有问题
walkersz
2020-10-18 20:03:50 +08:00
@OldActorsSmile 看我 26 楼的回复。用你的图床做的示范。你看下哈
OldActorsSmile
2020-10-18 23:28:06 +08:00
@walkersz

确实扩展名改成 mp3 可以播放,这个我觉得无所谓,用户想这么传就这么传吧,我不觉得属于恶意代码
OldActorsSmile
2020-10-18 23:30:15 +08:00
@black11black

每传一张图数据库也会同步记录。比如检测今天已经传了 1000 张,那么今天后续的上传都要图形验证码
akira
2020-10-18 23:34:41 +08:00
一个比较鸡贼的方法。 传到其他支持图片 /视频处理的平台,例如 7 牛,或者阿里云的,处理后再下载回来。
imdong
2020-10-19 00:22:21 +08:00
远古时期,确实有一句话木马作为图片上传,然后执行的漏洞。
black11black
2020-10-19 01:59:54 +08:00
@akira 这个不解决问题,技术讨论纯粹是想知道这些商业公司都是怎么保证安全性的
black11black
2020-10-19 02:04:38 +08:00
@imdong 我们上学的时候也没少做渗透演示,虽然主流方式几乎是靠注入,但我丝毫不怀疑不经严格设计的业务代码会给整个机器带来极大的风险,2020 年的 linux 发行版,你也没法保证比如用限权用户部署就绝对安全了。楼上一大堆人装大头菜我也是佛了,还有问楼主是不是写 php 的这种引战的,通通 block
crab
2020-10-19 02:18:22 +08:00
服务器安全用执行权限限制,被滥用没办法的,因为可以一张正常图尾部加二进制直接就过检测了,腾讯阿里都很多上传接口被滥用做图和视频床。
buffzty
2020-10-19 06:08:42 +08:00
楼主先把这个防护做一下 随便找一台服务器 wrk 一下 每秒上 g 的流量. 阿里云 cdn 那种不限速的 一台主机一个小时就能刷好几千流量费
ladypxy
2020-10-19 06:10:43 +08:00
上传文件目录不给执行权限,其他目录不给写入权限,就是传了木马又能如何
black11black
2020-10-19 07:09:29 +08:00
@ladypxy 生产环境可以这么搞,个人站点之类的不容易,因为个人站点很难专机专用
ladypxy
2020-10-19 08:47:46 +08:00
@black11black 这个和是不是个人站点没关系啊?
tesorouo
2020-10-19 09:39:08 +08:00
不是应该挂 OSS 或者 S3,然后直接 call api 上传 /下载嘛?然后设置过滤检验不就齐了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/716054

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX