實戰滲透-從敏感文件泄露到Getshell
目標站點如下:

是一個大型儀器預約平臺,先簡單通過信息收集得到以下信息
中間件:IIS 開發語言: .NET (MVC)

該系統提供兩個功能,注冊以及登錄。由于這套系統比較常見,基本每個知名高校都有這么一個儀器平臺。所以注冊后的功能點就沒必要再去花功夫探測了(有的話也被大佬交完了)。
這里我直切主題:
先FOFA搜索相同站點。

由于是NET平臺,可以先搜集以下所有相同系統的站點。然后掃一掃備份之類的。常見的字典如: web.rar 備份.rar
等等。.具體看運維的習慣(部分運維喜歡用bak)。
使用某大佬的FOFA提取工具提取下結果

然后使用御劍(由于御劍好像不支持https,所以這里我指定了協議為http。如果大佬們有支持https或者可以批量掃描的工具可惜推薦下(造輪子太麻煩,性能渣))

在某站點下發現疑似備份文件bak.rar, 先下載下來。
解壓后發現里面都是一些dll文件。由于是NET平臺,源代碼都會打包成dll文件。也就是說這些dll文件里面存放著網站的源代碼。
那么直接逆向編碼,開始代碼審計~~~~
發現有點多。。。。由于是MVC模式,我們可以直接搜索Controller(控制器)

開始審計~這里先挨個探索(我個人比較喜歡直切主題:未授權的文件上傳-日志寫入(部分系統是由請求頭決定文件名-反序列化-SQL注入))
未授權的文件上傳,這個比較好找。。有沒有進行文件效驗一看就知道。部分程序員都是把操作寫成了一個方法,統一調用。
如:
在UserController下面的IniUserPhotoUpload 方法就是一處文件上傳的操作

這里表面看著并沒有什么文件屬性效驗的操作。但是最終寫入是由MakeThumbnail操作的。
在MakeThumbnail下面

第151行,可以看到將參數傳遞給了MakeThumbnailByImg 方法。追蹤此方法

在186行可以明顯的看出這里進行了文件效驗,且規定了后輟為jpg,jpeg,bmp,gif,png,ico 才可以成功上傳
那么這里無果,繼續探索下一個。
最終在Lab下面發現一處疑似上傳LOGO的操作。
UploadLabOrg

寫入操作最終是由SaveLabOrganization進行寫入操作。
追蹤此方法。

主要操作在這里
if (base.Request.Files.Count > 0)
{
fileSizeStr = FileUtility.GetFileSizeStr((double)base.Request.Files[0].ContentLength);
string fileNameWithExtensionByPath = FileUtility.GetFileNameWithExtensionByPath(base.Request.Files[0].FileName);
fileExt = FileUtility.GetFileExtByPath(base.Request.Files[0].FileName);
if (!this.ValidateLabOrganizationLogoUpload(System.Web.HttpContext.Current.Request, fileExt, fileSizeStr, out errorMessage))
{
result = false;
}
else
{
this.IniLabOrganizationLogoUpload(System.Web.HttpContext.Current.Request, fileId, fileExt, fileSizeStr, out saveImgPath, out errorMessage);
result = true;
}
}
else
{
result = false;
}
return result;
當上傳的文件大于0時,執行if里面的語句
if (!this.ValidateLabOrganizationLogoUpload(System.Web.HttpContext.Current.Request, fileExt, fileSizeStr, out errorMessage))
{
result = false;
}
else
{
this.IniLabOrganizationLogoUpload(System.Web.HttpContext.Current.Request, fileId, fileExt, fileSizeStr, out saveImgPath, out errorMessage);
result = true;
}
其中ValidateLabOrganizationLogoUpload是判斷文件內容大小是否超出以及擴展名是否正確的。

其中并沒有進行白名單效驗~只是進行了一些判空以及移除符號的操作
找到了一處無效驗上傳點,開始構造POC:
路由地址為:/控制器名/方法名
使用HTML構造提交表單內容:
<form action="地址" method="post" enctype="multipart/form-data" >
<input type="file" name="Filedata"/>
<input type="submit" value="提交"/>
form>
然后開始上傳。

但是他返回了一個出錯。。。有點無解,是不是要登陸??
注冊了一個賬戶,發現仍然出錯,再次回到代碼層,可能是監聽器的問題。找到filter
發現了要驗證Referer,在原有POC上添加一個Referer
成功Getshell

文章來源:先知社區
文章作者:遠海