E 'possibile testare l'iniezione di Postgres BlindSQL usando pg_sleep () in una clausola WHERE?

6

In mysql, ho familiarità con l'utilizzo dei seguenti payload per testare per blindsql quando la clausola WHERE è vulnerabile ( tutti gli esempi di payload da fuzzdb ):
1 or sleep(TIME)#
" or sleep(TIME)#
' or sleep(TIME)#

In postgres, il mio primo istinto era di provare quanto segue:
1 or pg_sleep(TIME)--
" or pg_sleep(TIME)--
' or pg_sleep(TIME)--

Sfortunatamente, i payload postgres non funzionano perché pg_sleep () restituisce VOID e quindi non è consentito in un'espressione booleana.

Ho provato i seguenti accorgimenti:

  1. Trasmetti pg_sleep () ad un altro tipo di dati (void - > la conversione del tipo bool non è consentita)
  2. Ho preso in considerazione l'idea di provare a creare la mia funzione pg_sleep (), ma ciò non funziona nell'ambiente della scatola nera che controllo in ..
    ex: CREATE function pg_sleep(int) RETURNS int AS '/lib/libc.so.6', 'sleep' LANGUAGE 'C' STRICT

Qualche idea?

Ho provato a cercare nei documenti le altre funzioni che potrebbero essere utilizzate al posto di pg_sleep () che non restituisce nulla, ma non ho avuto fortuna.

    
posta octagonC 09.09.2011 - 22:19
fonte

2 risposte

4

Prima di tutto prova l'approccio semplice . È davvero una situazione che consente solo un'iniezione completamente cieca? Per la vulnerabilità di SQL injection nella parte WHERE è molto più comune che l'applicazione reagisca diversamente a seconda che abbia almeno una riga o nessuna. Ed è probabile che l'iniezione possa forzare un set di risultati vuoto tramite AND 1=0 o nessun risultato vuoto impostato con OR 1=1

Se questo approccio fallisce perché i dati non sono usati per qualcosa visibile o non puoi forzare il set vuoto / non vuoto, solo allora è il momento di cercare le tecniche di iniezione cieche.

Per includere una clausola SELECT in una parte WHERE puoi utilizzare una selezione secondaria o una funzione come strpos:

strpos(
    (SELECT CASE WHEN 1=1 
            THEN pg_sleep(10)
            ELSE pg_sleep(0) END
    )::text, '1'
) > 0;

C'è un interessante articolo su Tecniche avanzate di Injection SQL PostgreSQL e filtro .

    
risposta data 09.09.2011 - 22:56
fonte
2

C'è anche:

SELECT COUNT(*) FROM GENERATE_SERIES(1,5000000)

Pagine di manuale: link

    
risposta data 10.09.2011 - 16:23
fonte

Leggi altre domande sui tag