現在の Web ベースの攻撃は一般にインジェクションです。インジェクションの理由は通常、変数のフィルタリングが不完全であるため、侵入者がプログラムを不正に実行したり、任意のデータをクエリおよび変更したりする可能性があります。インジェクション攻撃がますます激しくなるにつれて、いくつかの特殊なフィルタリング コードが登場しました。ただし、一部のフィルタリング コードに不完全性があると、新たな攻撃につながる可能性があります。以下では、最も広く使用されているフィルタリング コードである SQL ユニバーサル アンチインジェクション プログラムを使用して、脆弱性の原因、利用方法、予防策を説明します。
SQL ユニバーサル アンチインジェクション プログラムは、Firefox の Feng Zhiqiu によって作成されました。これは、かなり完全なアンチインジェクション コードです。定義されたフィルター文字の取得送信フィルタリングを実装でき、攻撃者の IP によって送信されたデータ情報を記録できます。これを使用する場合、ファイルのヘッダーにコード <--#Include File="WrSky_Sql.Asp"--> を追加するだけで、変数のフィルタリングを実現するためのインジェクションを防止できます。データベース接続ファイル (conn.asp など) の後にプログラム コードを追加すると、サイト全体の可変フィルタリングを実現でき、それによってインジェクション防止効果が得られます。
さて、最初に変数フィルタリング部分のコードを見てみましょう:
'----------定義部分------
ディム Fy_Post,Fy_Get,Fy_In,Fy_Inf,Fy_Xh,Fy_db,Fy_dbstr
'フィルタリングする必要がある文字列を「maple」で区切ってカスタマイズします
Fy_In = "' メイプル; メイプルとメイプルの実行 メイプルの挿入 メイプルの選択 メイプルの削除 メイプルの更新 メイプル数 メイプル * メイプル% メイプル chr メイプル ミッド メイプル マスター メイプル 切り捨て メイプル チャー メイプル宣言"
----------------------------------
%>
<
Fy_Inf = split(Fy_In,"メイプル")
'----------POST パート -------
Request.Form<>の場合
Request.Form の各 Fy_Post について
Fy_Xh=0 から Ubound(Fy_Inf) まで
If Instr(LCase(Request.Form(Fy_Post)),Fy_Inf(Fy_Xh))<>Then
'----------パーツを取得------
If Request.QueryString<>Then
各 Fy_Get In Request.QueryString
For Fy_Xh=0 To Ubound(Fy_Inf)
If Instr(LCase(Request.QueryString(Fy_Get)),Fy_Inf(Fy_Xh))<>
このコードは、「'」や「and」などの一般的に挿入される変数のフィルタリングを定義します。十分か多すぎるかは、自分で行うことができます。文字を追加または削除します。明らかに、get または post を通じてサーバーに送信されたデータにフィルターされた文字が含まれている限り、プログラムによって禁止されます。これにより、フォーラムのデータベース接続ファイルの後にプログラム コードを追加すると、投稿の内容にフィルターされた文字が含まれている限り、禁止されます。デフォルトのフィルタリング内容によると、内容が英語の場合はほぼ投稿できないようです。さらに、フォーラムのスタイルを定義するときに一部の特殊文字 (パーセント記号「%」など) が使用されることがあります。これらの特殊文字がフィルタリングされると、フォーラム全体が正しく機能しなくなります。上記の問題について、dvbbs を使用してテストしたところ、期待どおりの結果が得られました。
上記の問題を解決する方法は、フィルタリングが必要なファイルにのみ接続ステートメントが挿入されないようにすることです。しかし、この作業負荷は比較的大きく、一般的にウェブマスターはどのファイルをフィルタリングする必要があるのかを知りません。したがって、私の提案は、フィルタリング コードを conn.asp に追加してから、フィルタリング コードを含まない connl.asp を作成し、フィルタリングが絶対に必要なく、フィルタリング コードが動作に影響を与えるファイルを接続することです。このファイルを conn1.asp にコピーしますが、2 つのデータ接続ファイルの基本的な内容が一致している必要があることに注意してください。さらに、フィルタリングされた文字をスタイル設定で使用しないことをお勧めします。どうしても使用する必要がある場合は、アンチインジェクション プログラムでこれらの文字のフィルタリングを削除できます。
上記は、反注射プログラムがサイトの運営に及ぼす影響に関するものであり、害を及ぼすことはありません。実際、本当の害はデータ記録部分にあります。コードのこの部分を見てみましょう。''-----
データベースへの書き込み-----ヘッダー-----。 ----
Fy_dbstr="DBQ="+server.mappath("SqlIn.mdb")+";DefaultDir=;DRIVER={Microsoft Access Driver (*.mdb)};"
Set Fy_db=Server.CreateObject("ADODB.CONNECTION")
Fy_db.open Fy_dbstr
Fy_db.Execute("SqlIn(Sqlin_IP,SqlIn_Web,SqlIn_FS,SqlIn_CS,SqlIn_SJ) に挿入します。values('"&Request.ServerVariables("REMOTE_ADDR")&"','"&Request.ServerVariables("URL")&"',' GET','"&Fy_Get&"','"&replace(Request.QueryString(Fy_Get),"'","''")&"')")
Fy_db.close
Fy_db = なしを設定します
'----------データベースへの書き込み------Tail----------
Response.Write "<Script Language=JavaScript>alert('Fengwang SQL ユニバーサル アンチインジェクション システム プロンプト↓ nnパラメータに不正な文字を挿入しないでください nnHTTP://WwW.WrSkY.CoM システムバージョン: V2.0 (ASP) 完全版');<スクリプト>
Response.Write「不正操作です!システムにより以下の記録が作成されました↓<br>」
Response.Write "オペレーション IP:"&Request.ServerVariables("REMOTE_ADDR")&"<br>"
Response.Write "操作時間:"&Now&"<br>
response.Write "操作ページ:"&Request.ServerVariables("URL")&"<br>"
Response.「提出方法:GET<br>」と記載
Response.Write "パラメータを送信:"&Fy_Get&"<br>"
Response.Write "データの送信:"&Request.QueryString(Fy_Get)
応答.終了
終了の場合
次
次
終了の場合
----------------------------------
このコードの機能は、攻撃者の情報と行動を記録することです。必要な対策を講じることができること。コードから、プログラムが攻撃者の IP、送信アドレス、送信内容などを記録していることがわかりますが、ここには明らかにいくつかの抜け穴があります。
1. 頻繁な攻撃は処理されません。言い換えれば、合法的なデータをどのように提出しても、プログラムによって記録されることになり、悪意のある DOS 攻撃につながる可能性が高くなります。これについて実験をしてみました。保護されたファイルの URL の後に次のステートメントを送信します: and (select top l asc(mid (username,l,l)) from admin)>0, キー ウィザードを使用して送信プロセスを記録し、自動的に提出。しばらくすると、データベースのサイズが大幅に変化しました (図 1 および 2 を参照)。ご想像のとおり、Shuoxue などのツールを使用してマルチスレッドの送信を有効にすれば、DOS は間違いなく問題ありません。
図1
図 2
2. レコードのデータ長は切り捨てられません。これは、フォーラムの運営に影響を与えるアンチインジェクション プログラムのテスト中に私が発見したものです。図 3 に示すように、投稿コンテンツにフィルターされた文字が含まれている場合、投稿コンテンツはデータベースに完全に記録されます。一般的なフォーラムや記事システムには、公開される記事の長さに制限がありますが、SQL ユニバーサル アンチインジェクション プログラムでは、これに制限がありません。攻撃者が保護されたファイルの URL の後に長すぎるコンテンツを送信すると、プログラムがクラッシュする可能性があります。被害が比較的大きいためテストはしませんでしたが、100Kまで投稿した内容は通常通り記録されました。
図 3
3. データ コンテンツの変換とデータベースの爆発的な問題。コードから判断すると、プログラムは不正に送信されたデータを変換せずに直接データベースに記録します。つまり、何を送信しても、フィルタリングされたコンテンツが含まれている限り、プログラムは送信したすべてのコンテンツを記録します。この問題は元々深刻なものではありませんが、「セキュリティ」のために、すべての mdb ファイルを asp サフィックスに変更することを好む Web マスターもいます。さらに、アンチインジェクション プログラムのデータベースにはテーブルが 1 つしかないため、テスト プロセス中に、保護されたファイルの URL をデータベースに直接書き込むことで Web シェルを取得できます。保護されたファイルの URL が入力された後、Binglangzi マイクロ ASP バックドアが入力されました。 Ice Fox クライアントに接続すると、wedshll が正常に取得されました。
WebShell を取得するこの方法では、相手のデータベースが ASP 形式で実行されており、データ パスを知っていることを確認する必要があるため、このデータベースのパスを取得する方法を見つける必要があります。通常の状況では、データベースのパスを直接推測できますが、実際には、このパスが公開される可能性があります。アンチインジェクション プログラム全体を見ると、防爆ライブラリ ステートメントは見つからないため、直接アクセスまたは使用するだけで済みます。 %5C メソッド。データベースが公開されます。プログラム コードがデータベース接続ファイルの直後に配置されている場合、通常、データ接続ファイルには防爆ステートメントが含まれているため、データベースのアドレスを公開できません。
上記はすべて、データ記録プロセスにおける問題であり、大量のデータが繰り返し送信された場合に IP を自動的にブロックするなど、有能なウェブマスターは関連する抜け穴を自分で修正できます。実際、コードのデータ記録部分を完全に削除することもできますが、これは変数のフィルタリングには影響せず、たとえ攻撃者の情報が記録されたとしてもあまり役に立ちません。したがって、すべての脆弱性が存在しないように、このコードを削除することが最善であると提案します。
さて、この記事はここまでです。最後に、セキュリティ保護プログラムを使用する場合は、プログラム自体のセキュリティ問題にも注意する必要があることを思い出してください。
アンチインジェクション プログラム 3.0 にも抜け穴があります。抜け穴はもっと深刻です。