Busco entender completamente cómo filtrar / escapar adecuadamente los caracteres peligrosos de la entrada del usuario que se interpolará en una consulta SQL de DB2.
El enrutamiento de desinfección que estoy analizando funciona de la siguiente manera:
- Eliminar todas las barras invertidas (s / \\ //)
- Reemplace todas las comillas simples con comillas simples dobles (s / '/' '/)
Mi primer instinto fue examinar una función de desinfección de db2 existente, para verificar cualquier diferencia. Así que eché un vistazo a db2_real_escape_string que, al parecer, es bastante diferente: antepuesta barras diagonales inversas a caracteres especiales en el argumento de cadena. Los caracteres que se añaden con una barra invertida son \ x00, \ n, \ r, \, ', "y \ x1a.
Algunas preguntas específicas que tengo son:
- ¿Por qué db2_real_escape_string () backslash-escape quotes en lugar de duplicarlas? Esto parece incorrecto.
- La función de desinfección que estoy analizando no logra escapar o filtrar \ x00, \ n, \ r, \ x1a, ". ¿Cómo podría un atacante abusar de estos caracteres? Esta es mi pregunta principal.
- Otra deficiencia de mi función de desinfección es que no es compatible con el juego de caracteres, pero supongo que esto no es un problema porque db2, en este caso, está configurado para usar el juego de caracteres predeterminado (que estoy adivinar no es multi-byte). Entonces, AFAIK, a menos que se haya configurado un conjunto de caracteres de múltiples bytes como GBK, los ataques de inyección de múltiples bytes de SQL como esta vulnerabilidad conocida en mysql GBK no debería ser un problema.
- ¿Hay otras consideraciones / pasos que falte en la función de desinfección que estoy analizando?
Entiendo que el uso de consultas parametrizadas es la solución obvia. Sin embargo, en este caso, soy responsable de A) determinar si el diseño actual es explotable y B) proporcionar un parche para la función de desinfección (si es necesario).
editar Básicamente, estoy buscando construir una prueba de concepto de carga útil de inyección sql, dada la función de desinfección anterior y el siguiente uso:
execute( " SELECT foo FROM bar WHERE col='" + my_sanitize($_GET['input']) + "'" )
Dado el diseño actual de la función de desinfección (eliminar barras diagonales y comillas dobles dobles), ¿hay alguna forma de romper las comillas simples como en el ejemplo de uso anterior?
Gracias por su ayuda!