由一道CTF学习相对路径重定向引发的开放重定向:津门杯2021-GoOSS
涉及到的知识点
- 文件路径解析过程和URL的差异
- 相对路径重定向
- 开放重定向
- 题外话:对象存储服务(Object Storage Service,简称OSS);本题的OSS只是一个幌子。
漏洞点分析
- 在文件中间件处,存在一处相对路径重定向的操作:
c.Redirect(302, c.Request.URL.String()+"/")
,这里的开发目的很好理解:如果用户输入的为路径,但又没有加/
,则使用相对重定向(相对重定向是关键,在后文会讲)将url定向到路径(添加一个/
) - 但是利用时有3个条件:
fileSystem.Open(c.Request.URL.String())
成功,fi.IsDir()
为true,并且路径不以/
结尾:
|
|
前两个条件在绕过时充分体现了Orange大表哥的“不同协议解析差异”问题,此处为文件路径和url解析不同的问题。
fileSystem.Open
的绕过
要触发SSRF,首先要使fileSystem.Open(path)正确返回一个文件夹,fileSystem.Open支持虚拟路径,可以用../
绕过,在讲绕过方法前,我们先看一下文件路径解析的几种情况(可以体会一下和url解析的差异):
/../
:返回上一层/flag/
:flag文件夹/flag&../
:一个名为flag&..
的路径/127.0.0.1:1234/
:一个名为127.0.0.1:1234
的路径
理解了这四种解析,就可以很容易的理解这道题的绕过方法了,此题有两种绕过方法:
{"url":"http://127.0.0.1:1234//127.0.0.1?file=../../../../../flag&../.."}
{"url":"http://127.0.0.1:1234//129.204.230.95/.."}
fi.IsDir()
的绕过
直接在路径最后加上/..
就会被识别为路径;此外,使用/
也会被识别为路径,但本题由于需要结尾不出现/
所以不能用。
获取flag的payload
以json格式发送请求:Content-Type: application/json
,最终可以有两种利用方法拿flag(直接打127和利用恶意服务器进行重定向):
- wp1:
|
|
- wp2(xx为自己的302跳转的恶意VPS):
|
|
重定向为相对路径下的漏洞
跳脱题目本身,我们来看看真实情况下的开发动机和案例。
在RFC标准中,302重定向如果没有协议信息,则为相对重定向:Hypertext Transfer Protocol (HTTP/1.1): Semantics and Content:
例:
|
|
相当于:
|
|
这样很容易造成开放重定向:
就如本题一样,为了有更好的用户体验,很多框架都有自动处理无斜杠的路径的操作:xxx.com/123
被重定向至xxx.com/123/
(使用相对重定向/123
->/123/
)。
然而如果url为xxx.com//evil.com
,如果没有过滤,就会被重定向至//evil.com/
,从而从相对路径逃逸到绝对路径。