SQL インジェクション後にクリーンアップする最良の方法は何ですか?
-
09-06-2019 - |
質問
私は、最近 SQL インジェクション攻撃の被害を受けた非営利 Web サイトのメンテナンスを任されています。何者かがサイト上のフォームを悪用して、データベース内の利用可能なすべてのテキスト類似フィールド (varchar、nvarchar など) にテキストを追加しました。このフィールドは、HTML としてレンダリングされるときに JavaScript ファイルを含めて実行します。
Google で URL を検索すると、ルーマニアまたは中国を拠点とするスパムメール送信者からのものであることがわかりますが、現時点で重要なのはそこではありません。
サイト上の最も表示され人気のあるページに表示されるテキスト フィールドから情報を調べて手動で削除しましたが、サイト上の他のテキスト フィールドからテキストをプログラムで削除する最良の方法は何か知りたいです。 。
明らかに、やるべきことは他にもあります (SQL インジェクションに対してサイトを強化する、HTML を保存する代わりにマークダウンのようなものを使用するなど)。それらに取り組んでいますが、当面は本当に必要なものを準備するのに良い方法です。挿入されたテキストをプログラムで削除します。私は正確なテキストを知っています。それは毎回同じであり、常にテキストフィールドの末尾に追加されます。現時点ではデータベース内のすべての HTML を削除する余裕はなく、これが正確にいつ起こったのかわからないため、バックアップにロールバックすることはできません。また、サイトは共有ホスティング上にあり、SQL Server ツールを使用してデータベースに直接接続できません。ただし、クエリを実行することはできるので、「データベース全体のすべてのテーブルのすべてのテキスト フィールドを見つけて、これを実行してそれらをクリーンアップしてください」という趣旨の SQL 更新ステートメントを構築する方法があれば、それは次のとおりです。最高。
解決
最近のバックアップからデータを復元します。
他のヒント
私は被害者だったので、後始末に使ってください
UPDATE Table
SET TextField = SUBSTRING(TextField, 1, CHARINDEX('</title', TextField) - 1)
WHERE (ID IN (SELECT ID FROM Table WHERE (CHARINDEX('</title', Textfield, 1) > 0)))
あなたも他の人と同じ攻撃の被害に遭ったと仮定すると、SQLMenace のコードはそれに近いものです。ただし、この攻撃ではさまざまなスクリプト URL が使用されるため、データベースに表示されている URL と一致するようにスクリプトをカスタマイズする必要があります。
それについても書きました, 私のソリューション コードには、より一般的なクリーンアップが含まれていました。
重要な点の 1 つは、最初に行う必要があることです。 サイトを削除する. 。現在、ユーザーにマルウェアを積極的に提供しているため、後で法的修正が必要になる可能性があります。ユーザーが分からないまま放置されないよう、プレースホルダー ページを設置しますが、マルウェアを提供し続けないようにしてください。次に、サイトを修正して、注入に対して脆弱でないことを確認します。それを行うための最も簡単な方法 この特定の攻撃に対して Web ユーザーの sysobjects/syscolumns 権限を無効にするだけですが、クリーンアップもさらに徹底する必要があります。そうしないと、再びクラックされるのは時間の問題です。その後、提供されたコードを使用してサイトをクリーンアップし、ライブに戻すことができます。
これはこれを逆転させます。また、サイトを実行するユーザー名から sysobject 権限を取り除き、入力をサニタイズすることも賢明です。
DECLARE @T VARCHAR(255),@C VARCHAR(4000)
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('if exists (select 1 from ['+@T+'] where ['+@C+'] like ''%"></title><script src="http://1.verynx.cn/w.js"></script><!--'') begin print ''update ['+@T+'] set ['+@C+']=replace(['+@C+'],''''"></title><script src="http://1.verynx.cn/w.js"></script><!--'''','''''''') where ['+@C+'] like ''''%"></title><script src="http://1.verynx.cn/w.js"></script><!--'''''' end')
FETCH NEXT FROM Table_Cursor INTO @T,@C
END
CLOSE Table_Cursor
DEALLOCATE Table_Cursor
これについては少し前にここに書きました: MicrosoftがSQLインジェクション攻撃に対処するツールをリリース