ASP の基本的な例: ASP 画像アップロードの脆弱性を解決する
よく聞かれる ASP アップロードの脆弱性は、サフィックス名を (イメージ ファイルのサフィックスに) 変更して、トロイの木馬ファイルをアップロードするというものです。
この状況を特定するには、次の関数を使用します。
<%
'************************************************ * ****************
'ファイルが画像ファイルかどうかをチェックするためにCheckFileType関数が使用されます
'パラメータのファイル名はローカルファイルのパスです
'ファイルが jpeg、gif、bmp、png のいずれかである場合、関数は true を返し、それ以外の場合は false を返します。
'************************************************ * ****************
const adTypeBinary=1
薄暗い jpg(1):jpg(0)=CByte(&HFF):jpg(1)=CByte(&HD8)
dim bmp(1):bmp(0)=CByte(&H42):bmp(1)=CByte(&H4D)
dim 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
dim fstream、fileExt、stamp、i
fileExt=mid(ファイル名,InStrRev(ファイル名,.)+1)
set fstream=Server.createobject(ADODB.Stream)
fstream.Open
fstream.Type=adTypeBinary
fstream.LoadFromFile ファイル名
fstream.position=0
ケースファイル拡張子を選択
ケースjpg、jpeg
スタンプ=fstream.read(2)
i=0~1の場合
if ascB(MidB(stamp,i+1,1))=jpg(i) then CheckFileType=true else CheckFileType=false
次
ケースgif
スタンプ=fstream.read(6)
i=0~5の場合
if ascB(MidB(stamp,i+1,1))=gif(i) then CheckFileType=true else CheckFileType=false
次
ケースpng
スタンプ=fstream.read(4)
i=0~3の場合
if ascB(MidB(stamp,i+1,1))=png(i) then CheckFileType=true else CheckFileType=false
次
ケースbmp
スタンプ=fstream.read(2)
i=0~1の場合
if ascB(MidB(stamp,i+1,1))=bmp(i) then CheckFileType=true else CheckFileType=false
次
エンドセレクト
fstream.Close
fseteam=何も設定しない
err.number<>0 の場合、CheckFileType=false
終了関数
%>
それから申し込みの際に
CheckFileType(server.mappath(cnbruce.jpg))
または
CheckFileType(F:/web/164/images/cnbruce.jpg))
とにかく、ローカル物理アドレスのイメージ ファイル タイプを検出して検証し、true または false の値を返すことです。
したがって、この状況は画像のアップロードに当てはまります。現在の方法では、最初に疑似画像ファイルのアップロードを許可し、そのファイルが画像の仕様を満たしているかどうかを判断します。トロイの木馬、FSO は次のようなものを削除します。
file.SaveAs Server.mappath(filename) 'ファイルを保存します
CheckFileType(Server.mappath(filename)) でない場合は、
応答。間違った画像形式を書き込みます
fso = CreateObject(Scripting.FileSystemObject) を設定します。
Set ficn = fso.GetFile(Server.mappath(ファイル名))
ficn.削除
setficn=何もしない
fso=何も設定しない
応答.終了
終了する場合
最初にファイルがアップロードされ、その後すぐにカスタム関数を使用してファイル イメージ タイプの一貫性が判断され、FSO によってファイルが削除されます。
ASP アップロードの脆弱性では、ファイルパスの操作にも /0 が使用されます。
この状況では、次の関数を使用できます。
関数 TrueStr(fileTrue)
str_len=len(fileTrue)
pos=Instr(fileTrue,chr(0))
pos=0 または pos=str_len の場合
TrueStr=true
それ以外
TrueStr=false
終了する場合
終了関数
そうすれば、ファイルをアップロードする前に判断できます。
TrueStr(ファイル名)=false の場合
応答。不正なファイルを書き込みます
応答.終了
終了する場合
file.SaveAs Server.mappath(ファイル名)