天天看點

ASP代碼審計學習筆記 -5.檔案下載下傳漏洞

檔案下載下傳漏洞

漏洞代碼:

<%   
function download(f,n)   
on error resume next   
Set S=CreateObject("Adodb.Stream")   
S.Mode=3   
S.Type=1   
S.Open   
S.LoadFromFile(f)   
if Err.Number>0 then   
Reaponse.status="404"   
else   
Response.ContentType="application/octet-stream"   
Response.AddHeader "Content-Disposition:","Attachment;filename="&n   
Range=Mid(Request.ServerVariables("HTTP_RANGE"),7)   

if Range="" then   
Response.BinaryWrite(S.Read)   
else   
S.Postion=Clng(Split(Range,"-")(0))   
Response.BinaryWrite(S.Read)   
end if   
End if   
End function   
dim filename   
filename=request("filename")
filename=filename&".asp"
call download(server.MapPath(filename),filename)   
%>       

在 MapPath 的 Path 參數中不允許字元 '..',需要啟用父路徑(IIS6.0出于安全考慮,這一選項預設是關閉的。)

漏洞利用:

ASP代碼審計學習筆記 -5.檔案下載下傳漏洞

 漏洞修複:

如果存在.. 就結束腳本,禁止跨目錄進行操作

If InStr(filename,"..")>0 Then
Response.write "禁止跨目錄操作!"
response.end
End IF      

錯誤處理1:

filename=Replace(filename, "../", "") '替換../為空 
filename=Replace(filename, "./", "")       

代碼對../和./進行過濾用來防止目錄跳轉,但可以通過構造參數饒過檢測.由于檢測替換隻進行一次可以使用....//代替上級目錄,程式替換後....//變成../ 

攻擊代碼示例:filename=.....///sql.asp

錯誤處理2:

If InStr(filename,"../")>0 Then
Response.write "禁止跨目錄操作!"
response.end
End IF      

代碼對../進行檢測,但是忽略了對..\的情況,在windows下,..\也可實作跨目錄。

攻擊代碼示例:filename=..\sql.asp

繼續閱讀