¿Es posible probar la inyección de Postgres BlindSQL usando pg_sleep () en una cláusula WHERE?

6

En mysql, estoy familiarizado con el uso de las siguientes cargas útiles para probar blindsql cuando la cláusula WHERE es vulnerable ( todos los ejemplos de carga útil de fuzzdb ):
1 or sleep(TIME)#
" or sleep(TIME)#
' or sleep(TIME)#

En postgres, mi primer instinto fue probar lo siguiente:
1 or pg_sleep(TIME)--
" or pg_sleep(TIME)--
' or pg_sleep(TIME)--

Desafortunadamente, las cargas útiles de postgres no funcionan porque pg_sleep () devuelve VOID y, por lo tanto, no está permitido en una expresión booleana.

He intentado las siguientes soluciones:

  1. Enviar pg_sleep () a algún otro tipo de datos (no se permite la conversión de tipo void - > bool)
  2. He considerado intentar crear mi propia función pg_sleep (), pero esto no funciona en el entorno de caja negra en el que audito ...
    ej: CREATE function pg_sleep(int) RETURNS int AS '/lib/libc.so.6', 'sleep' LANGUAGE 'C' STRICT

¿Alguna idea?

He intentado buscar en los documentos otras funciones que pueden usarse en lugar de pg_sleep () que no devuelven el vacío, pero no he tenido suerte.

    
pregunta octagonC 09.09.2011 - 22:19
fuente

2 respuestas

4

En primer lugar, intente el enfoque simple . ¿Es esto realmente una situación que solo permite una inyección completamente ciega? Para la vulnerabilidad de inyección SQL en la parte WHERE, es mucho más común que la aplicación reaccione de manera diferente dependiendo de si obtuvo al menos una fila o ninguna. Y es probable que la inyección pueda forzar un conjunto de resultados vacío a través de AND 1=0 o un conjunto de resultados no vacío a través de OR 1=1

Si este enfoque falla porque los datos no se usan para nada visible o no puede forzar el conjunto vacío / no vacío, solo entonces es el momento de buscar técnicas de inyección ciega.

Para incluir una cláusula SELECT en una parte DÓNDE puede usar una selección secundaria o una función como strpos:

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

Hay un documento interesante en Técnicas avanzadas de inyección de SQL PostgreSQL y filtro de bypass .

    
respondido por el Hendrik Brummermann 09.09.2011 - 22:56
fuente
2

También hay:

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

Páginas del manual: enlace

    
respondido por el stamparm 10.09.2011 - 16:23
fuente

Lea otras preguntas en las etiquetas