upfile.asp上傳漏洞的修補(bǔ)方法
修補(bǔ)upfile.asp上傳漏洞
ASP文件相關(guān)的一些函數(shù)。有以下幾個(gè):
1. 得到文件擴(kuò)展名
2. ASP上傳文件漏洞檢測(cè)
3. 格式化顯示文件大小
4. asp檢測(cè)上傳圖片是否為真實(shí)圖片
5. 上傳文件擴(kuò)展名檢測(cè)
6. 取得文件對(duì)應(yīng)的圖標(biāo)
7. 下載文件等相關(guān)函數(shù)
程序代碼:
<%
’*******************************************************
’作 用: 得到文件擴(kuò)展名
’函數(shù)名: GetFileExt(fileTrue)
’參 數(shù): sFileName 文件名
’返回值: 返回文件擴(kuò)展名
’*******************************************************
function GetFileExt(sFileName)
GetFileExt = UCase(Mid(sFileName,InStrRev (sFileName, “.”)+1)) ’下面有附
End function
’*******************************************************
’作 用: ASP上傳漏洞 “\0″ 防范
’函數(shù)名: TrueStr(fileTrue)
’參 數(shù): 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
’*******************************************************
’作 用: 檢測(cè)上傳的圖片文件(jpeg,gif,bmp,png)是否真的為圖片
’函數(shù)名: TrueStr(fileTrue)
’參 數(shù): sFileName 文件名(此處文件名是文件夾的物理全路徑)
’返回值: 確實(shí)為圖片文件則返回 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
’得到文件后綴并轉(zhuǎn)化為小寫
FileExt = LCase(GetFileExt(sFileName))
’如果文件后綴為 jpg,jpeg,bmp,gif,png 中的任一種
’則執(zhí)行真實(shí)圖片判斷
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
’*******************************************************
’作 用: 上傳文件擴(kuò)展名檢測(cè)
’函數(shù)名: CheckFileExt
’參 數(shù): sFileExt 上傳文件夾的后綴
’ strExt 允許或禁止上傳文件夾的后綴,多個(gè)以”|”分隔
’ 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
’*******************************************************
’作 用: 取得文件對(duì)應(yīng)的圖標(biāo)
’函數(shù)名: FormatSize(FileSize)
’參 數(shù): FileName 文件名
’返回值: 合法文件返回 True ,否則返回False
’*******************************************************
Function GetFileIcon(FileName)
dim FileExt,Fso1
FileExt = GetFileExt(FileName)
ImgPath= strAdminRoot & ”Style/images/file/” & FileExt & “.gif”
Set Fso1 = Server.CreateObject(“ing.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
’*******************************************************
’作用:下載文件。
’函數(shù)名: 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 函數(shù)
返回 Variant (String),其中包含字符串中指定數(shù)量的字符。
語(yǔ)法
Mid(string, start[, length])
start 必要參數(shù)。為 Long。string 中被取出部分的字符位置。如果 start 超過(guò) string 的字符數(shù),Mid 返回零長(zhǎng)度字符串 (“”)。
length 可選參數(shù);為 Variant (Long)。要返回的字符數(shù)。如果省略或 length 超過(guò)文本的字符數(shù)(包括 start 處的字符),將返回字符串中從 start 到尾端的所有字符。
有可能是你的start變量值大于字符串長(zhǎng)度,導(dǎo)致返回空字符串,或者是變量值為0,導(dǎo)致錯(cuò)誤
附2:
InstrRev的用法
描述
返回某字符串在另一個(gè)字符串中出現(xiàn)的從結(jié)尾計(jì)起的位置。
語(yǔ)法
InstrRev(string1, string2[, start[, compare]])
InstrRev 函數(shù)的語(yǔ)法有以下參數(shù):
參數(shù) 描述
string1 必選。接受搜索的字符串表達(dá)式。
string2 必選。被搜索的字符串表達(dá)式。
start 可選。數(shù)值表達(dá)式,用于設(shè)置每次搜索的開(kāi)始位置。如果省略,則默認(rèn)值為 -1,表示從最后一個(gè)字符的位置開(kāi)始搜索。如果 start 包含 Null,則出現(xiàn)錯(cuò)誤。
compare 可選。在計(jì)算子字符串時(shí),指示要使用的比較類型的數(shù)值。如果省略,將執(zhí)行二進(jìn)制比較。有關(guān)數(shù)值,請(qǐng)參閱“設(shè)置”部分。
設(shè)置
compare 參數(shù)可以有以下值:
常數(shù) Value 描述
vbBinaryCompare 0 執(zhí)行二進(jìn)制比較。
vbTextCompare 1 執(zhí)行文本比較。
vbDatabaseCompare 2 執(zhí)行基于包含在數(shù)據(jù)庫(kù)(在此數(shù)據(jù)庫(kù)中執(zhí)行比較)中的信息的比較。
返回值
InStrRev 返回以下值:
如果 InStrRev 返回
string1 為零長(zhǎng)度 0
string1 為 Null Null
string2 為零長(zhǎng)度 start
string2 為 Null Null
string2 沒(méi)有找到 0
在 string1 中找到 string2 找到匹配字符串的位置
start > Len(string2) 0
說(shuō)明請(qǐng)注意 InstrRev 函數(shù)的語(yǔ)法不同于 Instr 函數(shù)的語(yǔ)法。
關(guān)健詞:upfile.asp
新文章:
- CentOS7下圖形配置網(wǎng)絡(luò)的方法
- CentOS 7如何添加刪除用戶
- 如何解決centos7雙系統(tǒng)后丟失windows啟動(dòng)項(xiàng)
- CentOS單網(wǎng)卡如何批量添加不同IP段
- CentOS下iconv命令的介紹
- Centos7 SSH密鑰登陸及密碼密鑰雙重驗(yàn)證詳解
- CentOS 7.1添加刪除用戶的方法
- CentOS查找/掃描局域網(wǎng)打印機(jī)IP講解
- CentOS7使用hostapd實(shí)現(xiàn)無(wú)AP模式的詳解
- su命令不能切換root的解決方法
- 解決VMware下CentOS7網(wǎng)絡(luò)重啟出錯(cuò)
- 解決Centos7雙系統(tǒng)后丟失windows啟動(dòng)項(xiàng)
- CentOS下如何避免文件覆蓋
- CentOS7和CentOS6系統(tǒng)有什么不同呢
- Centos 6.6默認(rèn)iptable規(guī)則詳解