Fiona 0 Denunciar post Postado Novembro 13, 2008 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
Fiona 0 Denunciar post Postado Novembro 13, 2008 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
eibon 2 Denunciar post Postado Novembro 13, 2008 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
Fiona 0 Denunciar post Postado Novembro 13, 2008 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
André Baptista 0 Denunciar post Postado Novembro 13, 2008 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
Renato Machado de Menezes 0 Denunciar post Postado Novembro 13, 2008 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
Alaerte Gabriel 662 Denunciar post Postado Novembro 13, 2008 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
eibon 2 Denunciar post Postado Novembro 13, 2008 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
Williams Duarte 431 Denunciar post Postado Novembro 13, 2008 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 Gabriel 662 Denunciar post Postado Novembro 13, 2008 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
Fiona 0 Denunciar post Postado Novembro 15, 2008 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
Alaerte Gabriel 662 Denunciar post Postado Novembro 15, 2008 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
eibon 2 Denunciar post Postado Novembro 15, 2008 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
Fiona 0 Denunciar post Postado Novembro 15, 2008 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
Williams Duarte 431 Denunciar post Postado Novembro 15, 2008 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
eibon 2 Denunciar post Postado Novembro 16, 2008 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
Fiona 0 Denunciar post Postado Maio 18, 2009 Muito obrigado a todos que me ajudaram, problema resolvido pode fechar o tópico. Compartilhar este post Link para o post Compartilhar em outros sites
Alaerte Gabriel 662 Denunciar post Postado Maio 18, 2009 ok Compartilhar este post Link para o post Compartilhar em outros sites