最近有遇到一個「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:從零開始的軟體開發生活」
請大家繼續支持 ^_^