本文共 1192 字,大约阅读时间需要 3 分钟。
文件下载漏洞
漏洞代码:
<% 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 ThenResponse.write "禁止跨目录操作!"response.endEnd IF
错误处理1:
filename=Replace(filename, "../", "") '替换../为空 filename=Replace(filename, "./", "")
代码对../和./进行过滤用来防止目录跳转,但可以通过构造参数饶过检测.由于检测替换只进行一次可以使用....//代替上级目录,程序替换后....//变成../
攻击代码示例:filename=.....///sql.asp
错误处理2:
If InStr(filename,"../")>0 ThenResponse.write "禁止跨目录操作!"response.endEnd IF
代码对../进行检测,但是忽略了对..\的情况,在windows下,..\也可实现跨目录。
攻击代码示例:filename=..\sql.asp
转载地址:http://qfddx.baihongyu.com/