Форум АНТИЧАТ

Форум АНТИЧАТ (https://forum.antichat.xyz/index.php)
-   С/С++, C#, Delphi, .NET, Asm (https://forum.antichat.xyz/forumdisplay.php?f=24)
-   -   SQL-Inj Strings Converter (https://forum.antichat.xyz/showthread.php?t=52910)

L0rd_Ha0S 06.11.2007 01:59

SQL-Inj Strings Converter
 
Вот, написал конвертер строк в ASCII и НЕX вид. Может быть полезен при проведении sql-инъекций, когда в запросы надо вставить данные в виде char(104,101,108,108,111) или в hex - 0x68656c6c6f. Создан с целью экономии времени. (Что он успешно делает) :)

Пользоваться так:
Код:

haos@localhost(23:49:49)~ $ sql-conv
 Usage: sql-conv 'String for converting'
haos@localhost(23:49:58)~ $ 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

haos@localhost(23:50:11)~ $

Исходники лежат тут: http://lanham.nm.ru/sources/

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

Код:


/* 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);
                        }
                }
        }
}

:)

L0rd_Ha0S 06.11.2007 18:21

To [x26]VOLAND:
Цитата:

А Gui зделать никак?
Честно говоря, не думаю что ради вывода из трёх строчек стоит писать GUI, к тому же программа потеряет свою переносимость, и будет заточена именно под конкретную ОС. Этот исходник будет работать и на *nix, и на винде.
Это не релиз наикрутейшей проги, которой не хватает только gui. Я её писал в первую очередь для себя, чтобы избавить себя от гемора, а так как я пользуюсь только Линуксом, то мне было удобней сделать её именно в консольном варианте, ибо консоль у меня запущена всегда. Если у меня будет время, я подумаю над тем, как примотать к нему GUI, а пока я могу предложить сделать это тебе. ;)

guest3297 06.11.2007 21:41

Очень слабо...

L0rd_Ha0S 08.11.2007 01:20

SQL-Conv v0.2
 
Написал новую версию. Все переписано по-новому. Теперь функции сохраняют результат в памяти, а не выводят его на stdout, так что при желании гуи прикрутить не составит большого труда (кому надо). В первом посте обновил исходник на вторую версию. При компиляции под виндой, не забудьте раскомментировать строку
Код:

#include <malloc.h>
Работоспособность проверена на Linux, FreeBSD(tnx Alexsize), Windows(Vista, на остальных значит тоже будет работать)

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

Обе версии лежат здесь:
http://lanham.nm.ru/sources/

KEZ 08.11.2007 02:04

ОНА ЧТО, НЕ НА ДЕЛФИ??? :eek: :eek: :eek: :eek: :eek: :eek: :eek: :eek: :eek: :eek:

L0rd_Ha0S 08.11.2007 03:07

Цитата:

Сообщение от KEZ
ОНА ЧТО, НЕ НА ДЕЛФИ??? :eek: :eek: :eek: :eek: :eek: :eek: :eek: :eek: :eek: :eek:

Как видишь =)

guest3297 08.11.2007 16:18

Цитата:

Скомпилил под Вистой с через lcc, всё работает на ура.
Крут парень. Главно что под вистой =)

__mad 08.11.2007 18:38

тоже самое только чутка покороче)
Код:

#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"));
}


Shred 08.11.2007 18:55

эх и я тада влеплю свои 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[i]);
if (temp == "") return;
temp = temp.Remove(temp.Length - 1);
TextBox4.Text = "char(" + temp + ")";

всё это щастье вист тута :)
http://shred-11.iis7.parking.ru

KEZ 08.11.2007 20:51

Цитата:

char *buffer;
//...
memset(buffer, 0, sizeof(buffer)); // заполняем нашу память нулями
Чел? А ты в курсе, что sizeof(char*) == 4. или 8 на 64-битных пл-х. но никак не количеству байт, которые ты передавал malloc'у.
Я просто не понимаю, если ты основ С не знаешь, то почему бы не писать на делфи?


Время: 03:22