تتمثل إحدى الثغرة الأمنية الشائعة في تحميل ASP في تحميل بعض ملفات طروادة عن طريق تغيير أسماء لاحقاتها (إلى لاحقات ملفات الصور).
استخدم الوظيفة التالية لتحديد هذا الموقف:
<%
'************************************************************************************************************************************************************************ * ****************
'يتم استخدام وظيفة 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
خافت 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
نهاية إذا
يتم تحميل الملف أولاً، ثم يتم استخدام وظيفة مخصصة على الفور لتحديد تناسق نوع صورة الملف، ويقوم FSO بحذف الملف.
تستخدم ثغرة تحميل ASP أيضًا /0 لمعالجة مسار الملف.
في هذه الحالة، يمكن استخدام الوظيفة التالية:
الدالة TrueStr(fileTrue)
str_len=len(fileTrue)
pos=Instr(fileTrue,chr(0))
إذا pos=0 أو pos=str_len إذن
TrueStr=true
آخر
TrueStr=false
نهاية إذا
وظيفة النهاية
وبعد ذلك يمكنك إصدار حكم قبل تحميل الملف.
إذا TrueStr(filename)=false إذن
استجابة.كتابة ملف غير قانوني
استجابة. النهاية
نهاية إذا
file.SaveAs Server.mappath(اسم الملف)
%>