Encontré una situación particularmente rara en la que tengo una vulnerabilidad de Inyección de SQL en la cláusula ORDER BY. La consulta se forja en el backend y la carga útil de inyección se convierte a mayúsculas con la función strtoupper()
PHP como se puede ver a continuación:
$sql="select something from table order by ".strtoupper($injection);
El problema es que puedo extraer del esquema de información y nombres de variables, pero no puedo extraer datos de otras tablas porque el nombre de la tabla en la consulta de selección está definido en minúsculas.
Por ejemplo:
SELECT * FROM mysql.user -- Will work.
SELECT * FROM MYSQL.USER -- Cannot find MYSQL.USER.
Aparentemente, INFROMATION_SCHEMA
es lo mismo que information_schema
. Pero esto no se aplica a las otras tablas también.
Para extraer datos utilicé la siguiente inyección:
if(1=1,0,~0*2)
Si la consulta devuelve verdadero, no pasa nada, cuando es FALSO se revela un mensaje genérico.
La versión del servidor MySQL es 5.7.19, el usuario se ejecuta como root, pero como he visto en las últimas actualizaciones, el servidor debe iniciarse con un argumento especial para poder usar las instrucciones load_file o INTO OUTFILE.
Me las arreglé para ordenar "omitir" la función strtoupper()
al proporcionar caracteres de entrada cirílicos, pero MySQL no reconoce el nombre de la tabla porque está en cirílico.
¿Algún consejo sobre cómo evitar esto?