¿Qué cargas de SQL se pueden inyectar para un campo numérico?

2

Tengo un parámetro (pi_apk_version_code) que parece ser vulnerable a la inyección de SQL (el equipo está dividido en esto). La columna de la base de datos correspondiente a este parámetro acepta solo valores numéricos. Ahora, si se da manualmente una carga útil "; o 1 = 1" como entrada para este parámetro, la salida es un código de error de Oracle (ORA-01722: número no válido). La misma entrada cuando se proporciona a través de un fuzzer no produce un código de error de Oracle, pero devuelve los resultados deseados de la consulta.

  1. ¿Es esto indicativo de que haya inyección SQL presente?
  2. Si cree que la inyección SQL está presente, ¿cuáles son algunas de las cargas útiles que suministrará para explotarla de modo que pueda estar convencido de que la inyección SQL está realmente presente?

[Editar]

SQLmap se ejecutó para esto y no se detectaron problemas.

[Editar]

Consultas de PL / SQL en foco (pi_apk_OS y pi_apk_version_code son entradas provenientes del cliente):

    SELECT COUNT(1)
          INTO l_count
          FROM APK_VERSION_MASTER
         WHERE apk_OS = pi_apk_OS
              --AND  apk_version_code = pi_apk_version_code
           AND Status = 'A';
     

        OPEN rc_result FOR
          SELECT apk_version_code,
                 apk_version_string,
                 (CASE
                   --WHEN pi_apk_version_code < apk_version_code THEN
                   WHEN pi_apk_version_code < lowest_version_code THEN 
                    'Y'
                   ELSE
                    'N'
                 END) AS is_Mandatory,
                 path,
                 upgrade_playstore,
                 l_error_code return_code,
                 l_error_message return_message
            FROM APK_VERSION_MASTER
           WHERE apk_OS = pi_apk_OS
             AND apk_version_code = (SELECT MAX(apk_version_code)
                                       FROM APK_VERSION_MASTER b
                                      WHERE b.apk_OS = pi_apk_OS
                                        AND Status = 'A');
    
pregunta Earthling 10.05.2016 - 10:56
fuente

1 respuesta

1

Depende del código de su aplicación si esta entrada puede ser mal utilizada, no en la base de datos o en la consulta (sin tener en cuenta las consultas parametrizadas).

Si su aplicación rechaza todos los números excepto los válidos, no hay posibilidad de que la entrada pueda ser mal utilizada, ya que solo se insertarán números "inocuos" en la consulta.

Si su aplicación no realiza una validación adecuada e inserta la entrada directamente en la declaración de SQL, puede ser posible la inyección de SQL. No incluyó su consulta, así que voy a inventar un ejemplo. La siguiente consulta debe incluir todos los artículos de una categoría determinada:

SELECT name FROM articles WHERE category = 1

En lugar de 1 nuestra entrada es 1 UNION...

SELECT name FROM articles WHERE category = 1 UNION SELECT password FROM users

Esto devolvería una lista mucho más grande ...

    
respondido por el martinstoeckli 10.05.2016 - 13:47
fuente

Lea otras preguntas en las etiquetas