لا بد أننا سمعنا عن ثغرة أمنية في تحميل ASP. المبدأ هو تعديل اسم اللاحقة لبعض ملفات طروادة (إلى لاحقة ملف الصورة) وتحميلها.
ملاحظة: لا يمكن لـ CheckFileType تحديد الملفات المتخفية كـ GIF89a.
استخدم الوظيفة التالية لتحديد هذا الموقف:
<%
'************************************************************************************************************************************************************************ * ****************
'يتم استخدام وظيفة CheckFileType للتحقق مما إذا كان الملف عبارة عن ملف صورة
'اسم ملف المعلمة هو مسار الملف المحلي
'إذا كان أحد الملفات jpeg، gif، bmp، png، فسترجع الدالة صحيحًا، وإلا فإنها ترجع خطأ
'************************************************************************************************************************************************************************ * ****************
const adTypeBinary=1
خافت jpg(1):jpg(0)=CByte(&HFF):jpg(1)=CByte(&HD8)
خافت bmp(1):bmp(0)=CByte(&H42):bmp(1)=CByte(&H4D)
خافت png(3):png(0)=CByte(&H89):png(1)=CByte(&H50):png(2)=CByte(&H4E):png(3)=CByte(&H47)
خافت gif(5):gif(0)=CByte(&H47):gif(1)=CByte(&H49):gif(2)=CByte(&H46):gif(3)=CByte(&H39):gif(4) =CByte(&H38):gif(5)=CByte(&H61)
وظيفة CheckFileType (اسم الملف)
على خطأ استئناف المقبل
CheckFileType=false
اسم الملف = LCase (اسم الملف)
خافت fstream، fileExt، ختم، أنا
fileExt=mid(filename,InStrRev(filename,.)+1)
تعيين fstream=Server.createobject(ADODB.Stream)
fstream.Open
fstream.Type=adTypeBinary
fstream.LoadFromFile اسم الملف
fstream.position=0
حدد ملف القضية
حالة JPG، الحياة السياسية في فرنسا
ختم=fstream.read(2)
لأني = 0 إلى 1
إذا كان ascB(MidB(stamp,i+1,1))=jpg(i) ثم CheckFileType=true وإلا CheckFileType=false
التالي
حالة GIF
ختم=fstream.read(6)
لأني = 0 إلى 5
إذا ascB(MidB(stamp,i+1,1))=gif(i) ثم CheckFileType=true وإلا CheckFileType=false
التالي
حالة بابوا نيو غينيا
ختم=fstream.read(4)
لأني = 0 إلى 3
إذا ascB(MidB(stamp,i+1,1))=png(i) ثم CheckFileType=true وإلا CheckFileType=false
التالي
حالة bmp
ختم=fstream.read(2)
لأني = 0 إلى 1
إذا كان ascB(MidB(stamp,i+1,1))=bmp(i) ثم CheckFileType=true وإلا CheckFileType=false
التالي
حدد النهاية
fstream.Close
تعيين fseteam=لا شيء
إذا كان err.number<>0 فإن CheckFileType=false
وظيفة النهاية
%>
ثم عند التقديم
CheckFileType(server.mappath(cnbruce.jpg))
أو
CheckFileType(F:/web/164/images/cnbruce.jpg))
على أي حال، يتم اكتشاف نوع ملف الصورة للعنوان الفعلي المحلي والتحقق منه وإرجاع قيمة صحيحة أو خاطئة.
لذلك، ينطبق هذا الموقف على تحميل الصور. الطريقة الحالية هي السماح أولاً بتحميل ملف الصورة الزائفة، ثم استخدام الوظيفة المخصصة أعلاه لتحديد ما إذا كان الملف يلبي مواصفات الصورة إذا كان ملف صورة مقنعًا حصان طروادة، سوف يقوم FSO بحذفه، مثل:
file.SaveAs Server.mappath(filename) 'احفظ الملف
إذا لم يكن CheckFileType(Server.mappath(filename)) إذن
استجابة.كتابة تنسيق الصورة الخاطئة
تعيين fso = CreateObject(Scripting.FileSystemObject)
تعيين ficn = fso.GetFile(Server.mappath(filename))
ficn.delete
setficn=لا شيء
تعيين fso=لا شيء
Response.end
نهاية إذا
تستخدم ثغرة تحميل ASP أيضًا /0 لمعالجة مسار الملف.
http://www.vevb.com/blog/showlog.asp?cat_id=32&log_id=635
في هذه الحالة، يمكنك استخدام الوظيفة التالية
الدالة TrueStr(fileTrue)
str_len=len(fileTrue)
pos=Instr(fileTrue,chr(0))
إذا pos=0 أو pos=str_len إذن
TrueStr=true
آخر
TrueStr=false
نهاية إذا
وظيفة النهاية
وبعد ذلك يمكنك إصدار حكم قبل تحميل الملف.
إذا TrueStr(filename)=false إذن
استجابة.كتابة ملف غير قانوني
Response.end
نهاية إذا
file.SaveAs Server.mappath(اسم الملف)