WordPress Source 4.2.3 Sürüm Vulns Analyze Fix Detaylı Bilgi

JohnDoe

Kıdemli Üye
29 Eyl 2013
2,710
6
Teşkilat
Merhabalar,

Wordpress’in yakın zamanda çıkardığı 4.2.4 security fix sürümüne istisnaden 4.2.3 de bulunan kritik zafiyetlerin analizi ve fix sürecine hızlı bir göz atacagız.

Bu dökümanda WP 4.2.3 de bulunan zafiyetlerin açıklaması ve "manuel" olarak nasıl kapatılacağı hk bilgi verilmiştir.

Ilk olarak SQL Injection zafiyetinden başlayalım.

WordPress dosyalarından post.php ve version.php de ki kodlar detaylı olarak incelendiğinde SQL Inj açığına rastlanıyor.

Post.php de satır 2985 de bulunan zafiyet ve fix kodlarını buraya aynen yazıyorum. Kırmızı ile belirtilen yerler zafiyet yeşil alanlar ise fixlenmiş halidir.

Kod:
foreach ( $group_by_status as $status => $comments )

{
     if ( ’post-trashed’ == $status )
     if ( ’post-trashed’ == $status ) {
               $status = ’0’;
-          $comments_in = implode( "’, ’", $comments );
-          $wpdb->query( "UPDATE $wpdb->comments SET comment_approved = ’$status’ WHERE comment_ID IN (’" . $comments_in . "’)" );
+          }
+          $comments_in = implode( ’, ’, array_map( ’intval’, $comments ) );
+          $wpdb->query( $wpdb->prepare( "UPDATE $wpdb->comments SET comment_approved = %s WHERE comment_ID IN ($comments_in)", $status ) );
     }

Burada yapmanız gereken post.php de post-trashed değerini 0 olarak almak ve comments_in + implode kısımına status değeri eklemektir. Böylece post.php dosyasını fixliyorsunuz.

Şimdi gelelim version.php ye devam ediyoruz.

Version.php dosyasında "$wp_version = ’4.3-RC1-33542’;" kodunu bulup $wp_version = ’4.3-RC1-33555’; kodu ile değiştirmelisiniz.

Böylece version dosyasını SQL INJ saldırılarına karşı fixlemiş oluyorsunuz..

Şimdi gelelim bir başka dosya da bulunan zafiyet yoluna ve fix sürecine.. Bu zafiyetimiz "Timing Side Channel Attack" olarak geçiyor, açıkcası pek bilinen bir zafiyet değil, bu yüzden OWASP üzerinden açığa kısa bi göz atmanız faydalı olacaktır.

Bu zafiyet class-wp-customize-widgets.php dosyasında bulunuyor. Açıgın ciddiyeti wp nin çekirdek dosyası olan Includes klasöründe bu dosyanın bulunmasından rahatlıkla anlaşılabilir.

Peki zararlı kodumuz nedir? Nasıl fixliyoruz görelim.

class-wp-customize-widgets.php klasörünü açıp if ( $this->get_instance_hash_key( $decoded ) !== $value[’instance_hash_key’] ) { satırını if ( ! hash_equals( $this->get_instance_hash_key( $decoded ), $value[’instance_hash_key’] ) ) { bu kod ile değiştirmelisiniz.

Burada eklenen ! has_equals değerinin ciddi bir kritik açığının önlenmesinde ne kadar etkili olduğunu da gözünüzden kaçırmamakta fayda var.

Gelelim tema dosyalarını etkileyen XSS açığına.. Bu açık theme.php de bulunuyor.. Theme.php de tıpkı yukarıda ki dosya gibi wp-includes klasöründe bulunuyor.

Bu açık tam olarak tema önizlemelerinde kullandığımız opsiyonlar da hatalı kod nedeniyle alert verdirmemizi sağlıyor. Hemen theme.php de bulunan hatalı kodların fixlenmesini görelim. Yine hatalı olanlar kırmızı yeşiller fix.

Kod:
if ( strpos($matches[4], ’onclick’) !== false ) 
730                   $matches[4] = preg_replace(’#onclick=([\\’"]).*?(?<!\\\\\\)\\\\1#i’, ’’, $matches[4]); //Strip out any onclicks from rest of <a>. (?<!\\\\\\) means to ignore the ’" if it’s escaped by \\ to prevent breaking mid-attribute. 
               if ( 
                   ( false !== strpos($matches[3], ’/wp-admin/’) ) 
               || 
                   ( false !== strpos( $matches[3], ’://’ ) && 0 !== strpos( $matches[3], home_url() ) ) 
               || 
             ( false !== strpos($matches[3], ’/feed/’) ) 
               || 
             ( false !== strpos($matches[3], ’/trackback/’) ) 
               ) 
                   return $matches[1] . "#$matches[2] onclick=$matches[2]return false;" . $matches[4]; 
            
               $stylesheet = isset( $_GET[’stylesheet’] ) ? $_GET[’stylesheet’] : ’’; 
               $template   = isset( $_GET[’template’] )   ? $_GET[’template’]   : ’’; 
            
               $link = add_query_arg( array( ’preview’ => 1, ’template’ => $template, ’stylesheet’ => $stylesheet, ’preview_iframe’ => 1 ), $matches[3] ); 
         if ( 0 === strpos($link, ’preview=1’) ) 
                   $link = "?$link"; 
               return $matches[1] . esc_attr( $link ) . $matches[4];

Yalnız burada ki kırmızıları silmiyoruz. Tamam hatalı kod ama "eksik" kod yüzünden hatalıdır. Hemen en alt satıra geçip şu aşağıda ki kodu yenisiyle değiştirelim.

Kod:
return $matches[1] . esc_attr( $link ) . $matches[4]; yenisi return $matches[0] . esc_attr( $link ) . $matches[4];

Kırmızı alanı tamamen düzelttik. Fakat bu yeterli değil. 712. satırda bulunan return preg_replace_callback kısmının hemen başına bir kod daha ekleyeceğiz. Hemen detaylara geçelim. Kırmızı olan hatalı yeşil olan düzeltimiş (fix kodu)

Kod:
return preg_replace_callback( "|(<a.*?href=([\\"’]))(.*?)([\\"’].*?>)|", ’preview_theme_ob_filter_callback’, $content ); ]

return $content; - bu kodu üstte ki preg_replace_callback fonksiyonundan hemen önce eklemelisiniz.

Böylece theme.php de ki XSS yi de hallettik.

Şimdi gelelim widget ve navigasyonu etkileyen bir başka XSS açığına, bu açık sayesinde navigasyon menüleri üzerinden XSS zafiyetine rastlanıyor.

Açığın bulunduğu dosyalar default-widgets.php nav-menu.js görüldüğü gibi biri includes biri admin dosyalarında bulunuyor. Üstelik bir tanesi Js dosyası.. Bu da demektir ki saldırgan javscript üzerinde uzmansa bu dosyalarda bulunan XSS ile sitenize kan kusturabilir.

Peki nasıl önleyecegiz?

İlk olarak default-widgets.php dosyasını açıp widgetler üzerinden gerçekleştirilecek zafiyeti önleyelim.

Zafiyet kodlarını kırmızı olarak veriyorum. Fix süreci yine yeşil olan kodlardır. (bu kez değiştireceksiniz)

Kod:
<input type="text" class="widefat" id="<?php echo $this->get_field_id(’title’); ?>" name="<?php echo $this->get_field_name(’title’); ?>" value="<?php echo $title; ?>" />

Yeni kod (fix)

Kod:
<input type="text" class="widefat" id="<?php echo $this->get_field_id(’title’); ?>" name="<?php echo $this->get_field_name(’title’); ?>" value="<?php echo esc_attr( $title ); ?>" />

ne yaptık ? hatalı kodda bulunan $title; kısmını alıp esc_attr( $title ); olarak düzenledik. Böylece olası saldırıların önüne geçmiş olduk.

Son olarak nav-menu.js dosyasında bulunan kritik açığı da güncelleyip konuyu noktalayabiliriz.

Bu dosyayı açıp $this.prop(’title’, title).html( title ); şununla değiştireceksiniz $this.prop(’title’, title).text( title );

ne yaptık ? .html olan zararlı kodu .text ile güncelleyip olası saldırıların önüne geçtik.

Evet arkadaslar konuyu olabildiğince derli toplu olarak anlatmaya çalıştım. WP 4.2.3 de bulunan tüm açıklar ve detayları bunlardır.

4.2.4 security fix sürümüne geçerek tüm bu zafiyetlerden korunabilir ya da manuel olarak (öğrenmek ve uygulama geliştirmek için) kendiniz yapabilirsiniz.
 

JohnDoe

Kıdemli Üye
29 Eyl 2013
2,710
6
Teşkilat
Teşekkür ederim değerli vaktinizi ayırarak konularımı okuduğunuz için eksik olmayın sağ olun.
 
Üst

Turkhackteam.org internet sitesi 5651 sayılı kanun’un 2. maddesinin 1. fıkrasının m) bendi ile aynı kanunun 5. maddesi kapsamında "Yer Sağlayıcı" konumundadır. İçerikler ön onay olmaksızın tamamen kullanıcılar tarafından oluşturulmaktadır. Turkhackteam.org; Yer sağlayıcı olarak, kullanıcılar tarafından oluşturulan içeriği ya da hukuka aykırı paylaşımı kontrol etmekle ya da araştırmakla yükümlü değildir. Türkhackteam saldırı timleri Türk sitelerine hiçbir zararlı faaliyette bulunmaz. Türkhackteam üyelerinin yaptığı bireysel hack faaliyetlerinden Türkhackteam sorumlu değildir. Sitelerinize Türkhackteam ismi kullanılarak hack faaliyetinde bulunulursa, site-sunucu erişim loglarından bu faaliyeti gerçekleştiren ip adresini tespit edip diğer kanıtlarla birlikte savcılığa suç duyurusunda bulununuz.