[ASP.NET]Path Traversal Vulnerability

最近有遇到一個「Path Traversal」的問題,
是透過 Hidden欄位 來組出要存取的檔案Path,然後取得該檔案的資訊。

最近有遇到一個「Path Traversal」的問題,

是透過 Hidden欄位 來組出要存取的檔案Path,然後取得該檔案的資訊。

1.在Get時,取得一個代號放進Hidden欄位之中


const string rootPath = @"d:\img";
protected void Page_Load(object sender, EventArgs e)
{
	if(!Page.IsPostBack ){
		//HidCompID是畫面上的Hidden欄位
		HidCompID.Value = Server.HtmlEncode(Request.QueryString["id"]);
	}
}

 

2.按下Button後,透過 HidCompID.Value 來組出要存取的檔案Path,然後取得該檔案的資訊


protected void Button1_Click(object sender, EventArgs e)
{
	string path = string.Format(@"d:\img\{0}\a.jpg", Server.HtmlEncode(HidCompID.Value));
	FileInfo fi = new FileInfo(path);
	if (fi.Exists)
	{
		Response.Write(string.Format("{0} Exists", Path.GetFullPath(path)));
	}
	else
	{
		Response.Write(string.Format("{0} Not Exists", Path.GetFullPath(path)));
	}
}

 

這時,在取得 HidCompID.Value 來組出要存取的檔案Path,然後取得該檔案的資訊,會有 Path Traversal 的問題。

因為,如果 HidCompID 的值被改掉,就有可能會Access到別的檔案。

看起來跟「Path Manipulation」蠻類似的,也是驗證問題。

如果保持目前程式的行為,可以在組出檔案Path時,先比對該目錄是否有存在Root的目錄之下,


private string GetValidPathPart(string path)
{
	string[] dirs = Directory.GetDirectories(rootPath);
	string result = dirs.Where(s => s.Equals(Path.Combine(rootPath, path)
		, StringComparison.InvariantCultureIgnoreCase)).FirstOrDefault();
	return result;
}

 

所以改寫如下,


protected void Button1_Click(object sender, EventArgs e)
{
	string compPathPart = GetValidPathPart(Server.HtmlEncode(HidCompID.Value));
	bool isExists = false;
	string path = string.Empty;
	if(!string.IsNullOrEmpty(compPathPart)){
		path = string.Format(Path.Combine(compPathPart, "a.jpg"));
		FileInfo fi = new FileInfo(path);
		isExists = fi.Exists;
	}
	if (isExists) { 
		Response.Write(string.Format("{0} Exists", Path.GetFullPath(path))); 
	}
	else { 
		Response.Write("file Not Exists"); 
	}
}

 

希望對大家有幫助。

Hi, 

亂馬客Blog已移到了 「亂馬客​ : Re:從零開始的軟體開發生活

請大家繼續支持 ^_^