我试图弄清楚是否可以遍历驱动器或共享。如果我有一个在 Web 应用程序中连接的路径,其中前缀是驱动器,例如:
var path = "D:\" + Request.Params["directory"];
是否可以使用特殊字符或任何其他方法来获取对 C:\ 驱动器而不是 D:\ 驱动器的引用?我尝试过管道 (|)、分号、URL 编码的空值 (%00) 和其他一些东西。
我试图弄清楚是否可以遍历驱动器或共享。如果我有一个在 Web 应用程序中连接的路径,其中前缀是驱动器,例如:
var path = "D:\" + Request.Params["directory"];
是否可以使用特殊字符或任何其他方法来获取对 C:\ 驱动器而不是 D:\ 驱动器的引用?我尝试过管道 (|)、分号、URL 编码的空值 (%00) 和其他一些东西。
我想提一下,无论是否可以跨驱动器遍历,此代码都是不安全的,不应使用。
例如,它绝对允许在单个驱动器内进行路径遍历。它还允许访问隐式链接到每个驱动器上的命名空间的某些特殊文件名,例如 CON、PRN、AUX、CLOCK$、NUL、COM0、..、LPT0、...
在您的示例中,我不相信仅通过目录遍历(例如..\..\..\windows\system32)就可以遍历到不同的驱动器。
攻击者利用这一点最合理的方法可能是通过指向 C: 驱动器上某处的硬/符号链接。
如果您当时使用路径变量作为命令的参数(即脱壳),则可能存在其他问题。