# APPRENTICE

## Lab 1 - SQL injection vulnerability in WHERE clause allowing retrieval of hidden data

[Link al laboratorio](https://portswigger.net/web-security/sql-injection/lab-retrieve-hidden-data)

This lab contains a [SQL injection](https://portswigger.net/web-security/sql-injection) vulnerability in the product category filter. When the user selects a category, the application carries out a SQL query like the following:

`SELECT * FROM products WHERE category = 'Gifts' AND released = 1`

To solve the lab, perform a SQL injection attack that causes the application to display one or more unreleased products.

### Solución

Una vez le damos "ACCESS THE LAB" nos aparece lo siguiente:

<figure><img src="https://1367155054-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FqCnBDYTntMpZLlwqTWcg%2Fuploads%2F47kna1yIru9JPOChbSVw%2Fimagen.png?alt=media&#x26;token=47330251-ca3c-457c-95fe-94f5173a2f75" alt=""><figcaption></figcaption></figure>

Como pone en el enunciado, cuando le damos a Gifts por detrás selecciona todo de la tabla *products* donde la categoría es "Gifts".

Le damos a Gift

<figure><img src="https://1367155054-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FqCnBDYTntMpZLlwqTWcg%2Fuploads%2FSCXOyTkwKdP1Wyr6h9fE%2Fimagen.png?alt=media&#x26;token=d1779a50-b1bf-490f-8382-2f859038941b" alt=""><figcaption><p>Categoría Gifts</p></figcaption></figure>

Como vemos en la imagen de arriba, en la URL sale en formato GET la categoría escogida, que en este caso es Gifts.

Para comprobar si hay una SQL Injection hay diferentes maneras, a continuación mostraré varios tests:

* Añadiendo una ' o "&#x20;
  * `category=gifts'` | `category=gifts"`
* O por ejemplo una # o --.

Pero la opción más común es la siguiente string --> `"OR 1=1 -- -`

Para que quede claro estamos enviando una query que hace que la expresión siempre es verdadera, después con el -- - para asegurarnos que el resto de la cadena no se interprete como SQL.

<figure><img src="https://1367155054-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FqCnBDYTntMpZLlwqTWcg%2Fuploads%2F0MRvYovx60CqFh3SoetK%2Fimagen.png?alt=media&#x26;token=2687236d-8c4a-4ebf-807e-adc308c39485" alt=""><figcaption></figcaption></figure>

No aparece nada, a veces puede pasar que los espacios no los detecta, para ello podríamos seguir trabajando desde el navegador pero vamos a seguir con este procedimiento con BurpSuite, capturando la petición y modificando la en el repeater.

1. Abrimos BurpSuite
2. Encendemos el FoxyProxy

Activamos el intercept y el FoxyProxy

<figure><img src="https://1367155054-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FqCnBDYTntMpZLlwqTWcg%2Fuploads%2FI96uyOK3ULdH57OfM9pQ%2Fimagen.png?alt=media&#x26;token=0d837b0d-4c78-4cbf-990d-e0b7810b41a2" alt=""><figcaption><p>Intercept is on</p></figcaption></figure>

<figure><img src="https://1367155054-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FqCnBDYTntMpZLlwqTWcg%2Fuploads%2ForplrALys5UXV2wxEtHB%2Fimagen.png?alt=media&#x26;token=70518735-af86-4c15-8526-5edd7fc7f3bc" alt=""><figcaption><p>Activamos el FoxyProxy</p></figcaption></figure>

Una vez interceptado lo mandamos al Repeater con Ctrl + R

<figure><img src="https://1367155054-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FqCnBDYTntMpZLlwqTWcg%2Fuploads%2FDyZCY8l9D7pICtNHucsj%2Fimagen.png?alt=media&#x26;token=903c2e35-6bff-4475-8198-fd21c7783890" alt=""><figcaption></figcaption></figure>

Como veis arriba esta URL Encodeado, para trabajar más cómodo para ver la query mejor seleccionamos el texto y le damos a Ctrl + Mayus + U

<figure><img src="https://1367155054-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FqCnBDYTntMpZLlwqTWcg%2Fuploads%2Fqv6corG0rq0QOw8iNK14%2Fimagen.png?alt=media&#x26;token=56d3d3fb-d0b6-4ec9-8b66-9a0b8cf42650" alt=""><figcaption><p>URL Encoded</p></figcaption></figure>

Una vez ejecutado volveremos a tener de nuevo la query normal

<figure><img src="https://1367155054-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FqCnBDYTntMpZLlwqTWcg%2Fuploads%2Fm63K34bUsfVvgl17Xp7v%2Fimagen.png?alt=media&#x26;token=60dda41d-677b-4319-9e73-7ee458b53c42" alt=""><figcaption></figcaption></figure>

Entonces, como hemos visto antes no funciono, eso a veces pasa por que no detecta los espacios, vamos a probar de nuevo la query `' OR 1=1 -- -` con el símbolo + donde estarían los espacios.

<figure><img src="https://1367155054-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FqCnBDYTntMpZLlwqTWcg%2Fuploads%2FbcSbscgQST3PsPEcAKQQ%2Fimagen.png?alt=media&#x26;token=6e7e6040-c38a-49de-b644-8d4086d1f9d4" alt=""><figcaption><p>Query --> 'OR+1=1+--+-</p></figcaption></figure>

Cómo podéis ver en la imagen ahora con los + que son espacios, ya hemos solucionado el laboratorio.

<figure><img src="https://1367155054-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FqCnBDYTntMpZLlwqTWcg%2Fuploads%2F8oCb4TdAGjL7qCPINAiC%2Fimagen.png?alt=media&#x26;token=3a5feed4-3e1a-49f5-b75f-addf070d3fd5" alt=""><figcaption><p>Lab solucionado</p></figcaption></figure>

Ahora queda explicar bien cómo quedaría por detrás con un gráfico de las querys por detrás y cómo quedaría la tal query tras la inyección:

<figure><img src="https://1367155054-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FqCnBDYTntMpZLlwqTWcg%2Fuploads%2FFtYYfhxft1HlUONyWyeq%2Fimagen.png?alt=media&#x26;token=5987bfeb-1452-401d-89d8-5889d8cd8039" alt=""><figcaption></figcaption></figure>

## Lab 2 - SQL injection vulnerability allowing login bypass

[Link al laboratorio](https://portswigger.net/web-security/sql-injection/lab-login-bypass)

This lab contains a SQL injection vulnerability in the login function.

To solve the lab, perform a SQL injection attack that logs in to the application as the administrator user.

<figure><img src="https://1367155054-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FqCnBDYTntMpZLlwqTWcg%2Fuploads%2FK4fN3xYrc3eWMq2pEal8%2Fimagen.png?alt=media&#x26;token=6274763e-48b9-417e-bcbb-396c6474d215" alt=""><figcaption></figcaption></figure>

### Primera solución

Una vez accedemos al laboratorio, nos aparece lo mismo que en el lab anterior, la página que es una tienda de comprar varios tipos de productos, como podemos leer en el enunciado para poder resolver este laboratorio tenemos que realizar una inyección SQL en la aplicación que nos inicie sesión como Administrador.

Pues como queremos loguearnos como admin, procedemos a ir a My Account que está arriba a la derecha de la página principal.

Nos aparece un inició de sesión en el cuál tenemos que abusar.

<figure><img src="https://1367155054-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FqCnBDYTntMpZLlwqTWcg%2Fuploads%2FLIQI9VC6MDSZMd8GD2lG%2Fimagen.png?alt=media&#x26;token=cc43ad4a-97b9-4ce9-b4bb-d790b2ee876f" alt=""><figcaption><p>Login</p></figcaption></figure>

Podemos realizar los mismos tests que hicimos en el anterior laboratorio

* Ponemos admin" o admin' o # --

Directamente vamos a hacer los tests en burpsuite -->&#x20;

1. Abrimos BurpSuite
2. Encendemos el FoxyProxy

Activamos el intercept y el FoxyProxy

<figure><img src="https://1367155054-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FqCnBDYTntMpZLlwqTWcg%2Fuploads%2F5YcxM3FpJmuOwyA9tb6b%2Fimagen.png?alt=media&#x26;token=f76dfaf8-a90d-4596-9483-69b06e6d029e" alt=""><figcaption><p>Intercept on</p></figcaption></figure>

<figure><img src="https://1367155054-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FqCnBDYTntMpZLlwqTWcg%2Fuploads%2Fs4cthNRtHtFbXHs2mc2U%2Fimagen.png?alt=media&#x26;token=8ae4cc25-a33e-4692-8708-35ef62478cf3" alt=""><figcaption><p>Foxy Proxy activado</p></figcaption></figure>

Enviamos la petición dándole a Login&#x20;

<figure><img src="https://1367155054-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FqCnBDYTntMpZLlwqTWcg%2Fuploads%2FlLNxCtU7tb3QJ2mxFrBA%2Fimagen.png?alt=media&#x26;token=f6266a4b-fd99-4f1d-94da-d58b163ba6ba" alt=""><figcaption></figcaption></figure>

Una vez capturado, lo mandamos al repeater con Ctrl + R

<figure><img src="https://1367155054-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FqCnBDYTntMpZLlwqTWcg%2Fuploads%2F8qiYAP9SKGfkk4WVUkum%2Fimagen.png?alt=media&#x26;token=e08c61d8-a83d-47c2-a336-76961073f574" alt=""><figcaption><p>Repeater request</p></figcaption></figure>

Vale ahora para trabajar más cómodo selecionamos el admin%22 que está URL Encodeado para ponerlo en formato texto normal con el Ctrl + Mayus +U

<figure><img src="https://1367155054-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FqCnBDYTntMpZLlwqTWcg%2Fuploads%2FyKFdnhzNGvMm9UMfKiKC%2Fimagen.png?alt=media&#x26;token=89b2e87f-9cc5-473a-a6b2-8cbc11d87ccd" alt=""><figcaption></figcaption></figure>

Si cogemos la actual query y la mandamos nos pone "Invalid username or password"

<figure><img src="https://1367155054-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FqCnBDYTntMpZLlwqTWcg%2Fuploads%2FhBW7FdTjoEPEdEYTB8ci%2Fimagen.png?alt=media&#x26;token=24529bd3-86eb-4c30-a6c4-44642b9bfbc7" alt=""><figcaption><p>Invalid username or password con la query admin" </p></figcaption></figure>

Ahora probamos el test más básico que es enviarle una inyección SQL que es el que hemos utilizado en anterioridad --> `" OR 1=1 --`&#x20;

Le vamos a añadir signos de suma por si acaso no detectase los espacios y evitarnos problemas

<figure><img src="https://1367155054-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FqCnBDYTntMpZLlwqTWcg%2Fuploads%2FhdZhbPJTdo1Lhm5msCl9%2Fimagen.png?alt=media&#x26;token=8d1646eb-85ec-4746-8da5-d2a2063f195f" alt=""><figcaption></figcaption></figure>

Cómo podéis ver en la imagen de arriba, no me sale un código OK 200 sino que el 302 que es el que te redirige a otra página y al parecer está funcionado la inyección y nos está redirigiendo al usuario administrator.

<figure><img src="https://1367155054-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FqCnBDYTntMpZLlwqTWcg%2Fuploads%2FYAWTVwE2KkMYmg42jVs4%2Fimagen.png?alt=media&#x26;token=886c825f-c845-48d0-8c2c-eda7253afd48" alt=""><figcaption><p>Logueados como root</p></figcaption></figure>

### Segunda solución

La primera solución está bien y funciona, pero no es la que el propio laboratorio quiere que hagas ya que es como en el primer laboratorio, pero yo lo hice así porque básicamente es el test más básico y funciono.

Pero la gracia de este login bypass es que vamos a estar abusando de que ponemos el usuario administrator y comentaremos el resto con -- ignorando por completo la contraseña y logueando directamente ya que el usuario es válido.

<figure><img src="https://1367155054-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FqCnBDYTntMpZLlwqTWcg%2Fuploads%2FNLXjV26YwQvjeNxLfjHt%2Fimagen.png?alt=media&#x26;token=49da3ded-f091-4372-9360-8b8132d7c39e" alt=""><figcaption></figcaption></figure>

<figure><img src="https://1367155054-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FqCnBDYTntMpZLlwqTWcg%2Fuploads%2Flm5GyxzMJMvJ2kKPPW3M%2Fimagen.png?alt=media&#x26;token=5814f106-858b-4160-bb12-af5d93cfb027" alt=""><figcaption><p>Logueado como administrator</p></figcaption></figure>
