# SQL Injection

O SQL injection, é uma das técnicas de vulnerabilidades web mais conhecida. Ela consiste em basicamente passar uma query SQL em um input que se o banco de dados não tiver um tratamento correto dessa entrada, pode acabar resultado em um vetor de ataque caso essa query seja maliciosa.

Vamos supor que o backend trata a entrada de um login da seguinte forma abaixo.&#x20;

![](https://3511586545-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MWGE4aWZZAkQEVt8cOV%2F-MY0Eyi2Vht9eN_lbA_y%2F-MY1Brc7I-Z-Jbk1BGtY%2Fimage.png?alt=media\&token=2a64f661-b9b7-44e9-b4ab-f34f095204a7)

O problema é que a query que irá para o banco de dados não está sendo filtrada corretamente, passando os parâmetros exatamente como o usuário digita e isso pode ocasionar a vulnerabilidade.&#x20;

### Como pode ser explorado da maneira mais simples?

Vamos então utilizar o payload mais básico para explorar essa falha. A ideia a seguir, é utilizar o campo do usuário para bypassar a consulta. Primeiro temos que fechar as aspas simples e utilizar uma condição de **"ou"** para que assim a query retorne **true** e por fim comentar o resto para que seja ignorado, com isso irá trazer os resultados no banco de dados. O payload final fica da seguinte forma: **' or 1=1 #** ou **' or 1=1 --**

![](https://3511586545-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MWGE4aWZZAkQEVt8cOV%2F-MY1DK-dlB6wAH9HSGYc%2F-MY1Dyb4TIcVy5h661Qw%2Fimage.png?alt=media\&token=36deb116-884a-4847-a5e6-dd41f54d2b79)

![](https://3511586545-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MWGE4aWZZAkQEVt8cOV%2F-MY1DK-dlB6wAH9HSGYc%2F-MY1E3w2ruAMxTtjo8Bv%2Fimage.png?alt=media\&token=cb63e5ac-c038-4396-a772-df45a1884477)

*O comentário # e -- varia de acordo com o banco de dados.*

Assim, no banco de dados vai retornar o primeiro usuário que a consulta buscar, autenticando assim na aplicação com este usuário.

### SQL Injection Error Based

Esse é um tipo de injeção que retorna um erro para o usuário. Para triggar este erro, podemos passar, por exemplo, uma aspas simples para ver o que a aplicação retorna (essa aspas simples irá fechar a consulta no parâmetro que for passado). Se for vulnerável, geralmente irá vir uma mensagem com o seguinte erro:

**You have an error in your SQL syntax;**

Com isso, podemos utilizar o **union** do sql para unir uma nova consulta, e passar um %23 que significa o caractere # encodado, já que estamos enviando essas informações pela url (irá comentar o resto da query que estiver no banco). Além do **"**#", poderia ser passado também um ponto e vírgula ou uma aspas simples, depende de como a aplicação foi feita.

![](https://3511586545-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MWGE4aWZZAkQEVt8cOV%2F-MYoFYd_LJNuJ_DHjkBe%2F-MYoScbflmppVr9kx6VX%2Fimage.png?alt=media\&token=184cf160-2b73-4277-8b84-70348e58ac9f)

Assim é retornado a seguinte mensagem dizendo que o número de colunas é diferente do que foi passado.

![](https://3511586545-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MWGE4aWZZAkQEVt8cOV%2F-MYoFYd_LJNuJ_DHjkBe%2F-MYoSlAiB4a_1DjEf4fq%2Fimage.png?alt=media\&token=9570e7d0-26c3-4852-8169-0b3970751235)

Quando é inserido o número exato de colunas que tem no banco de dados, é retornado as informações (Agencia, Local e Telefone).&#x20;

![](https://3511586545-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MWGE4aWZZAkQEVt8cOV%2F-MYoFYd_LJNuJ_DHjkBe%2F-MYoTPUu0EQdN5XY-k6v%2Fimage.png?alt=media\&token=aa5b3288-47f5-44e3-9810-0edaab1b8a20)

Podemos visualizar as tabelas para ficar mais claro o que está acontecendo.

![](https://3511586545-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MWGE4aWZZAkQEVt8cOV%2F-MYoFYd_LJNuJ_DHjkBe%2F-MYoToN6kvvbBR4xeZ2o%2Fimage.png?alt=media\&token=619ad445-3bb7-4580-aa11-8c0a26897a03)

![](https://3511586545-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MWGE4aWZZAkQEVt8cOV%2F-MYoFYd_LJNuJ_DHjkBe%2F-MYoU-b4sAF3uh1G-BaG%2Fimage.png?alt=media\&token=9628cc94-bc41-44b1-97ca-1120ec6ca89f)

Nesse caso, a aplicação só esta mostrando três colunas, a agência, local e telefone. No union, poderia ser passado qualquer valor além de 3, 4 e 5 como uma string por exemplo ("col1", "col2", "col3", "col4", "col5" ). Dessa forma que foi feito fica mais fácil para entender.&#x20;

Sabendo quais colunas que está sendo retornado, podemos utilizar alguns comandos para pegarmos informações importantes.

![](https://3511586545-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MWGE4aWZZAkQEVt8cOV%2F-MYoFYd_LJNuJ_DHjkBe%2F-MYoVEt0w_J-0Kxpmdsy%2Fimage.png?alt=media\&token=9edc9cd1-483b-423d-9a2a-f6c4e463f19b)

A consulta ficou dessa forma

![](https://3511586545-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MWGE4aWZZAkQEVt8cOV%2F-MYoWK1APBBvoMh4Sns2%2F-MYof1YAPc8vmb6EooWZ%2Fimage.png?alt=media\&token=29544732-d8c7-4750-9312-a7c5fc923f67)

### Information Schema

Agora que conseguimos algumas informações, vamos fazer consultas mais avançadas. Sabendo que o nome do banco de dados é dbmrtur, podemos consultar a information schema para conseguirmos mais informações.&#x20;

Selecionando as tabelas

![](https://3511586545-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MWGE4aWZZAkQEVt8cOV%2F-MYoWK1APBBvoMh4Sns2%2F-MYofSWn69pLE72-bsOb%2Fimage.png?alt=media\&token=7f67346b-c30f-4e61-bba1-376f19305030)

Selecionando as colunas

![](https://3511586545-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MWGE4aWZZAkQEVt8cOV%2F-MYoWK1APBBvoMh4Sns2%2F-MYohq1u688E-Tic4nDT%2Fimage.png?alt=media\&token=f6d07770-32d0-4b01-8d2f-168f45ea4865)

![](https://3511586545-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MWGE4aWZZAkQEVt8cOV%2F-MYoWK1APBBvoMh4Sns2%2F-MYohyBtOzfwwQDMps1f%2Fimage.png?alt=media\&token=c9bd2a4d-fec6-46cd-898c-d3010fb22f86)

E por fim, selecionando os campos

![](https://3511586545-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MWGE4aWZZAkQEVt8cOV%2F-MYoWK1APBBvoMh4Sns2%2F-MYoiFDJ2gfJV53ijA9q%2Fimage.png?alt=media\&token=5ded5e92-d29e-4538-8341-4ae5fcc7ec35)

Podemos utilizar o concat para concatenar as informações com dois pontos.

![](https://3511586545-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MWGE4aWZZAkQEVt8cOV%2F-MYoWK1APBBvoMh4Sns2%2F-MYoiX92u2ApohwhzUxE%2Fimage.png?alt=media\&token=f6fc1364-588a-4d15-ab73-e1f4eba7ab65)

### Do SQL Injection até o RCE

Para conseguirmos um RCE neste cenário, vamos fazer um escrever um arquivo no servidor. *Podemos carregar arquivos do sistema operacional utilizando o load\_file(), é ótimo para reconhecimento e ler arquivos sensíveis.*

![](https://3511586545-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MWGE4aWZZAkQEVt8cOV%2F-MYoWK1APBBvoMh4Sns2%2F-MYop_ox0osYwBNL9ErA%2Fimage.png?alt=media\&token=c28072b3-b9e1-41da-8043-718b80b01034)

Para escrevermos o arquivo, podemos utilizar o INTO OUTFILE e passar o caminho que desejamos junto com o nome do nosso arquivo.

![](https://3511586545-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MWGE4aWZZAkQEVt8cOV%2F-MYoWK1APBBvoMh4Sns2%2F-MYoq2llbV9pjKToY3mF%2Fimage.png?alt=media\&token=cd92e98c-549f-4241-830b-cb5c7f6801db)

![](https://3511586545-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MWGE4aWZZAkQEVt8cOV%2F-MYoWK1APBBvoMh4Sns2%2F-MYoqH1tpWAlgTWwHcwh%2Fimage.png?alt=media\&token=a2c91a46-fb6a-4f18-9be3-205a584a7fa3)

Porém, em determinados casos pode ser que não tenhamos permissão para fazer isso. Porém há um diretório no sistema que tem permissão de escrita. Sabendo disso, e tendo consciência que a aplicação interpreta PHP, podemos escrever um arquivo PHP com uma função system().

![](https://3511586545-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MWGE4aWZZAkQEVt8cOV%2F-MYoWK1APBBvoMh4Sns2%2F-MYoqzTnWO1PIE7i11Ua%2Fimage.png?alt=media\&token=6b9dd139-21c9-4f9e-90c5-5c8891539a2d)

Pronto, não houve mais o erro de permissão e conseguimos criar o arquivo com a shell. Agora basta chamar o arquivo passando por parâmetro o que queremos executar.

![](https://3511586545-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MWGE4aWZZAkQEVt8cOV%2F-MYoWK1APBBvoMh4Sns2%2F-MYorHUuFDjyflPv4hvI%2Fimage.png?alt=media\&token=6766dfc2-b96b-47d3-aa3b-1f2cfdb29e80)

### Bypass addslashes

Algumas vezes, quando é passado um valor por parâmetro, o backend pode fazendo o tratamento colocando uma barra "\\" para quebrar a consulta, assim dificultando que o sql injection seja explorado. Porém há uma forma de burlar convertendo as strings para decimais. Temos algumas opções para isso

Utilizando o mysql&#x20;

```
select ascii("a");
```

Utilizando o bash

```
echo -n "teste" | od -An -tdC
```

Ou também utilizar um conversor para isso&#x20;

{% embed url="<https://www.rapidtables.com/convert/number/ascii-hex-bin-dec-converter.html>" %}

Após fazer a conversão, ao invés de passar por parâmetro a string, basta utilizar char() com os decimais.&#x20;

```
where tamble_schema=char(116, 101,115,116,101)
```
