WordPress <= 3.9.2 Stored XSS Zafiyeti Analizi ve Exploit Yöntemi

Merhaba

Öncelikle bu blog yazısını daha erken bir tarihte yazmak isterdim ama malesef iş yoğunluğunda vakit bulamadım. Affınıza sığınarak teknik detaylara ve zafiyetin ne kadar kritik olduğuna bakalım.

20 Kasım 2014 tarihinde Klikki isimli güvenlik firması tarafından tespit edilen bu zafiyet, wordpress tarihinde benim gördüğüm en kritik güvenlik açığıdır. Hemen hemen herkes tarafından SQL Injection gibi zafiyetler en kritik güvenlik açıkları olarak adlandırılsa da, konu Stored XSS ise saldırı vektörleri çok farklı noktalara gidebilmekte. Hemen hemen son 1 yıl içerisinde katıldığım bir çok seminerde “Client-Side Security” ve XSS’e dikkat çekmeye çalıştım. Geliştiricilerimizin “Yıl olmuş 2014 hala mı XSS ?” algısından çıkıp, olayın önemine varmaları gerektiğini düşünmekteyim. 

Teknik Detay

Zafiyet wordpress’te ki yorum mekanizmasında bulunmakta. Kullanıcılar yorum yaparken kullanabilecekleri belli başlı HTML tagleri bulunmakta. Örneğin <p>Güzel yazı</p> gibi bir yorumda bulunabilirsiniz, ama <svg onload=alert(1)> gibi bir yorumda bulunduğunda beklenen output görememektesiniz.

Aşağıdaki açıklama zafiyetin olduğu kod yapısının amacını gayet güzel açıklamakta.

/**
 * Replaces common plain text characters into formatted entities
 *
 * As an example,
 * <code>
 * 'cause today's effort makes it worth tomorrow's "holiday"...
 * </code>
 * Becomes:
 * <code>
 * &#8217;cause today&#8217;s effort makes it worth tomorrow&#8217;s &#8220;holiday&#8221;&#8230;
 * </code>
 * Code within certain html blocks are skipped.
 *
 * @since 0.71
 * @uses $wp_cockneyreplace Array of formatted entities for certain common phrases
 *
 * @param string $text The text to be formatted
 * @return string The string replaced with html entities
 */

wp-includes/formatting.php dosyasında bulunan wptexturize() fonksiyonu, kullanıcılar tarafından yazılan yorumları formatlamakta. Bu işlemi yaparken ciddi bir regex ve karakter işlemleri gerçekleştirilmekte. formatting.php dosyasının 155. satırında aşağıdaki kod bulunmaktadır.

$textarr = preg_split('/(<.*>|\[.*\])/Us', $text, -1, PREG_SPLIT_DELIM_CAPTURE);

Regex’te bulunan problem ise [] köşeli parantez tagleri.  Örneğin aşağıdaki gibi bir yorumda bulunabilirsiniz.

<blockquote cite="www.mehmetince.net"> MERHABA</blockquote>

Administrator tarafından yorumlar görüntülendiğinde aşağıdaki gibi bir HTML içerik oluşacaktır. Buraya kadar her şey normal.

wordpress-stored-xss-1

Peki saldırgan olarak aşağıdaki gibi bir yorum gelirse ?

[<blockquote cite="]">[" onmouseover="this.style.display='none';alert(document.cookie);" style="position:fixed;left:0px;top:0px;width:100%;height:100%;z-index:10000;display:block" ]

wordpress-xss-exploit

Boom!

Sonuç

Bu saldırı karşısında administrator kullanıcısının yapabileceği bir şey malesef yok.

Çözüm olarak wordpress hesaplarınızı güncelleyin. Güncelleme imkanınız yoksa, yapmanız gereken tek şey comment formatting özelliğini kapatmak. Bunun içinde fonksiyonun başında return yapmanız yeterlidir.

function wptexturize($text) {
        return $text;

Helpfull source : http://klikki.fi/adv/wordpress_update.html