ช่องโหว่ในการอัพโหลด 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, แสตมป์, i
fileExt=mid(ชื่อไฟล์,InStrRev(ชื่อไฟล์,.)+1)
ตั้งค่า fstream=Server.createobject(ADODB.Stream)
fstream.เปิด
fstream.Type=adTypeBinary
ชื่อไฟล์ fstream.LoadFromFile
fstream.position=0
เลือก case fileExt
กรณีjpg,jpeg
แสตมป์=fstream.read(2)
สำหรับ i=0 ถึง 1
ถ้า ascB(MidB(stamp,i+1,1))=jpg(i) ดังนั้น CheckFileType=true อย่างอื่น CheckFileType=false
ต่อไป
เคสกิ๊ฟ
แสตมป์=fstream.read(6)
สำหรับ i=0 ถึง 5
ถ้า ascB(MidB(stamp,i+1,1))=gif(i) ดังนั้น CheckFileType=true อย่างอื่น CheckFileType=false
ต่อไป
กรณี PNG
แสตมป์=fstream.read(4)
สำหรับ i=0 ถึง 3
ถ้า ascB(MidB(stamp,i+1,1))=png(i) ดังนั้น CheckFileType=true อย่างอื่น CheckFileType=false
ต่อไป
กรณี bmp
แสตมป์=fstream.read(2)
สำหรับ i=0 ถึง 1
ถ้า ascB(MidB(stamp,i+1,1))=bmp(i) ดังนั้น CheckFileType=true อย่างอื่น CheckFileType=false
ต่อไป
สิ้นสุดการเลือก
fstream.ปิด
ตั้งค่า fseteam=ไม่มีอะไร
ถ้า err.number<>0 ให้ CheckFileType=false
ฟังก์ชั่นสิ้นสุด
-
แล้วตอนสมัคร.
CheckFileType(server.mappath(cnbruce.jpg))
หรือ
ตรวจสอบประเภทไฟล์(F:/web/164/images/cnbruce.jpg))
อย่างไรก็ตาม มันคือการตรวจจับและตรวจสอบประเภทไฟล์รูปภาพของที่อยู่ทางกายภาพในเครื่องและส่งกลับค่าจริงหรือเท็จ
ดังนั้น สถานการณ์นี้จึงนำไปใช้กับการอัปโหลดรูปภาพ วิธีการปัจจุบันคือการอนุญาตให้อัปโหลดไฟล์รูปภาพปลอมก่อน จากนั้นจึงใช้ฟังก์ชันที่กำหนดเองข้างต้นเพื่อตรวจสอบว่าไฟล์นั้นตรงตามข้อกำหนดเฉพาะของรูปภาพหรือไม่ หากเป็นไฟล์รูปภาพที่ปลอมแปลงมา ม้าโทรจัน FSO จะลบมัน เช่น :
file.SaveAs Server.mappath(ชื่อไฟล์) 'บันทึกไฟล์
หากไม่ใช่ CheckFileType(Server.mappath(filename)) แล้ว
ตอบกลับเขียนรูปแบบรูปภาพผิด
ตั้งค่า fso = CreateObject (Scripting.FileSystemObject)
ตั้งค่า ficn = fso.GetFile (Server.mappath (ชื่อไฟล์))
ฟิค ลบ
setficn=ไม่มีอะไร
ตั้งค่า fso=nothing
การตอบสนองสิ้นสุด
สิ้นสุดถ้า
ไฟล์จะถูกอัปโหลดก่อน จากนั้นฟังก์ชันแบบกำหนดเองจะถูกใช้ทันทีเพื่อกำหนดความสอดคล้องของประเภทรูปภาพของไฟล์ และ FSO จะลบไฟล์
ช่องโหว่ในการอัปโหลด ASP ยังใช้ /0 เพื่อจัดการเส้นทางไฟล์
สำหรับสถานการณ์นี้ คุณสามารถใช้ฟังก์ชันต่อไปนี้:
ฟังก์ชั่น TrueStr (fileTrue)
str_len=len(fileTrue)
pos=Instr(fileTrue,chr(0))
ถ้า pos=0 หรือ pos=str_len แล้ว
TrueStr=จริง
อื่น
TrueStr=เท็จ
สิ้นสุดถ้า
ฟังก์ชั่นสิ้นสุด
จากนั้นคุณสามารถตัดสินก่อนอัปโหลดไฟล์ได้
ถ้า TrueStr(ชื่อไฟล์)=false แล้ว
response.write ไฟล์ที่ผิดกฎหมาย
การตอบสนองสิ้นสุด
สิ้นสุดถ้า
file.SaveAs Server.mappath (ชื่อไฟล์)
-