SQL-Inj Strings Converter

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by L0rd_Ha0S, 6 Nov 2007.

  1. L0rd_Ha0S

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

    Joined:
    25 Jan 2006
    Messages:
    148
    Likes Received:
    102
    Reputations:
    64
    Вот, написал конвертер строк в ASCII и НЕX вид. Может быть полезен при проведении sql-инъекций, когда в запросы надо вставить данные в виде char(104,101,108,108,111) или в hex - 0x68656c6c6f. Создан с целью экономии времени. (Что он успешно делает) :)

    Пользоваться так:
    Code:
    [B]haos@localhost(23:49:49)~ $[/B] sql-conv 
     Usage: sql-conv 'String for converting'
    [B]haos@localhost(23:49:58)~ $[/B] sql-conv 'Hello, World!'
    
     Source string ==> Hello, World!
    
     ASCII string ===> char(72,101,108,108,111,44,32,87,111,114,108,100,33)
    
     HEX string =====> 0x48656c6c6f2c20576f726c6421
    
    [B]haos@localhost(23:50:11)~ $[/B]
    Исходники лежат тут: http://lanham.nm.ru/sources/

    Upd(10 Nov 2007):
    P.S. писал для себя, тут выложил только потому , что это может кому-либо пригодиться.

    Code:
     
    /* sql-conv.c
    	Author: L0rd_Ha0S (forum.antichat.ru)
    	Description: Converting strings to ASCII and HEX codes. For SQL-Inj.
    	Date: 7 Nov, 2007 21:00
    	Charset for comments: UTF-8
    	Version: 0.2
    	Compiling: gcc -o sql-conv sql-conv.c
    */
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    //#include <malloc.h> // Needed by Windows. Uncomment this if you use Windows.
    
    void usage(const char *ProgramName);
    void word2hex(const char *SourceString, char *ResultBuffer, int string_length);
    void word2ascii(const char *SourceString, char *ResultBuffer, int string_length);
    
    int main(int argc, char *argv[])
    {
    	if (argc < 2) // Проверка параметров
    		usage(argv[0]);
    	
    	const char *SqlString = argv[1]; // сохраняем исходную строку в SqlString
    	const int SqlStringLength = strlen(SqlString); // вычисляем длину переданной строки
    	char *buffer; // будет хранить указатель на нашу память
    
    	if (SqlStringLength == 0){
    		printf(" Source string is empty!\n");
    		exit (1);
    	}
    	else
    		printf("\n Source string ==> %s\n", SqlString); // выводим исходную строку
    	
    	/* Выделяем область памяти, в которой будет храниться результирующая строка. Размер выделяемой памяти равен 
    	выражению SqlStringLength*4, т.к. ascii-вид строки(в текстовом виде) будет занимать размер исходя из 
    	=> 1 символ = 3 символа(max) + 1 символ запятой + символ \0. Но т.к. последний символ печатается без запятой,
    	то место запятой займет символ \0. Для хранения hex-вида(в текстовом представлении) нужно ещё меньше памяти.
    	Поэтому будем выделять память по-максимуму, т.е. по ascii-виду - SqlStringLength*4 */
    	
    	if ((buffer = (char *) malloc(SqlStringLength*4)) == 0 ){
    		printf(" malloc() is failed!\n");
    		exit (1);
    	}
    
    	memset(buffer, 0, SqlStringLength*4); // заполняем нашу память нулями
    	word2ascii(SqlString, buffer, SqlStringLength);
    	printf("\n ASCII string ===> char(%s)\n", buffer);
    	
    	memset(buffer, 0, SqlStringLength*4); // очищаем буфер для вызова word2hex()
    	word2hex(SqlString, buffer, SqlStringLength);
    	printf("\n HEX string =====> %s\n\n", buffer);
    	
    	free(buffer);	// Освобождаем память, которую мы использовали для хранения результата
    
    	exit (0);
    }
    
    /* usage() */
    
    void usage(const char *ProgramName)
    {
    	printf(" Usage: %s \'String for converting\'\n", ProgramName);
    	exit (0);
    }
    
    /* Функция word2hex() конвертирует переданную ей строку в hex вид, результат сохраняется в выделенной для этого
    области памяти. Принимает 3 параметра: 1й - указатель на строку, которую нужно отконвертировать,
    2й - указатель на область памяти, где будет храниться результат выполнения, 3й - длина исходной строки в символах (strlen()) */
    
    void word2hex(const char *SourceString, char *ResultBuffer, int string_length)
    {
    	int i; // счётчик символов
    	char buf_tmp[3]; // буфер, хранящий текстовое значение hex-кода символа.
    
    	for (memcpy(ResultBuffer, "0x", sizeof("0x")) && (i = 0); i < string_length; i++){
    		snprintf(buf_tmp, sizeof("%x"), "%x", SourceString[i]);
    		strcat(ResultBuffer, buf_tmp);
    	}
    }
    
    /* Функция word2ascii() конвертирует переданную ей строку в ascii вид, результат сохраняется в выделенной для этого
    области памяти. Принимает 3 параметра: 1й - указатель на строку, которую нужно отконвертировать,
    2й - указатель на область памяти, где будет храниться результат выполнения, 3й - длина исходной строки в символах (strlen()) */
    
    void word2ascii(const char *SourceString, char *ResultBuffer, int string_length)
    {
    	int i; // счётчик символов
    	char buf_tmp[5]; // буфер, хранящий текстовое значение hex-кода символа.
    
    	for (i = 0; i < string_length; i++){
    		if (i != (string_length - 1)){
    			if (SourceString[i] < 100){
    				snprintf(buf_tmp, sizeof("%2d,"), "%2d,", SourceString[i]);
    				strcat(ResultBuffer, buf_tmp);
    			}
    			else{
    				snprintf(buf_tmp, sizeof("%3d,"), "%3d,", SourceString[i]);
    				strcat(ResultBuffer, buf_tmp);
    			}
    		}
    		else{
    			if (SourceString[i] < 100){
    				snprintf(buf_tmp, sizeof("%2d"), "%2d", SourceString[i]);
    				strcat(ResultBuffer, buf_tmp);
    			}
    			else{
    				snprintf(buf_tmp, sizeof("%3d"), "%3d", SourceString[i]);
    				strcat(ResultBuffer, buf_tmp);
    			}
    		}
    	}
    }
    
    :)
     
    #1 L0rd_Ha0S, 6 Nov 2007
    Last edited: 10 Nov 2007
    6 people like this.
  2. L0rd_Ha0S

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

    Joined:
    25 Jan 2006
    Messages:
    148
    Likes Received:
    102
    Reputations:
    64
    To [x26]VOLAND:
    Честно говоря, не думаю что ради вывода из трёх строчек стоит писать GUI, к тому же программа потеряет свою переносимость, и будет заточена именно под конкретную ОС. Этот исходник будет работать и на *nix, и на винде.
    Это не релиз наикрутейшей проги, которой не хватает только gui. Я её писал в первую очередь для себя, чтобы избавить себя от гемора, а так как я пользуюсь только Линуксом, то мне было удобней сделать её именно в консольном варианте, ибо консоль у меня запущена всегда. Если у меня будет время, я подумаю над тем, как примотать к нему GUI, а пока я могу предложить сделать это тебе. ;)
     
  3. guest3297

    guest3297 Banned

    Joined:
    27 Jun 2006
    Messages:
    1,246
    Likes Received:
    639
    Reputations:
    817
    Очень слабо...
     
  4. L0rd_Ha0S

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

    Joined:
    25 Jan 2006
    Messages:
    148
    Likes Received:
    102
    Reputations:
    64
    SQL-Conv v0.2

    Написал новую версию. Все переписано по-новому. Теперь функции сохраняют результат в памяти, а не выводят его на stdout, так что при желании гуи прикрутить не составит большого труда (кому надо). В первом посте обновил исходник на вторую версию. При компиляции под виндой, не забудьте раскомментировать строку
    Code:
    #include <malloc.h>
    Работоспособность проверена на Linux, FreeBSD(tnx Alexsize), Windows(Vista, на остальных значит тоже будет работать)

    P.S. Просьба к людям более опытным чем я - посмотрите исходник (вторую версию), мож найдете какие ошибки, может что-то можно сделать проще чем у меня. Всё-таки опыта у меня пока не так много, так что буду благодарен за любые замечания.

    Обе версии лежат здесь:
    http://lanham.nm.ru/sources/
     
    #4 L0rd_Ha0S, 8 Nov 2007
    Last edited: 10 Nov 2007
  5. KEZ

    KEZ Ненасытный школьник

    Joined:
    18 May 2005
    Messages:
    1,604
    Likes Received:
    754
    Reputations:
    397
    ОНА ЧТО, НЕ НА ДЕЛФИ??? :eek: :eek: :eek: :eek: :eek: :eek: :eek: :eek: :eek: :eek:
     
    2 people like this.
  6. L0rd_Ha0S

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

    Joined:
    25 Jan 2006
    Messages:
    148
    Likes Received:
    102
    Reputations:
    64
    Как видишь =)
     
  7. guest3297

    guest3297 Banned

    Joined:
    27 Jun 2006
    Messages:
    1,246
    Likes Received:
    639
    Reputations:
    817
    Крут парень. Главно что под вистой =)
     
    1 person likes this.
  8. __mad

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

    Joined:
    4 Nov 2007
    Messages:
    100
    Likes Received:
    38
    Reputations:
    7
    тоже самое только чутка покороче)
    Code:
    #include <stdio.h>
    
    int main(int argc,char**argv)
    {
    	if (argc != 2){printf("%s <string>\n",argv[0]);return(1);}
    	for(printf("Source -> %s\n",argv[1]),printf("Hex -> 0x"),argv[0]=argv[1];*argv[1];*argv[1]++)
    		printf("%x",*argv[1]);
    	for(printf("\nAsci -> Char(%d",*argv[0]),*argv[0]++;*argv[0];*argv[0]++)
    		printf(",%d",*argv[0]);
    	return(printf(");\n"));
    }
     
    1 person likes this.
  9. Shred

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

    Joined:
    22 May 2006
    Messages:
    200
    Likes Received:
    29
    Reputations:
    0
    эх и я тада влеплю свои 5 коп на асп дот нет :)
    в TextBox3 - вписываем строку
    в TextBox4 - выводица код типа char(116,101,115,116)

    сорц обработки бутона

    TextBox4.Text = "";
    string sin2 = TextBox3.Text;
    string temp = "";
    for (int i = 0; i < sin2.Length; i++)
    temp += String.Format("{0:d},", (int)sin2);
    if (temp == "") return;
    temp = temp.Remove(temp.Length - 1);
    TextBox4.Text = "char(" + temp + ")";

    всё это щастье вист тута :)
    http://shred-11.iis7.parking.ru
     
    1 person likes this.
  10. KEZ

    KEZ Ненасытный школьник

    Joined:
    18 May 2005
    Messages:
    1,604
    Likes Received:
    754
    Reputations:
    397
    Чел? А ты в курсе, что sizeof(char*) == 4. или 8 на 64-битных пл-х. но никак не количеству байт, которые ты передавал malloc'у.
    Я просто не понимаю, если ты основ С не знаешь, то почему бы не писать на делфи?
     
    3 people like this.
  11. Forcer

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

    Joined:
    12 Apr 2007
    Messages:
    321
    Likes Received:
    98
    Reputations:
    12
    Code:
    if (argc < 2) // Проверка параметров
    		usage(argv[0]);
    	
    	const char *SqlString = argv[1]; // сохраняем исходную строку в SqlString
    	const int SqlStringLength = strlen(SqlString); // вычисляем длину переданной строки
    	char *buffer; // будет хранить указатель на нашу память
    в Си объявление переменных должно находиться до любого выполняемого кода.
     
    1 person likes this.
  12. __mad

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

    Joined:
    4 Nov 2007
    Messages:
    100
    Likes Received:
    38
    Reputations:
    7
    а что будет если после?:d
     
  13. Forcer

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

    Joined:
    12 Apr 2007
    Messages:
    321
    Likes Received:
    98
    Reputations:
    12
    __mad
    А ты типа не знаешь? :) В зависимости от компилятора. VS2005 гневно ругается, например, и отказывается компилировать.
     
  14. __mad

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

    Joined:
    4 Nov 2007
    Messages:
    100
    Likes Received:
    38
    Reputations:
    7
    что то я отсал от жизни :)
    я пользуюсь gcc , там всё норм)
    а vc6 незамечал такого...)
     
  15. KEZ

    KEZ Ненасытный школьник

    Joined:
    18 May 2005
    Messages:
    1,604
    Likes Received:
    754
    Reputations:
    397
    Чего ты не замечал? Он про C говорит, а не про С++.
    Ни один C-компилятор не допускает обьявлений после кода.
     
  16. __mad

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

    Joined:
    4 Nov 2007
    Messages:
    100
    Likes Received:
    38
    Reputations:
    7
    ну так и я про C, а не про С++ в gcc без проблем компилится : D даж предупреждений нету...
    зы gcc расшифровывается не C++ : D а GNU project C and C++ compiler ;)
     
  17. DWORD

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

    Joined:
    24 Jul 2007
    Messages:
    129
    Likes Received:
    70
    Reputations:
    -36
    gcc это компилятор С. Он допускает, подтверждаю. КЕЗ, почему ты так категоричен?
     
  18. KEZ

    KEZ Ненасытный школьник

    Joined:
    18 May 2005
    Messages:
    1,604
    Likes Received:
    754
    Reputations:
    397
    GCC значит это позволяет. Но по стандарту C все обьявления должны быть сделаны ДО первого оператора. Боюсь сейчас сильно напиздить. Во всяком случае, для C это стандарт _оформления_. Как найду ISO стандарты - отпишу. Меня шокировало если честно, что gcc это допускает.
     
  19. DWORD

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

    Joined:
    24 Jul 2007
    Messages:
    129
    Likes Received:
    70
    Reputations:
    -36
    КЕЗ, честно говоря я тоже всегда так думал (про стандарт). Но на форуме (по-моему васм.ру) недавно прочитал про то, что есть какие-то поправки, и, согласно новому стандарту, переменные можно объявлять в теле функции.
     
  20. L0rd_Ha0S

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

    Joined:
    25 Jan 2006
    Messages:
    148
    Likes Received:
    102
    Reputations:
    64
    :eek: :eek: :eek: :eek: Думал сюда никто не заходит, а тут вон сколько понаписали....
    только что - покороче :)
    o_O Да, как-то не задумывался над этим, спасибо. Поправлю сейчас.
    Я ведь написал, что опыта у меня МАЛО! Основы в голову сразу не ложатся, понимание приходит со временем. Не будь таким критичным, на ошибках учатся. Теперь я буду делать одной ошибкой меньше. А на счёт делфи... Делфи под Линуксом... Как-то нет желания.
    Это правило хорошего тона - объявлять все переменные вначале программы. Переменная может быть объявлена в любом месте программы до её непосредственного использования. У меня все переменные объявлены ДО их непосредственного использования. Я намерено их объявил после проверки параметров. Зачем мне их объявлять перед функцией usage()? Ни одна из этих переменных ей не используется. usage() завершит выполнение программы если нет параметров, если же они есть, выполнение продолжится. Только в случае, если параметры заданы имеет смысл объявлять эти переменные.

    Кстати, gcc не позволяет делать объявления после кода.
    Code:
    #include <stdio.h>
    
    int main(){
    
    char* buffer = "Hello, World!\n";
    printf("%s", buffer);
    
    return 0;
    }
    Code:
    haos@localhost(01:33:40)~/Projects/test $ gcc -o test test.c 
    haos@localhost(01:35:42)~/Projects/test $ ./test 
    Hello, World!
    haos@localhost(01:35:44)~/Projects/test $
    Code:
    #include <stdio.h>
    
    int main(){
    
    printf("%s", buffer);
    char* buffer = "Hello, World!\n";
    
    return 0;
    }
    Code:
    haos@localhost(01:36:50)~/Projects/test $ gcc -o test test.c 
    test.c: In function ‘main’:
    test.c:5: error: ‘buffer’ undeclared (first use in this function)
    test.c:5: error: (Each undeclared identifier is reported only once
    test.c:5: error: for each function it appears in.)
    haos@localhost(01:37:07)~/Projects/test $
     
    #20 L0rd_Ha0S, 9 Nov 2007
    Last edited: 9 Nov 2007