快网首页 | 虚拟主机 | 域名注册 | 特惠套餐 | 企业邮局 | SQL空间 | IDC业务 | 全球通邮
upfile上传漏洞,修补upfile上传漏洞
客服中心新闻动态常见问题常用资料知识学堂走近客服在线提问网站导航
upfile上传漏洞,修补upfile上传漏洞
 网页设计 | 操作系统 | 程序开发 | Dos 命令 | 平面设计 | 办公软件

 您的位置:快网首页 >> 客服中心 >> 知识学堂 >> 程序开发 >> 文章正文

修补upfile.asp上传漏洞
供稿:润之康   时间:2009-3-4 13:58:15

ASP文件相关的一些函数。有以下几个:
1. 得到文件扩展名
2. ASP上传文件漏洞检测
3. 格式化显示文件大小
4. asp检测上传图片是否为真实图片
5. 上传文件扩展名检测
6. 取得文件对应的图标
7. 下载文件等相关函数


程序代码:

<%   
      '*******************************************************
      '作    用: 得到文件扩展名
      '函数名: GetFileExt(fileTrue)
      '参    数: sFileName 文件名
      '返回值: 返回文件扩展名
      '*******************************************************
      function GetFileExt(sFileName)
           GetFileExt = UCase(Mid(sFileName,InStrRev (sFileName, ".")+1))      '下面有附
      End function
   
   
      '*******************************************************
      '作    用: ASP上传漏洞 "\0" 防范
      '函数名: TrueStr(fileTrue)
      '参    数: sFileName 文件名
      '返回值: 合法文件返回 True ,否则返回False
      '*******************************************************
      function IsTrueFileName(sFileName)
          dim str_len,pos
          str_len=len(sFileName)
          pos=Instr(sFileName,chr(0))
          If pos=0 or pos=str_len then
              IsTrueFileName = true
          else
              IsTrueFileName = false
          End If
      End function
   

      '*******************************************************
      '作    用: 检测上传的图片文件(jpeg,gif,bmp,png)是否真的为图片
      '函数名: TrueStr(fileTrue)
      '参    数: sFileName 文件名(此处文件名是文件夹的物理全路径)
      '返回值: 确实为图片文件则返回 True ,否则返回False
      '*******************************************************
      function IsImgFile(sFileName)
          const adTypeBinary=1
          dim return
          dim jpg(1):jpg(0)=CByte(&HFF):jpg(1)=CByte(&HD8)
          dim bmp(1):bmp(0)=CByte(&H42):bmp(1)=CByte(&H4D)
          dim png(3):png(0)=CByte(&H89):png(1)=CByte(&H50):png(2)=CByte(&H4E):png(3)=CByte(&H47)
          dim gif(5):gif(0)=CByte(&H47):gif(1)=CByte(&H49):gif(2)=CByte(&H46):gif(3)=CByte(&H39):gif(4)=CByte(&H38):gif(5)=CByte(&H61)
       
          on error resume next
       
          return=false
          dim fstream,fileExt,stamp,i
          '得到文件后缀并转化为小写
          FileExt = LCase(GetFileExt(sFileName))
          '如果文件后缀为 jpg,jpeg,bmp,gif,png 中的任一种
          '则执行真实图片判断
          If strInString(FileExt,"jpg|jpeg|bmp|gif|png")=true then
              Set fstream=Server.createobject("ADODB.Stream")
              fstream.Open
              fstream.Type=adTypeBinary
              fstream.LoadFromFile sFileName
              fstream.position=0
              select case LCase(FileExt)
              case "jpg","jpeg"
                  stamp=fstream.read(2)
                  for i=0 to 1
                      If ascB(MidB(stamp,i+1,1))=jpg(i) then return=true else return=false
                  next
              case "gif"
                  stamp=fstream.read(6)
                  for i=0 to 5
                      If ascB(MidB(stamp,i+1,1))=gif(i) then return=true else return=false
                  next
              case "png"
                  stamp=fstream.read(4)
                  for i=0 to 3
                      If ascB(MidB(stamp,i+1,1))=png(i) then return=true else return=false
                  next
              case "bmp"
                  stamp=fstream.read(2)
                  for i=0 to 1
                      If ascB(MidB(stamp,i+1,1))=bmp(i) then return=true else return=false
                  next
              End select
           
              fstream.Close
              Set fseteam=nothing
              If err.number<>0 then return = false
          else
              return = true
          End If
          IsImgFile = return
      End function


      '*******************************************************
      '作    用: 上传文件扩展名检测
      '函数名: CheckFileExt
      '参    数: sFileExt 上传文件夹的后缀
      '          strExt     允许或禁止上传文件夹的后缀,多个以"|"分隔
      '          blnAllow 是允许还是禁止上传 strExt 中指定的后缀
      '返回值: 合法文件返回 True ,否则返回False
      '*******************************************************
      Function CheckFileExt(sFileExt,strExt,blnAllow)
          dim arrExt,return
          '= 禁止上传的文件列表
          'strExt = "EXE|JS|BAT|HTML|HTM|COM|ASP|ASA|DLL|PHP|JSP|CGI"
          sFileExt = UCase(sFileExt)
          strExt     = UCase(strExt)   
          arrExt = split(strExt,"|")
          If blnAllow=true then           '只允许上传指定的文件
              return = false
              for i=0 to UBound(arrExt)
                  If sFileExt=arrExt(i) then return=true
              next
              'response.write "Ext: "&sFileExt & " return: " & return & "     "
          else                          '禁止上传指定的文件
              return = true
              for i=0 to UBound(arrExt)
                  If sFileExt=arrExt(i) then return=false
              next
          End If
          CheckFileExt = return
      End Function
   
   
      '*******************************************************
      '作    用: 格式化显示文件大小
      'FileSize: 文件大小
      '*******************************************************
      Function FormatSize(FileSize)
          If FileSize<1024 then FormatSize = FileSize & " Byte"
          If FileSize/1024 <1024 And FileSize/1024 > 1 then
              FileSize = FileSize/1024
              FormatSize=round(FileSize*100)/100 & " KB"
          Elseif FileSize/(1024*1024) > 1 Then
              FileSize = FileSize/(1024*1024)
              FormatSize = round(FileSize*100)/100 & " MB"
          End If
      End function
   
   
      '*******************************************************
      '作    用: 取得文件对应的图标
      '函数名: FormatSize(FileSize)
      '参    数: FileName 文件名
      '返回值: 合法文件返回 True ,否则返回False
      '*******************************************************
      Function GetFileIcon(FileName)
          dim FileExt,Fso1
          FileExt = GetFileExt(FileName)
          ImgPath= strAdminRoot &    "Style/images/file/" & FileExt & ".gif"
          Set Fso1 = Server.CreateObject("Scripting.FileSystemObject")
          If Fso1.fileExists(server.MapPath(ImgPath))=true then
              GetFileIcon= "<img src=""" & ImgPath & """>"
          else
              GetFileIcon= "<img src=""" & strAdminRoot & "Style/images/file/unknow.gif" & """>"
          End If
          Set Fso1=nothing
      End Function

      '*******************************************************
      '作用:下载文件。
      '函数名: DownFile(FileName)
      ' FileName
      '*******************************************************
      Sub DownFile(FileName)
        fname = server.MapPath(fname)
        filename=split(fname,"\")
   
        Set objAdoStream=Server.createObject("ADODB.Stream")
        objAdoStream.Type=1
        objAdoStream.open()
        objAdoStream.LoadFromFile(fname)
        strchar=objAdoStream.Read()
        fsize=objAdoStream.size
        objAdoStream.Close()
        Set objAdoStream=nothing 
     
        Response.AddHeader "content-type","application/x-msdownload"
        response.AddHeader "Content-Disposition","attachment;filename=" & filename(ubound(filename))
        Response.AddHeader "content-length", fsize
    
        Response.BinaryWrite(strchar)
        Response.Flush()
      End Sub
%>
------------------------------------------------------------------------------------------------------------------------------

附1:

Mid 函数
返回 Variant (String),其中包含字符串中指定数量的字符。
语法
Mid(string, start[, length])
start 必要参数。为 Long。string 中被取出部分的字符位置。如果 start 超过 string 的字符数,Mid 返回零长度字符串 ("")。
length 可选参数;为 Variant (Long)。要返回的字符数。如果省略或 length 超过文本的字符数(包括 start 处的字符),将返回字符串中从 start 到尾端的所有字符。

有可能是你的start变量值大于字符串长度,导致返回空字符串,或者是变量值为0,导致错误

附2:

InstrRev的用法


描述
返回某字符串在另一个字符串中出现的从结尾计起的位置。
语法
InstrRev(string1, string2[, start[, compare]])
InstrRev 函数的语法有以下参数:

参数 描述
string1 必选。接受搜索的字符串表达式。
string2 必选。被搜索的字符串表达式。
start 可选。数值表达式,用于设置每次搜索的开始位置。如果省略,则默认值为 -1,表示从最后一个字符的位置开始搜索。如果 start 包含 Null,则出现错误。
compare 可选。在计算子字符串时,指示要使用的比较类型的数值。如果省略,将执行二进制比较。有关数值,请参阅“设置”部分。


设置
compare 参数可以有以下值:
常数 Value 描述
vbBinaryCompare 0 执行二进制比较。
vbTextCompare 1 执行文本比较。
vbDatabaseCompare 2 执行基于包含在数据库(在此数据库中执行比较)中的信息的比较。


返回值
InStrRev 返回以下值:
如果 InStrRev 返回
string1 为零长度 0
string1 为 Null Null
string2 为零长度 start
string2 为 Null Null
string2 没有找到 0
在 string1 中找到 string2 找到匹配字符串的位置
start > Len(string2) 0


说明
请注意 InstrRev 函数的语法不同于 Instr 函数的语法。


快网保留以上说明的最终解释权
快网,域名注册,虚拟主机,ASP空间,企业邮局,SQL空间,主机租用,主机托管
   
热门搜索:FTP 域名 DNS 备案 空间 邮箱 SQL 主机 快网 中文域名 虚拟主机
快网,域名注册,虚拟主机,ASP空间,企业邮局,SQL空间,主机租用,主机托管
快网客服中心的相关信息:
v ASP六大对象介绍 [2009-3-2 21:57:36]
v 经验总结:ASP与存储过程解析 [2009-3-2 21:51:42]
v ASP错误提示大全 [2009-3-2 21:49:39]
v ASP进阶学习必经之认识数学函数11种 [2009-3-2 21:47:57]
v ASP开发10条经验总结 [2009-3-2 21:46:01]
快网,域名注册,虚拟主机,ASP空间,企业邮局,SQL空间,主机租用,主机托管
快网,域名注册,虚拟主机,ASP空间,企业邮局,SQL空间,主机租用,主机托管
如果您在使用我们的产品中遇到问题,建议您首先在“常见问题”中查询解决方法;
如果没有找到该问题的解决方法,您可以在“问题搜索”中进行搜索;
如果搜索后没有找到满意答案,您可以“在线提问”,我们会尽快给您答复。
快网,域名注册,虚拟主机,ASP空间,企业邮局,SQL空间,主机租用,主机托管
域名注册查询中文域名转码
域名whois查询网站PR值查询
快网,域名注册,虚拟主机,ASP空间,企业邮局,SQL空间,主机租用,主机托管

:::::: | 收藏本站 | 关于我们 | 客服中心 | 付款方式 | 联系我们 | 网站律师 | 工作机会 | 网站地图 | 产品管理 | ::::::

Copyright (C) 2003-2008 天津追日科技发展有限公司  Cnkuai.cn  快网.cn  中国快网.cn