Ir ao conteúdo
  • Cadastre-se

C Existe C injection assim como existe SQL injection?


codigo rapido
Ir à solução Resolvido por Gimael,

Posts recomendados

Antigamente existiam algumas formas de se hackear sites utilizando algumas vulnerabilidades, como injeção de código na linguagem do site ou na linguagem do banco de dados usado pelo site. O SQL injection era uma maneira interessante de pegar as tabelas de nomes e senhas de usuários. Existe forma de se fazer o mesmo em C? Se sim, quais caracteres eu devo fazer escape para evitar que algum hacker consiga fazer algo prejudicial ao sistema?

Hoje eu fiz um url decode. Percebi que o GEdit tem iso-8859-1 para salvar meus arquivos .c, mas quando eu faço um locale, só aparece UTF-8. Então fiquei imaginando um cliente com o mesmo problema e que não queira atualizar sua maquina e fiz o seguinte programa:
 

//fonte: http://tivideotutoriais.blogspot.com/2021/08/linguagem-c-url-decode-iso-8859-1.html
char *matriz[16][16] = {	
	{"^@","^A","^B","^C","^D","^E","^F","^G","^H","^I","<br>","^K",  "^L","^M",  "^N","^O"},
	{"^P","^Q","^R","^S","^T","^U","^V","^W","^X","^Y","^Z","^[", "^\\","^]",  "^^","^_"},
	{ " ", "!","\"", "#", "$", "%", "&","\'", "(", ")", "*", "+",   ",", "-",   ".", "/"},
	{ "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", ":", ";","&lt;", "=","&gt;", "?"},
	{ "@", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K",   "L", "M",   "N", "O"},
	{ "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "[",  "\\", "]",   "^", "_"},
	{ "`", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k",   "l", "m",   "n", "o"},
	{ "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "{",   "|", "}",   "~","^?"},
	{ " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ",   " ", " ",   " ", " "},
	{ " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ",   " ", " ",   " ", " "},
	{ " ", "¡", "¢", "£", "¤", "¥", "¦", "§", "¨", "©", "ª", "«",   "¬", " ",   "®", "¯"},
	{ "°", "±", "²", "³", "´", "µ", "¶", "·", "¸", "¹", "º", "»",   "¼", "½",   "¾", "¿"},
	{ "À", "Á", "Â", "Ã", "Ä", "Å", "Æ", "Ç", "È", "É", "Ê", "Ë",   "Ì", "Í",   "Î", "Ï"},
	{ "Ð", "não", "Ò", "Ó", "Ô", "Õ", "Ö", "×", "Ø", "Ù", "Ú", "Û",   "Ü", "Ý",   "Þ", "ß"},
	{ "à", "á", "â", "ã", "ä", "å", "æ", "ç", "è", "é", "ê", "ë",   "í", "ì",   "î", "ï"},
	{ "ð", "não", "ò", "ó", "ô", "õ", "ö", "÷", "ø", "ù", "ú", "û",   "ü", "ý",   "þ", "ÿ"}
};

int hex(char x)
{
	if(x=='0'){ return 0;}
	if(x=='1'){ return 1;}
	if(x=='2'){ return 2;}
	if(x=='3'){ return 3;}
	if(x=='4'){ return 4;}
	if(x=='5'){ return 5;}
	if(x=='6'){ return 6;}
	if(x=='7'){ return 7;}
	if(x=='8'){ return 8;}
	if(x=='9'){ return 9;}
	if(x=='A'||x=='a'){ return 10;}
	if(x=='B'||x=='b'){ return 11;}
	if(x=='C'||x=='c'){ return 12;}
	if(x=='D'||x=='d'){ return 13;}
	if(x=='E'||x=='e'){ return 14;}
	if(x=='F'||x=='f'){ return 15;}
	return -1;
}

char hexch(int x)
{
	if(x== 0){ return '0';}
	if(x== 1){ return '1';}
	if(x== 2){ return '2';}
	if(x== 3){ return '3';}
	if(x== 4){ return '4';}
	if(x== 5){ return '5';}
	if(x== 6){ return '6';}
	if(x== 7){ return '7';}
	if(x== 8){ return '8';}
	if(x== 9){ return '9';}
	if(x==10){ return 'A';}
	if(x==11){ return 'B';}
	if(x==12){ return 'C';}
	if(x==13){ return 'D';}
	if(x==14){ return 'E';}
	if(x==15){ return 'F';}
	return '\0';
}

char *dec(int a, int b)
{
	return matriz[a][b];
}
 
int urlDecode(char *out, char *s )
{
	int a, b;
	int tm = strlen(s);
	int remove=0;
	char c, decoded[8];
	strcpy(out, ""); //limpa tudo que tiver em out
	for(int i=0; i<tm; i++)
	{
		c = *s++;
		if (c=='%')
		{
			a = hex(*s++) ;// primeiro hexadecimal
			b = hex(*s++) ;// segundo  hexadecimal
			strcpy(decoded, "");
			strcat(decoded, dec(a,b));
			strcat(out, decoded);
			//nem todos são formados por um 
			//unico caractere. Remove ecesso no final
			remove+=strlen(decoded);
		} 
		else if (c == '+')
		{
			strcat(out, " ");
		}
		else
		{
			char m[2]={c,'\0'};
			strcat(out, m);
		}
	} 
	out[strlen(out)-remove]='\0'; 
	return strlen(out);
}

void matrixDecode()
{
	printf( "\nMatriz de decodificação:\n"); 
	for(int i=0; i<16; i++)
	{
		for(int j=0; j<16; j++)
		{
			printf("%c%c=%s\t", hexch(i),hexch(j),dec(i,j));
		}
		printf("\n");
		for(int j=0; j<16; j++)
		{
			printf("%i=%s\t", i*16+j,dec(i,j));
		}
		printf("\n");
		printf("\n");
	}
}

void testaDecode()
{
	printf( "\nTestando decode:\n"); 
	char *url = "username=%C1gatha+Silva&email=agata%40dasilva.com";
	printf( "url = %s\n", url ); 
	int tm = strlen(url);
	printf( "tamanho url = %i\n\n", tm);
	char resp[tm];
	tm = urlDecode(resp, url) ;
	printf( "decodificado = %s\n", resp);
	printf( "tamanho do decod = %i\n", tm); 
}

int main()
{
	matrixDecode();
	testaDecode();
	return 0;
}


Esses fontes são interessantes, mas não funcionaram pra mim:


https://www.rosettacode.org/wiki/URL_encoding
https://www.rosettacode.org/wiki/URL_decoding

Se esse programa rodar no servidor, quem poderia me mostrar um exemplo de encode que poderia fazer algo inesperado com o sistema?

 

Link para o comentário
Compartilhar em outros sites

Se me permite uma pequena sugestão:

int hex(char x)
{
	if ((x>='0') && (x<='9')) { return x-48;}
	if ((x>='A') && (x<='F')) {return x-55;}
	if ((x>='a') && (x<='f')) {return x-87;}
	return -1;
}

char hexch(int x)
{
	if ((x>= 0) && (x <= 9)) { return x+48;}
	if ((x>=10) && (x<=15)) {return x+55;}
	return '\0';
}
  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

  • Solução

A injeção de código é possível em linguagens que interpretam e/ou compilam o código. Nativamente a linguagem C não faz isso - quer dizer, não há uma função eval em C, como há em linguagens de scripting, que pode receber código, compilá-lo, e depois executá-lo. Escrever um programa que faça isso não é muito difícil, no entanto - pesquise pela função dlopen, por exemplo. O problema surge quando você cria um programa que deve receber, compilar e executar código fonte de terceiros - porque isso te deixa sujeito a injeção de código. Já existem alguns sites em que você pode programar sem precisar fazer o setup no seu computador. Estes sites, com certeza, têm de fazer algum tipo de sanitização no código fonte que recebem, a fim de que não sejam invadidos de alguma forma pelos programas que recebem. Um exemplo clássico é que provavelmente estes sites não permitem que você use as funções system e popen. Outra questão com a qual eles provavelmente têm de lidar é com a função fork, que cria um novo processo ao duplicar o processo que a chama. Seria fácil realizar um ataque DoS em um site desses ao criar uma fork bomb. Em todo caso, injeção de código não é uma preocupação com a qual programadores C normalmente se preocupam. É uma questão bastante complexa, e eu pessoalmente não acredito que os caracteres presentes no código fonte recebido sejam a maior preocupação, tanto quanto que funções estão sendo chamadas. O uso de macros, por exemplo, pode tentar obscurecer que funções vão ser chamadas no final das contas - de forma que o código provavelmente deveria ser analisado depois de passar pelo pré-processador, para garantir que alguma macro "mágica" não consiga driblar um possível filtro que analise o código fonte recebido.

Link para o comentário
Compartilhar em outros sites

obrigado!

não consigo escrever uma resposta melhor porque o site parece com problemas.
 

10 horas atrás, Gimael disse:

A injeção de código é possível em linguagens que interpretam e/ou compilam o código. Nativamente a linguagem C não faz isso - quer dizer, não há uma função eval em C, como há em linguagens de scripting, que pode receber código, compilá-lo, e depois executá-lo.

Obrigado! É isso mesmo!

 

 

10 horas atrás, Gimael disse:

Escrever um programa que faça isso não é muito difícil


Na verdade não pretendo fazer isso. Eu estou fazendo um servidor bem simples com base no tiny.c que encontrei e me veio essa preocupação. A preocupação pra mim então é só com o sql injection. Isso pra mim é fácil. Muito obrigado pelas dicas!

Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!