Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Fiona

[Resolvido] SQL Injection

Recommended Posts

Ola, venho pedir uma ajuda aki no forum, tenho um servidor de MuOnline e estou tendo sérios problemas com SQL Inject, estou sem saber o que fazer... Hoje mesmo um infeliz deletou uma tabela inteira de meu servidor, tabela essa que guardava todas as informações das contas (login, senha, etc..) dos jogadores.

 

Apache 2.2

PHP 5

 

Trabalho com o Firewall do Windows Server 2003

Sitema Operacional Windows Server 2003 SP1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ola, venho pedir uma ajuda aki no forum, tenho um servidor de MuOnline e estou tendo sérios problemas com SQL Inject, estou sem saber o que fazer... Hoje mesmo um infeliz deletou uma tabela inteira de meu servidor, tabela essa que guardava todas as informações das contas (login, senha, etc..) dos jogadores.

 

Apache 2.2

PHP 5

 

Trabalho com o Firewall do Windows Server 2003

Sitema Operacional Windows Server 2003 SP1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Existem várias maneiras de evitar...

Da um foreach em todas as superglobais,checa se tem sinais no valor usando o ereg com uma expressao regular do tipo:

[a-zA-Z0-9]
É o melhor jeito.Lembrando que não é basicamente isso,e sugiro que estude php.

Pode também dar um foreach em todas as superglobais,e evitar a injeção dando addslashes ou algum comando de escape de caracteres especiais no valor das mesmas.

Existem diversos modos.Mande o link do seu site que averiguarei.

Abraço!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Obrigado por responder...

 

Bom, não sou nada nessa parte de PHP, preciso estudar mesmo, conheci o forum essa semana, irei mesmo estudar os tutoriais que temos aki no forum para melhor meu conhecimento. Lhe enviei os dados por MP

Compartilhar este post


Link para o post
Compartilhar em outros sites

Fiona de uma olhada neste artigo aqui, publicado no phpbrasil.com,

acredito que vai lhe ajudar bastante...

 

http://www.phpbrasil.com/articles/article.php/id/1518

(Como evitar ataques de SQL Injection)

 

eu estou usando o mesmo exemplo e mais umas funções q montei ;D

 

[]'s

Compartilhar este post


Link para o post
Compartilhar em outros sites

olá Fiona,

 

qual banco que você esta utilizando? mysql?

bem, para lidar com segurança temos que tomar certos cuidados. aqui vai umas dicas.

 

1 - converta as variáveis, como por exemplo um codigo, converta para inteiro no seu codigo php, utilizando a função settype.

2 - utilize a função sprintf, é uma função de entrada de dados como na linguagem "C", utilizando %s para string,%u para números inteiros.

3 - esta é muito importante, utilize algumas funções para escapar todas as quando numéricas como: mysql_scape_string, addslashes.

 

olha com estas dicas você pode prevenir algumas dores de cabeça, em relação a segurança. http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom Fiona, o que o hc disse não ajuda em quase nada, servirá apenas para aceitar apenas letras e números.

 

portanto estude aqui neste tópico, no qual discutimos o assunto relacionado a segurança em questão de SQL Injectio.

 

http://forum.imasters.com.br/public/style_emoticons/default/seta.gif http://forum.imasters.com.br/index.php?showtopic=276729

 

tem vários códigos ai elaborados por mim e pelos demais colegas.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Alaerte...e postando apenas letras e números você consequentemente evita o que?

Também tem o addslashes,que citei.

E o que tu fez alaerte,ta falho (relativo a checagem dos caracteres especiais),da um strtolower que fica mais completo.

E alaerte,não precisava de mais 1 foreach... um in_array resolvia.

Mas de qualquer modo,é legal você entrar no tópico que o alaerte recomendeu.Procure entender como funciona a proteção.

Abraço!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Use este programa e teste todos os possiveis ataques, assim fica mais fácil que código usar nas páginas que o programa faz o ataque e te mostra como corrigir!

 

Verique todas as tabelas depois, embora não mostre mas a injeção já esta dentro caso haja falhas, o Alaerte postou vários mas não a garantia de 100% contra os ataques deste programa!

 

web vulnerability scanner

 

Faça bom uso, duvidas me mande uma MP

 

Abraços http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif

Compartilhar este post


Link para o post
Compartilhar em outros sites

Alaerte...e postando apenas letras e números você consequentemente evita o que?

Também tem o addslashes,que citei.

E o que tu fez alaerte,ta falho (relativo a checagem dos caracteres especiais),da um strtolower que fica mais completo.

E alaerte,não precisava de mais 1 foreach... um in_array resolvia.

Mas de qualquer modo,é legal você entrar no tópico que o alaerte recomendeu.Procure entender como funciona a proteção.

Abraço!

Opa, olá meu caro.

 

Claro que o sistema ta falho, você tem um 100% ai pra me arranjar ? acho que não né ? poisé.

 

eu programei dessa forma porque eu quis amigão, o pessoal propos um desafio e eu entre no meio pra brincar assim como eles. ;)

 

mais isso não vem ao caso, espera a resposta do autor do tópico, pois a minha atenção aqui é resolver o problema do usuário, qualquer post que fuja dos objetivos deste tópico será apagado daqui para frente.

 

WDuarte, esse programa é bom mesmo, ajuda bastante eu o tenho aqui :D

Compartilhar este post


Link para o post
Compartilhar em outros sites

Existem várias maneiras de evitar...

Da um foreach em todas as superglobais,checa se tem sinais no valor usando o ereg com uma expressao regular do tipo:

[a-zA-Z0-9]
É o melhor jeito.Lembrando que não é basicamente isso,e sugiro que estude php.

Pode também dar um foreach em todas as superglobais,e evitar a injeção dando addslashes ou algum comando de escape de caracteres especiais no valor das mesmas.

Existem diversos modos.Mande o link do seu site que averiguarei.

Abraço!

Olha, eu tenho todas essas proteções, e mesmo assim continuaram a atacar, não sei o que fazer.

 

Use este programa e teste todos os possiveis ataques, assim fica mais fácil que código usar nas páginas que o programa faz o ataque e te mostra como corrigir!

 

Verique todas as tabelas depois, embora não mostre mas a injeção já esta dentro caso haja falhas, o Alaerte postou vários mas não a garantia de 100% contra os ataques deste programa!

 

web vulnerability scanner

 

Faça bom uso, duvidas me mande uma MP

 

Abraços http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif

Baixei o programa e realizei uma varredura em meu site, o problema é que não encontrei nada, nenhuma falha.

 

Verique todas as tabelas depois, embora não mostre mas a injeção já esta dentro caso haja falhas, o Alaerte postou vários mas não a garantia de 100% contra os ataques deste programa!

Como verifico isso ?

 

 

 

Obrigado por ajudarem, fico feliz em saber que existe pessoas a fim de ajudar.

Compartilhar este post


Link para o post
Compartilhar em outros sites

O caso é que você não sabe como verificar as falhas a partir do programa, se tu tem todas essas proteções ai, é praticamente impossível alguém fazer isso a partir de um login, tu tem as proteções em login, mais será que depois do usuário logado, tu colocou proteções nos demais campos que pode haver ? se eu me logar em seu site. no meu painel de controle, se existir um campo pra alguma coisa, eu posso jogar todo meu ataque a partir dele e pronto, como você só se preocupou em por proteção no formulário de login, acaba tendo esse tipo de ataque.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Alaerte,

Olhei o site dele e não encontrei painel de login.Procurei alguma falha (vamos dizer que não insisti muito no assunto [preguiça]) mas também não achei.

O jeito é pegar acutenix/sss/algum otro prog e dar uma escaniada,fazer um pen-testing também.

Fiona,cite os módulos do seu site?

Se quiser distribuir os source-codes,fica bem mais fácil!

Abraço!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Segue abaixo o meu arquivo config.php responsavel por todas as conexões em meu site:

 

<?php

function xw_sanitycheck($str){

if(strpos(str_replace("''",""," $str"),"'")!=false)

return str_replace("'", "''", $str);

else

return $str;

}

 

function secure($str){

 

if (is_array($str)) {

foreach($str AS $id => $value) {

$str[$id] = secure($value);

}

}

else

$str = xw_sanitycheck($str);

 

return $str;

}

 

 

$xweb_AI = array_keys($_GET);

$i=0;

while($i<count($xweb_AI)) {

$_GET[$xweb_AI[$i]]=secure($_GET[$xweb_AI[$i]]);

$i++;

}

unset($xweb_AI);

 

 

$xweb_AI = array_keys($_REQUEST);

$i=0;

while($i<count($xweb_AI)) {

$_REQUEST[$xweb_AI[$i]]=secure($_REQUEST[$xweb_AI[$i]]);

$i++;

}

unset($xweb_AI);

 

 

$xweb_AI = array_keys($_POST);

$i=0;

while($i<count($xweb_AI)) {

$_POST[$xweb_AI[$i]]=secure($_POST[$xweb_AI[$i]]);

$i++;

}

 

 

$xweb_AI = array_keys($_COOKIE);

$i=0;

while($i<count($xweb_AI)) {

$_COOKIE[$xweb_AI[$i]]=secure($_COOKIE[$xweb_AI[$i]]);

$i++;

}

 

 

 

$xa = getenv('REMOTE_ADDR');

$badwords = array(";","=","'","*","/"," \ ","DROP", "SELECT", "UPDATE", "DELETE", "drop", "select", "update", "delete", "WHERE", "where", "-1", "-2", "-3","-4", "-5", "-6", "-7", "-8", "-9",);

foreach($_POST as $value)

$db__host = "127.0.0.1"; //ip local

$db__user = "sa"; // usuario sql

$db__passwd = "xxxxxxxx"; // senha sql

$db__muonline = 'MuOnline'; // banco de dados

 

 

$regsubmit = "regform.submit()";

$conexao_muonline = mssql_connect("$db__host","$db__user","$db__passwd");

$msdb= mssql_select_db("$db__muonline",$conexao_muonline);

 

?>

 

Por motivos de segurança não coloquei minha senha SQL ^^

 

Essa é uma nova configuração que meu amigo criou ontem, afim de barrar esse problema.

 

Tambem temos outros arquivos de defesa:

 

sql_check.php

sql_inject.php

sql_verificacao_injecao.php

 

Quem puder me dar uma mão nisso ai, agradecerei eternamente.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Fiz algumas varreduras e muitas constaram erros não vou colocar os erros aqui, mas verifique seus forms

 

os dados que mais apareceram foi este, alguns do home/envia.php

 

e foram injetados sql_injection nas base de dados, apague por que acusou que está lá e o programa acusou injeção de javascritp Cross Site Scripting

Vulnerabilidade descrição

Esta página contém um erro / mensagem de aviso que poderá divulgar o sensível information.The mensagem também pode conter a localização do arquivo que produziu a exceção não tratada.

 

Este pode ser um falso positivo se a mensagem de erro é encontrado na documentação páginas.

Essa vulnerabilidade afeta / registro / registro_jogo_realizado.php.

O impacto desta vulnerabilidade

As mensagens de erro pode revelar informações sensíveis. Esta informação pode ser usada para lançar novos ataques.

 

Ataque detalhes

Temos encontrado

<b> Erro fatal </ b>: Cannot redeclare xw_sanitycheck () (anteriormente declarados em C: \ AppServ \ www \ registro \ passwd.php: 2) <b> em C: \ AppServ \ www \ registro \ passwd.php </ b> na linha <b> 7 </ b> <br

Hoje existe sites como o http://www.opiratinha.info/ que distribui verdadeiras chaves para que não tem o que fazer, ja li alguns e sei que são muito bons mesmo, ajuda e muito os que são os vedadeiros atoas, por isso não brinque com informações precisas na mão de pessoas erradas.

 

Faz uma função que voce escape das aspas com diz hinon, escapando da agulha voce aguenta toda a seringa!!

 

Abraços

Compartilhar este post


Link para o post
Compartilhar em outros sites

Fiz rapidim um sisteminha bem toskim...mas pode te ajudar.

Tomai:

getconst.cls.php:

<?php
class gcs
{
	
	public static function terr($str){
		return '<font color=\'#ff0000\'>'.$str.'</font>';
	}
}
?>

excp.cls.php:

<?php
class sqinj Extends Exception
{
	
	public function __toString(){
		return gcs::terr($this->getMessage());
	}
}

class bfm Extends Exception
{
	
	public function __toString($str){
		return gcs::ter($this->getMessage())
	}
}
?>

logmanip.cls.php:

<?php
class logmanip
{
	
	public static function crialog($logname, $msg){
		$fp = fopen($logname, 'a');
		if($fp){
			fwrite($fp, $msg);
			fclose($fp);
		} else {
			chmod(getcwd(), 777);
			self::criaLog($logname, $msg);
		}
	}
	
	public static function readLog($logname){
		$fp = @fopen($logname, 'r');
		$fr = fread($fp, filesize($logname));
		fclose($fp);
		return $fr;
	}
	
	public static function removeLog($logname){
		if(unlink($logname)){
			return true;
		}
		return false;
	}
	
	public static function showLogs(){
		$return = '';
		$dir = getcwd();
		$p = opendir($dir);
		while($file = readdir($p)){
			if(preg_match('[log][.]\.txt', $file)){
				$return .= $file."-";
			}
		}
		closedir($dir);
		return $return;
	}
}
?>

protect.cls.php:

<?php
include 'getconst.cls.php';
include 'excp.cls.php';
include 'logmanip.cls.php';
class protect
{
	private $maxcrt = 200;
	
	public function checkentry($entry){
		foreach($entry as $value){
			if(preg_match('[^a-zA-Z0-9 ]', $value)){
				throw new sqinj('SQL injection detectado.');
			} else if(strlen($value) > $this->maxcrt){
				throw new bfm('Favor digitar uma string com menos de'.$this->maxcrt); 
			} 
		}
	}

	public function setMaxCtr($max){
		if(is_int($max) && $max > 0) $this->maxcrt = $max;
	}
	
	public function __construct($do){
		if($do === true){
			try {
				$this->checkentry($_POST);
				$this->checkentry($_GET);
				$this->checkentry($_COOKIE);
				$this->checkentry($_REQUEST);
				$ip = getenv('remote_addr');
				$logs = explode('-', logmanip::showLogs());
				foreach($logs as $log){
					$cntd = logmanip::readLog($log);
					if(substr_count($cntd,$ip)>=3){
						die(gcs::terr('Usúario banido'));
					}
				}
			}
			catch(sqinj $sqinj){
				$msg = '==--==--=='."\n";
				$msg .= 'Sql injection detected'."\n";
				$msg .= 'Ip:'.getenv('remote_adrr')."\n";
				$msg .= 'Date:'.date('d/m/Y')."\n";
				$msg .= 'Hour:'.date('H:i')."\n";
				$msg .= '==--==--=='."\n";
				logmanip::crialog('log_sqlinjection.txt', $msg);
				die($sqinj);
			}
			catch(bfm $bfm){
				die($bfm);
			}
		}
	}
}
?>

Inclui o protect em todas as páginas que você achar necessário (ou em todas).

Instancia um objeto da classe protect,e pronto.

$obj = new protect(true);
Misturei inglês e português,fico feio pacas,não repara(quero perder essa mania,ainda perco).

Abraço!

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.