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出于安全考虑,这一选项默认是关闭的。

漏洞利用:

 漏洞修复:

如果存在.. 就结束脚本,禁止跨目录进行操作

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

原文地址:https://www.cnblogs.com/xiaozi/p/7283912.html