Merhabalar,
Wordpressin 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.
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.
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.
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)
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)
Yeni kod (fix)
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.
Wordpressin 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 its 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.