2015-07-16 6 views
0

У меня есть следующий запрос со мнойSQL Query Double Injection

select 
    count(*), 
    concat((select database()), floor(rand() * 2)) as x   
from users 
group by x; 

Как я запустить этот запрос в клиенте MYSQL снова и снова, я получаю 2 разных ответов. Иногда я в конечном итоге с этой ошибкой (что я ожидаю, как в блоге я читал)

ERROR 1062 (23000): Duplicate entry 'mobile10' for key 'group_key' 

В другое время, я получаю результат, как:

+----------+------------------+ 
| count(*) | x    | 
+----------+------------------+ 
|  6444 | mobile_app_dev10 | 
|  6505 | mobile_app_dev11 | 
+----------+------------------+ 
  1. Почему я вижу 2 разных результата?
  2. Что именно означает ошибка в первом ответе?
+3

Как это связано с SQL-инъекцией? – MikeTheLiar

+1

Возможный дубликат [Duplicate entry for key 'group \ _key'] (http://stackoverflow.com/questions/26725772/duplicate-entry-for-key-group-key) – Bulat

+0

@mikeTheLiar: Я думаю, это один из методы, используемые для получения данных db, когда SQL-ошибки подвергаются атакующему. – user3894109

ответ

0

В случае двойной инъекции запроса информацию можно сбрасывать только с помощью ошибок. Когда вы использовали floor (rand() * 2) функция с группой по, то это приводило к ошибке не каждый раз, но при наличии дублирующей записи для group_key. Здесь вы заставили ошибку произойти, хотя вы рандомизировали внутренний запрос, но снова вы использовали floor(), чтобы получить дубликаты записей, так как это приводит к наибольшему целочисленному значению числа. ОК. вместо rand() * 2 use rand() * 4 такая же ошибка возникает, когда вы выполняете запрос, но после многих успешных попыток показать вам второй результат. целочисленное значение рандомизированных данных теперь увеличивается, теперь шансы на ошибку снижаются сравнительно. Вы можете узнать больше о Double Query here.