Root > Documents > Web Güvenlik Açıkları > WP 4.2.3 Vulns Analyze Fix
Cyber-Warrior.Org \ Doküman \ Web Güvenlik Açıkları > WP 4.2.3 Vulns Analyze Fix
Madde
  Yazar : BMNR
  Date : 19.10.2015 21:27:34
 
# WP 4.2.3 Vulns Analyze Fix
 
Merhaba arkadaslar..
Wordpress’in yakin zamanda çikardigi 4.2.4 security fix sürümüne istisnaden 4.2.3 de bulunan kritik zafiyetlerin analizi ve fix sürecine hizli bir göz atacagiz

Bu dökümanda WP 4.2.3 de bulunan zafiyetlerin açiklamasi ve "manuel" olarak nasil kapatilacagi hk bilgi verilmistir.

Ilk olarak SQL Injection zafiyetinden baslayalim..

WordPress dosyalarindan post.php ve version.php de ki kodlar detayli olarak incelendiginde SQL Inj açigina rastlaniyor.

Post.php de satir 2985 de bulunan zafiyet ve fix kodlarini buraya aynen yaziyorum. Kirmizi ile belirtilen yerler zafiyet yesil alanlar ise fixlenmis halidir.

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 yapmaniz gereken post.php de post-trashed degerini 0 olarak almak ve comments_in + implode kisimina status degeri eklemek. 
Böylece post.php dosyasini fixliyorsunuz.. Simdi gelelim version.php ye

Version.php dosyasinda "$wp_version = ’4.3-RC1-33542’;" kodunu bulup $wp_version = ’4.3-RC1-33555’; kodu ile degistirmelisiniz..

Böylece version dosyasini SQL INJ saldirilarina karsi fixlemis oluyorsunuz..

Simdi gelelim bir baska dosya da bulunan zafiyet yoluna ve fix sürecine.. Bu zafiyetimiz "Timing Side Channel Attack" olarak geçiyor, açikcasi pek bilinen bir zafiyet degil, bu yüzden OWASP üzerinden açiga kisa bi göz atmaniz faydali olacaktir.

Bu zafiyet class-wp-customize-widgets.php dosyasinda bulunuyor. Açigin ciddiyeti wp nin çekirdek dosyasi olan Includes klasöründe bu dosyanin bulunmasindan rahatlikla anlasilabilir...

Peki zararli kodumuz ne? Nasil fixliyoruz görelim.

class-wp-customize-widgets.php klasörünü açip if ( $this->get_instance_hash_key( $decoded ) !== $value[’instance_hash_key’] ) { satirini if ( ! hash_equals( $this->get_instance_hash_key( $decoded ), $value[’instance_hash_key’] ) ) { bu kod ile degistirmelisiniz..

Burada eklenen ! has_equals degerinin ciddi bir kritik açiginin önlenmesinde ne kadar etkili oldugunu da gözünüzden kaçirmamakta fayda var.. 

Gelelim tema dosyalarini etkileyen XSS açigina.. Bu açik theme.php de bulunuyor.. Theme.php de tipki yukarida ki dosya gibi wp-includes klasöründe bulunuyor.

Bu açik tam olarak tema önizlemelerinde kullandigimiz opsiyonlar da hatali kod nedeniyle alert verdirmemizi sagliyor. Hemen theme.php de bulunan hatali kodlarin fixlenmesini görelim.. Yine hatali olanlar kirmizi yesiller fix...

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]; 


Yalniz burada ki kirmizilari silmiyoruz. Tamam hatali kod ama "eksik" kod yüzünden hatali... Hemen en alt satira geçip su asagida ki kodu yenisiyle degistirelim..

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

Kirmizi alani tamamen düzelttik.. Fakat bu yeterli degil. 712. satirda bulunan return preg_replace_callback kisminin hemen basina bir kod daha ekleyecegiz.. Hemen detaylara geçelim. Kirmizi olan hatali yesil olan düzeltimis (fix kodu)


           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..

Simdi gelelim widget ve navigasyonu etkileyen bir baska XSS açigina, bu açik sayesinde navigasyon menüleri üzerinden XSS zafiyetine rastlaniyor.

Açigin bulundugu dosyalar default-widgets.php nav-menu.js görüldügü gibi biri includes biri admin dosyalarinda bulunuyor. Üstelik bir tanesi Js dosyasi.. Bu da demektir ki saldirgan javscript üzerinde uzmansa bu dosyalarda bulunan XSS ile sitenize kan kusturabilir...

Peki nasil önleyecegiz?

Ilk olarak default-widgets.php dosyasini açip widgetler üzerinden gerçeklestirilecek zafiyeti önleyelim..

Zafiyet kodlarini kirmizi olarak veriyorum.. Fix süreci yine yesil olan kodlardir. (bu kez degistireceksiniz)

<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)

<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 yaptik ? hatali kodda bulunan $title; kismini alip esc_attr( $title ); olarak düzenledik... Böylece olasi saldirilarin önüne geçmis olduk

Son olarak nav-menu.js dosyasinda bulunan kritik açigi da güncelleyip konuyu noktalayabiliriz..

Bu dosyayi açip $this.prop(’title’, title).html( title ); sununla degistireceksiniz $this.prop(’title’, title).text( title ); 

ne yaptik ? .html olan zararli kodu .text ile güncelleyip olasi saldirilarin önüne geçtik..

Evet arkadaslar konuyu olabildigince derli toplu olarak anlatmaya çalistim. WP 4.2.3 de bulunan tüm açiklar ve detaylari bunlardir. 4.2.4 security fix sürümüne geçerek tüm bu zafiyetlerden korunabilir ya da manuel olarak (ögrenmek ve uygulama gelistirmek için) kendiniz yapabilirsiniz..

Bug Researchers 
   
   
Cyber-Warrior TIM All Legal and illegal Rights Reserved.\CWDoktoray 2001©