WP E-Commerce: Zugriff auf SQL-Datenbank von Shopping-Abwendungen

WP E-Commerce ist ein Shopping-Cart-Plugin für WordPress. Eine darin kürzlich entdeckte Sicherheitslücke hat zur Folge, dass ein entfernter Angreifer auf die SQL-Datenbank mit SQL-Injection zugreifen kann. Ein Exploit zum Auslesen von Benutzeraccounts wurde ebenfalls veröffentlicht.

Der Programmierfehler befindet sich in der Datei “wpsc-theme/functions/wpsc-user_log_functions.php”:

foreach ( (array)$_POST['collected_data'] as $value_id => $value ) {
$form_sql = "SELECT * FROM `" . WPSC_TABLE_CHECKOUT_FORMS . "` WHERE `id` = '$value_id' LIMIT 1";
$form_data = $wpdb->get_row( $form_sql, ARRAY_A );

Ein Angreifer hat über den URL Zugriff auf “collected_data” und damit auf “$value_id” im Foreach-Loop. Der Variablen “$form_sql” wird der SQL-Query-String zugewiesen, wobei als “id” im Where-Statement “$value_id” eingefügt wird. Allerdings findet hier keine Kontrolle statt – der Code fügt den Wert blind ein. Ein Angreifer kann dies ausnutzen, um beliebige SQL-Statements einzuschmuggeln. Auf diese Weise erhält er Zugriff auf die Datenbank des Onlineshops oder Ähnliches.

WordPress selbst enthält Schutzfunktionen gegen solche Attacken, wie beispielsweise die Methode “prepare()” der “wpdb”-Klasse. Diese Methode versteht die aus C bekannte “sprintf()”- und “vprintf()”-Syntax und sorgt dafür, dass ein SQL-String so zusammengesetzt wird, dass SQL-Injection-Attacken vermieden werden. Die Anfang Juli im Repository korrigierte Version des obigen Codes macht hiervon Gebrauch:

foreach ( (array)$_POST['collected_data'] as $value_id => $value ) {
$form_sql = $wpdb->prepare( "SELECT * FROM `" .WPSC_TABLE_CHECKOUT_FORMS . "` WHERE `id` = %d LIMIT 1", $value_id );
$form_data = $wpdb->get_row( $form_sql, ARRAY_A );

Hier wird “$wpdb->prepare” verwendet, um den Wert “$value_id” an die mit “%d” markierte Stelle in den SQL-String zu kopieren. Damit kann der Angreifer keinen eigenen SQL-String mehr aufbauen – die Attacke ist damit nicht mehr möglich.

Vor wenigen Tagen wurde Version 3.8.5 von WP E-Commerce veröffentlicht, und in dieser Version ist der Fehler korrigiert. Alle anderen Systeme sind anfällig für diese Sicherheitslücke. Mittlerweile ist auch ein einfach zu verwendender PHP-Exploit
erschienen.

Nach oben