os.path.join()函数存在绝对路径拼接漏洞
绝对路径拼接漏洞
os.path.join(path,*paths)函数用于将多个文件路径连接成一个组合的路径。第一个函数通常包含了基础路径,而之后的每个参数被当作组件拼接到基础路径之后。
然而,如果拼接的某个路径以 / 开头,那么包括基础路径在内的所有前缀路径都将被删除,该路径将视为绝对路径
在Windows系统中,os.path.join()方法是由ntpath模块中的NTPath类实现的。
下面是NTPath类中os.path.join()方法的源码:
def join(self, *args):
path = str(args[0])
try:
for arg in args[1:]:
arg_str = str(arg)
if arg_str.startswith(self.sep) or (
self.altsep and arg_str.startswith(self.altsep)):
path = arg_str
elif not path or path.endswith(self.sep) or (
self.altsep and path.endswith(self.altsep)):
path += arg_str
else:
path += self.sep + arg_str
except (TypeError, AttributeError, BytesWarning):
genericpath._check_arg_types('join', *args)
raise
return path
下面是PosixPath类(POSIX系统)中os.path.join()函数的源码:(Linux系统一样的)
def join(self, *args):
path = str(args[0])
try:
for arg in args[1:]:
arg_str = str(arg)
if arg_str.startswith(self.sep):
path = arg_str
elif not path or path.endswith(self.sep):
path += arg_str
else:
path += self.sep + arg_str
except (TypeError, AttributeError, BytesWarning):
genericpath._check_arg_types('join', *args)
raise
return path
可以发现,如果我们传递的args变量中有以/开头的话(self.sep代表/),会直接将这个以/开头的字符串赋值给path,当然如果后续依然有以/开头的字符串的话,刚刚的就会被替换,并最终被return,也就造成绝对路径的拼接漏洞