¿Inyección de SQL con el operador LIKE?

-1

Soy un estudiante de seguridad informática y estoy intentando realizar un SQLi en la siguiente solicitud:

SELECT * FROM Books WHERE 1 AND (LOWER(title) LIKE '%aaa%' 
OR LOWER(blurb) LIKE '%aaa%' OR LOWER(content) LIKE '%aaa%') AND 
(publish_date IS NULL OR publish_date <= '2016-08-22') ORDER BY date DESC LIMIT -5,5

Entonces, aaa es donde ocurre la inyección. Intenté ') UNION SELECT * FROM Books# pero, el servidor simplemente me envió esta inyección como un "resultado de búsqueda", por lo que no funciona.

Para poder adaptar mejor la solicitud, haría %'; REQUEST THAT I WANT; '% .

O incluso mejor: %'; REQUEST THAT I WANT;SELECT * FROM Books WHERE LOWER(title) LIKE '% .

Pero para los dos últimos, recibí una respuesta de "Solicitud incorrecta".

    
pregunta mric750 23.08.2016 - 11:22
fuente

1 respuesta

3

No especificaste cómo el código del servidor llena el filtro de búsqueda. Podría muy bien usar declaraciones preparadas, algo como esto:

query = db.prepare("SELECT * FROM Books WHERE LOWER(title) LIKE ? OR LOWER(blurb) LIKE ?")

pattern = "%" + input + "%"
query.set_parameter(1, pattern)
query.set_parameter(2, pattern)
...

result = query.exec()

En otras palabras, solo porque el código debe agregar % 's alrededor del filtro, no significa que la consulta SQL entera se agregue al mismo tiempo. En cambio, la "declaración preparada" permite que la base de datos misma complete valores adicionales.

O el código podría ser muy cuidadoso al eliminar comillas en la entrada (como en el conocido mysql_escape_string ()). Si bien es mucho más fácil equivocarse (por no mencionar un poco más lento), todavía evita las inyecciones al asegurarse de que nunca se inserte ' .

    
respondido por el grawity 23.08.2016 - 14:43
fuente

Lea otras preguntas en las etiquetas