Ejemplo básico de ASP: solución de la vulnerabilidad de carga de imágenes ASP
Una vulnerabilidad de carga ASP comúnmente escuchada es cargar algunos archivos troyanos cambiando sus nombres de sufijo (a sufijos de archivos de imagen).
Utilice la siguiente función para identificar esta situación:
<%
'************************************************ * ****************
'La función CheckFileType se utiliza para comprobar si el archivo es un archivo de imagen
'El nombre del archivo del parámetro es la ruta del archivo local
'Si es uno de los archivos jpeg, gif, bmp, png, la función devuelve verdadero, en caso contrario devuelve falso
'************************************************ * ****************
constante tipo de anuncioBinario = 1
tenue jpg(1):jpg(0)=CByte(&HFF):jpg(1)=CByte(&HD8)
tenue bmp(1):bmp(0)=CByte(&H42):bmp(1)=CByte(&H4D)
tenue png(3):png(0)=CByte(&H89):png(1)=CByte(&H50):png(2)=CByte(&H4E):png(3)=CByte(&H47)
gif tenue(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)
función CheckFileType (nombre de archivo)
en caso de error reanudar siguiente
CheckFileType=falso
dim fstream,fileExt,sello,i
fileExt=mid(nombre de archivo,InStrRev(nombre de archivo,.)+1)
establecer fstream=Servidor.createobject(ADODB.Stream)
fstream.abierto
fstream.Type=tipo de anuncioBinary
fstream.LoadFromFile nombre de archivo
fstream.posición=0
seleccionar archivo de casoExt
caso jpg, jpeg
sello=fstream.read(2)
para i=0 a 1
si ascB(MidB(sello,i+1,1))=jpg(i) entonces CheckFileType=true de lo contrario CheckFileType=false
próximo
gif de caso
sello=fstream.read(6)
para i=0 a 5
si ascB(MidB(sello,i+1,1))=gif(i) entonces CheckFileType=true de lo contrario CheckFileType=false
próximo
caso png
sello=fstream.read(4)
para i=0 a 3
si ascB(MidB(sello,i+1,1))=png(i) entonces CheckFileType=true de lo contrario CheckFileType=false
próximo
caso bmp
sello=fstream.read(2)
para i=0 a 1
si ascB(MidB(sello,i+1,1))=bmp(i) entonces CheckFileType=true de lo contrario CheckFileType=false
próximo
finalizar seleccionar
fstream.Cerrar
establecer fseteam=nada
si err.number<>0 entonces CheckFileType=false
función final
%>
Luego al aplicar
CheckFileType(servidor.mappath(cnbruce.jpg))
o
CheckFileType(F:/web/164/images/cnbruce.jpg))
De todos modos, es para detectar y verificar el tipo de archivo de imagen de la dirección física local y devolver un valor verdadero o falso.
Por lo tanto, esta situación se aplica a la carga de imágenes. El método actual es permitir primero la carga del archivo de pseudoimagen y luego usar la función personalizada anterior para determinar si el archivo cumple con las especificaciones de la imagen. Caballo de Troya, FSO lo eliminará, como por ejemplo:
file.SaveAs Server.mappath(nombre de archivo) 'Guardar el archivo
Si no es CheckFileType(Server.mappath(nombre de archivo)), entonces
respuesta.escribir formato de imagen incorrecto
Establecer fso = CreateObject(Scripting.FileSystemObject)
Establecer ficn = fso.GetFile(Server.mappath(nombre de archivo))
ficn.delete
setficn=nada
establecer fso = nada
respuesta.fin
terminar si
El archivo se carga primero y luego se utiliza inmediatamente una función personalizada para determinar la coherencia del tipo de imagen del archivo y FSO elimina el archivo.
La vulnerabilidad de carga ASP también usa /0 para manipular la ruta del archivo.
Para esta situación, se puede utilizar la siguiente función:
función TrueStr(archivoVerdadero)
str_len=len(archivoVerdadero)
pos=Instr(archivoVerdadero,chr(0))
si pos=0 o pos=str_len entonces
TrueStr=verdadero
demás
TrueStr=falso
terminar si
función final
Luego podrá emitir un juicio antes de cargar el archivo.
si TrueStr(nombre de archivo)=false entonces
respuesta.escribir archivo ilegal
respuesta.fin
terminar si
archivo.Guardar como servidor.mappath(nombre de archivo)