C# NET中的路径注入?

C# NET中的路径注入?,c#,asp.net,.net,C#,Asp.net,.net,假设我有一个API调用,该调用需要文件名的前缀,然后将后缀与扩展名连接起来: var fileName = prefix + "_suffix.txt"; var folderPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "SubDir", fileName); returnFile.ReadAllText(folderPath)); API的调用方式如下: http://www.example.com/api/readF

假设我有一个API调用,该调用需要文件名的前缀,然后将后缀与扩展名连接起来:

var fileName = prefix + "_suffix.txt";
var folderPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "SubDir", fileName);
returnFile.ReadAllText(folderPath));
API的调用方式如下:

http://www.example.com/api/readFile?prefix=<prefix>
是否可以将
替换为允许我忽略
\u suffix.txt
部分并浏览磁盘上的任何文件?

如果文件名(即前缀)包含绝对路径,则只需忽略BaseDirectory即可。是的,你可以用它浏览任意文件,只要这些文件以_后缀结尾

没有魔法终止符可以断开字符串作为路径。当Combine遇到非标准字符时,它将抛出“路径中的非法字符”异常


但是默认情况下,权限将不允许应用程序池标识访问任何这些路径。因此,除非您明确更改这些字符,否则这不会带来安全风险。

您所说的“路径终止字符”是什么意思?请注意,您的应用程序池标识(假设IIS是web服务器)不应该访问“磁盘上的任何任意文件”,默认情况下没有。您可以使用其他路径方法检查文件名,以确保它不是无效的。例如,如果参数是绝对路径,则返回
true
。path.ChangeExtension是否有帮助?100%的人同意apppool帐户不应该这样做,但有多少次人们试图通过给予应用程序池id超出其需要的权限来解决问题。它可以访问配置文件,我相信我们都看到了经典的print.aspx?file=display web.config文件,用于打印,因此会泄漏连接字符串。除此之外,应用程序池帐户不能读取任意文件。我们都知道,至少有一个初级开发人员将帐户更改为管理员,以克服“一些.NET问题”。甚至可能在OPs案例中使用,
fileName
始终以
\u suffix.txt
结尾-即使忽略基本目录,这是否仍然允许使用任意文件?问题更多的是,是否有某种字符可以被注入,使其忽略路径的其余部分(包括
\u suffix.txt
),例如在URL中,您可以使用
等,从而访问任何文件。@Panagiotiskanavo是正确的,这也是我在评论中写的。扩展了答案来解释这一点。这不是问题的重点,但这绝对是人们寻找答案时需要注意的:)@JamesThorpe啊,说得好,这可能是问题的真正要点。
<app root dir>\SubDir\<prefix>_suffix.txt