Ir para conteúdo

POWERED BY:

Arquivado

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

Bobrinha

Função SQL Injection insegura...

Recommended Posts

Espero estar ajudando

 

Vejam esse link http://forum.imasters.com.br/index.php?showtopic=125349

 

o Fybio posto uma função SQL Injection na qual ele disse ser segura mais não é e não usem essa função

 

Vejam por que

 

function sql_inection ($sql){// remove palavras que contenham sintaxe sql$sql = preg_replace(sql_regcase("/(from|select|insert|delete|where|drop table|show tables|#|\*|--|\\\\)/"),"",$sql);$sql = trim($sql);//limpa espaços vazio$sql = strip_tags($sql);//tira tags html e php$sql = addslashes($sql);//Adiciona barras invertidas a uma stringreturn $sql;}Modo de usar$variavel = sql_inection($_POST['variavel']);$variavel = sql_inection($_POST['variavel']);

Pra ver como é insegura basta usar um comando agora não sei se posso postar, vo esperar a ordem de algum moderador mais acho importante pq muita gente deve estar usando essa função achando que ela segura injection...

Compartilhar este post


Link para o post
Compartilhar em outros sites

bom, eu uso outra função contra sql injection aqui=>----------------<?php$xa = getenv('REMOTE_ADDR');$badwords = array(";","'","\"","*","union","del","DEL","insert","update","=","drop","sele","$");foreach($_POST as $value)foreach($badwords as $word)if(substr_count($value, $word) > 0)die("Erro de Segurança!<br />Não foram permitidos alguns caracteres incluídos, por favor remova-os e tente novamente -> $xa");(...)require_once "sql_inject.php"; $bDestroy_session = TRUE; $url_redirect = 'principal.php'; $sqlinject = new sql_inject('./log_file_sql.log',$bDestroy_session,$url_redirect);--------------?>o arquivo sql_injection.php a seguir:----------------<?phpclass sql_inject{ /** * @shortdesc url to redirect if an sql inject attempt is detect. if unset, value is FALSE * @private * @type mixed */ var $urlRedirect; /** * @shortdesc does the session must be destroy if an attempt is detect * @private * @type bool */ var $bdestroy_session; /** * @shortdesc the SQL data currently test * @private * @type string */ var $rq; /** * @shortdesc if not FALSE, the url to the log file * @private * @type mixed */ var $bLog; /** * Builder * * @param bool bdestroy_session optional. does the session must be destroy if an attempt is detect? * @param string urlRedirect optional. url to redirect if an sql inject attempt is detect * @public * @type void */ function sql_inject($mLog=FALSE,$bdestroy_session=FALSE,$urlRedirect=FALSE) { $this->bLog = (($mLog!=FALSE)?$mLog:''); $this->urlRedirect = (((trim($urlRedirect)!='') && file_exists($urlRedirect))?$urlRedirect:''); $this->bdestroy_session = $bdestroy_session; $this->rq = ''; } /** * @shortdesc test if there is a sql inject attempt detect * test if there is a sql inject attempt detect * * @param string sRQ required. SQL Data to test * @public * @type bool */ function test($sRQ) { $sRQ = strtolower($sRQ); $this->rq = $sRQ; $aValues = array(); $aTemp = array(); // temp array $aWords = array(); // $aSep = array(' and ',' or '); // separators for detect the $sConditions = '('; $matches = array(); $sSep = ''; // is there an attempt to unused part of the rq? if (is_int((strpos($sRQ,"#")))&&$this->_in_post('#')) return $this->detect(); // is there a attempt to do a 2nd SQL requete ? if (is_int(strpos($sRQ,';'))){ $aTemp = explode(';',$sRQ); if ($this->_in_post($aTemp[1])) return $this->detect(); } $aTemp = explode(" where ",$sRQ); if (count($aTemp)==1) return FALSE; $sConditions = $aTemp[1]; $aWords = explode(" ",$sConditions); if(strcasecmp($aWords[0],'select')!=0) $aSep[] = ','; $sSep = '('.implode('|',$aSep).')'; $aValues = preg_split($sSep,$sConditions,-1, PREG_SPLIT_NO_EMPTY); // test the always true expressions foreach($aValues as $i => $v) { // SQL injection like 1=1 or a=a or 'za'='za' if (is_int(strpos($v,'='))) { $aTemp = explode('=',$v); if (trim($aTemp[0])==trim($aTemp[1])) return $this->detect(); } //SQL injection like 1<>2 if (is_int(strpos($v,'<>'))) { $aTemp = explode('<>',$v); if ((trim($aTemp[0])!=trim($aTemp[1]))&& ($this->_in_post('<>'))) return $this->detect(); } //SQL injection got '--' if (is_int(strpos($v,'--'))) { return $this->detect(); } //SQL injection got ';' if (is_int(strpos($v,';'))) { return $this->detect(); } } if (strpos($sConditions,' null')) { if (preg_match("/null +is +null/",$sConditions)) return $this->detect(); if (preg_match("/is +not +null/",$sConditions,$matches)) { foreach($matches as $i => $v) { if ($this->_in_post($v))return $this->detect(); } } } if (preg_match("/[a-z0-9]+ +between +[a-z0-9]+ +and +[a-z0-9]+/",$sConditions,$matches)) { $Temp = explode(' between ',$matches[0]); $Evaluate = $Temp[0]; $Temp = explode(' and ',$Temp[1]); if ((strcasecmp($Evaluate,$Temp[0])>0) && (strcasecmp($Evaluate,$Temp[1])<0) && $this->_in_post($matches[0])) return $this->detect(); } return FALSE; } function _in_post($value) { foreach($_POST as $i => $v) { if (is_int(strpos(strtolower($v),$value))) return TRUE; } return FALSE; } function detect() { // log the attempt to sql inject? if ($this->bLog) { $fp = @fopen($this->bLog,'a+'); if ($fp) { fputs($fp,"\r\n".date("d-m-Y H:i:s").' ['.$this->rq.'] from '.$this->sIp = getenv("REMOTE_ADDR")); fclose($fp); } } // destroy session? if ($this->bdestroy_session) session_destroy(); // redirect? if ($this->urlRedirect!=''){ exit("<script>document.location='$this->urlRedirect'</script>"); } return TRUE; }function protect1($protected) { // This Will be the fuction we call to protect the variables. $banlist = array ("'", "shutdown", "or", "-", "--", "or=", "del", "[", ")--", "Character", "dbo", "WHERE", "Set", "]", "\"", "<", "\\", "|", "/", "=", "insert", "select", "update", "delete", "distinct", "having", "truncate", "'", "replace", "handler", "like", "procedure", "limit", "order by", "group by", "asc", "warehouse", "DEL", "$", "sele", "+", "+ dx", " dx", "memb_info", "desc"); //$banlist is the list of words you dont want to allow. if ( eregi ( "[a-zA-Z0-9@]+", $protected ) ) { // Makes sure only legitimate Characters are used. $protected = trim(str_replace($banlist, '', $protected)); // Takes out whitespace, and removes any banned words. return $protected; //echo "+"; } else { //echo "-"; echo $protected; die ( ' Is invalid for that spot, please try a different entry.' ); // Message if thier is any characters not in [a-zA-Z0-9]. } // ends the if ( eregi ( "[a-zA-Z0-9]+", $this->protected ) ) {} // ends the function Protect() {function protect2($protected) { // This Will be the fuction we call to protect the variables. $banlist = array ("'", "shutdown", "or", "-", "--","-", "or=", "del", "[", ")--", "Character", "dbo", "WHERE", "Set", "]", "\"", ">", "<", "\\", "|", "/", "=", "insert", "select", "update", "delete", "distinct", "having", "truncate", "'", "replace", "handler", "like", "procedure", "limit", "order by", "group by", "asc", "warehouse", "DEL", "$", "sele", " +", " + ", "+", "+ dx", " dx", "memb_info", "desc"); //$banlist is the list of words you dont want to allow. if ( eregi ( "[0-9]+", $protected ) ) { // Makes sure only legitimate Characters are used. $protected = trim(str_replace($banlist, '', $protected)); // Takes out whitespace, and removes any banned words. return $protected; //echo "+"; } else { //echo "-"; echo $protected; die ( ' Caracteres Invalidos' ); // Message if thier is any characters not in [a-zA-Z0-9]. } // ends the if ( eregi ( "[a-zA-Z0-9]+", $this->protected ) ) {} // ends the function Protect() {}$badwords = array("+","--)","DEL","(",")","--","-","'","del","DEL","insert","UPDATE","update","=","drop","sele","$","warehouse ","Dexterity","WHERE");foreach($_POST as $value)foreach($badwords as $word)if(substr_count($value, $word) > 0)die("<center>SQL INJECTION!</center>");--------------?>Bem mais completa, mas diga aí porque você diz que esta está insegura, ou então me envia uma MP se não quiser postar aqui.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Gui-Brown não vou postar o comando sem autorização por que podem pensar que seja sei la ajudando a hackiar e não é essa minha intenção, apenas quero ajudar e quero ajuda pra acabar com esse troço de sql injection...

Compartilhar este post


Link para o post
Compartilhar em outros sites

iiieu tenho que acha uma melhoré que eu não sei nem por onde começamais tipo a intenção desse ai não é só impedi tipo códigos html,php,sql e na que eu implenmentei ele até tira algumas coisas do java.Mais tipo coisa da url não fica a cargo do código do programador?

Compartilhar este post


Link para o post
Compartilhar em outros sites

jcfalcone isso não sei pois não entendo muito de proteção, mais usei a função nos campos do meu formulario realmente protege e limpa alguns caracteres, mais se você tentar atacar pela url você acaba conseguindo estranho isso...

Compartilhar este post


Link para o post
Compartilhar em outros sites

a ta acho que eu entendi no caso seriaExemploform de logincom o campo loginquando chega no php que verifica você coloca por exemploverifica.php?login="1"ai ele da o problema neentão tipo esse tipo de problema não sei muito bem com você pode resolvemais você podia faze assimvocê passa via post que não mexe na urle la onde verifica você pega a urle se tiver alguma coisa que não seja o nome da pagina você da erro ou redirecionando pra mesma pagina só que apagando oque tive depois do ?acho que protegeria mais

Compartilhar este post


Link para o post
Compartilhar em outros sites

E como faria isso? da pra dar um codigo exemplonos ataques por URL é mais ou menos assim?acao=logar&login=´&senha&submit=EntrarComo proteger esses ataques por URL?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bobrinha, acho que entendo oque você quer dizer. Mas não precisa fazer "escândalo" por causa disso. Acho que você está falando sobre enviar variáveis pelo método GET, mas é só o PROGRAMADOR bloquear o método get em todos aqueles scripts php que processam os dados somente pelo método POST, que é o qual as funções contra sql_injection desses scripts funcionam. Não é um bug, é só uma lacuna dos scripts. E qualquer programador com experiência conseguiria preencher esta lacuna.É isso?Bobrinha, para bloquear o método GET procure estudar sobre esses dois métodos de transferência de dados, de preferência faça sua busca no Google (ou então no manual do PHP). O método post supera o Get em diversos pontos, eu só usaria o GET para algo bastante simples, de preferência não em formulários, pois a quantidade de dados a se passar em uma url é limitado, mas sim em sites como o de um e-commerce por exemplo, onde ficaria bem mais dinâmico de se trabalhar, por exemplo:produto.php?id=25O método GET pode ser bloqueado sim, se não me engano acho que tem até funções para isto. Ou então isso é feito no php.ini mesmo.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Como sempre falei e falo, essa é a primeira versao da minha função ja postei a segunda mais customizada e mesmo essa ai esta segura sim, se quiser postar o que você achou ai pode postar sem problemas, mas você deve estar comendo bola ou vendo outro tipo de segurança que nao é o assunto aqui, pois a função evita que o usuario insira comando sql, tipo 1'or1='1 basta a addslashes para evitar os apostrofos.

 

mas como ja falei o melhor meio de evitar ataques é passar os dados por parametro sem precisar elimitar qualquer tipo caractere

 

nao precisa de uma função enorme basta 1 linha que resolve o problema, mas o principal é a pessoa saber o que esta fazendo e o que esta evitando, assim ela saber se sua função esta segura ou nao

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom.. acho que a função do Fabyo esta otima sim!Bobrinha, quanto a você postar o tal codigo q você diz q usou para invadir, nenhum moderador iria falar algo, pq você estaria ajudando.... Errado seria se você postasse scripts feitos exclusivamente para invadir, programas q exploram brechas, etc.....Falar sobre, nao e incentivar.... e existe uma enorme diferencia entre hacker e lammer/cracker . Bom... creio q o erro q você disse.... deve ser pq no servidor q você testou, o Register Globals estava ligado nao? Nesse caso.... Seria possivel passar uma url q a principio, você imaginou q seria passada pelo form, atraves da url.....deve ser isso..... tanto e q na proxima versao do php... parece q vao tira o register globals. #@?$%~ falha.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom vamos trabalhar :) testado no PHP 4

 

Seguindo primeiro a logica do Fabyo como ele ja disse a versão dele é insegura, mais esta no poste que ele fez que é segura...

 

Pegue a função

 

function sql_inection ($sql){// remove palavras que contenham sintaxe sql$sql = preg_replace(sql_regcase("/(from|select|insert|delete|where|drop table|show tables|#|\*|--|\\\\)/"),"",$sql);$sql = trim($sql);//limpa espaços vazio$sql = strip_tags($sql);//tira tags html e php$sql = addslashes($sql);//Adiciona barras invertidas a uma stringreturn $sql;}
e nos campos de formulario no seu codigo onde você por usar $_POST faça assim

 

$senha = sql_inection ($_POST['atual']);$novasenha = sql_inection ($_POST['nova']);
Seguro? gostaria de uma resposta

 

Consegui invadir veja usei o comando... ' or 1=1--;

 

deu o seguinte erro, para que sabe atacar usando injecta sabe que acho um erro acho o burado ai so mandar ver :)

 

Warning: mssql_query() [function.mssql-query]: message: Unclosed quotation mark before the character string ';'. (severity 15) in D:\PHP\www\vip22\senha.php on line 67Warning: mssql_query() [function.mssql-query]: Query failed in D:\PHP\www\vip22\senha.php on line 67Warning: mssql_num_rows(): supplied argument is not a valid MS SQL-result resource in D:\PHP\www\vip22\senha.php on line 68Sua Senha Atual está incorreta
Issi foi testa em campos de formulario da pra atacar por URL não sei por que se você usar essa função mais for tentar atacar por URL você entra facil veja um exemplo claro nao vo ensinar como se usa

 

logar&login=´&senha&submit=Entrar muitas vezes bloqueia o ` que é o contrario do que coloquei ali atraz ai você acaba passando, pois vai dar um erro de streing ? nao encontrado...

 

Solução para o codigo?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Isso que voce mostrou nao tem nada haver veja por que:

 

' or 1=1--; depois da função : \' or 1=1; num select ficaria:

select * from tabela where campo = '\' or 1=1;' isso nao é nenhum ataque

 

e o ; é um final de execução do sql

 

e o erro que você passou é erro do mysql por nao ter feito um sistema melhor

 

e via url só se seu register_globals tiver em on

 

só peço uma coisa pode postar o que quiser mas para falar que uma coisa ta insegura você precisa ao mesmo saber do que se trata

 

você mesmo parece que nao entende para que serve todos os caracteres do sql , se você usar a função e o sistema bem feito nao tem problema

 

o que nao da é a função agir sozinha o resto do script tbm precisa estar feito corretamente

Compartilhar este post


Link para o post
Compartilhar em outros sites

Fabyo você esta ecvocado quanto ao seu script, já que acha que não tem valor deixe então o pessoal achando que sua função tem segurança...você parecer ler o que ve em tutorial, agora me diga sabe atacar? duvido pois se soubese não teria dito que isso em um select faria isso ou aquilo, você acha que so da pra atacar se usar SELECT, não amigo, passo por invasões todos os dias, trabalho com servidor de JOGOS onde o pessoal fica 24h testando milhares de formas de SQL Injection um erro e ja erra, entram e deletam tudo...não sei programar, mais se fazer um formulario simples usar sua função que não segura nada, tem segredo nisso?agora vem monte de gente achando que esta seguro fala serio...register_globals tiver ON ta muitos e você sabe disso usa register_globals ON não deveria avisa-los? pra ajudar desligue o register_globals pois mesmo usando a função você sera atacado por URLHa sei bem o que estou falando, e se duvida posso fazer um script aprovado por você aqui colocar no online no meu site, e entro e invado usando seu script, agora se acha que realmente esta certo, excluia esse topico, você é bom de mais pra aceitar conselhos pois é um ADM...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Seguro ta sim, mas a pessoa precisa saber programar ne?, você mesmo disse que nao sabe

 

e como quer dicultir um assunto que você desconhece ?

 

e quem falou que eu uso o register_globals em on ?

 

fala serio você, você ta num assunto que nao domina e ainda quer criticar

 

, nao vem aqui falar abobrinha, todos aqui me conhece eu nao sou esse cara que você ta pensando

 

mas se alguem fala besteira eu falo sim, todo mundo sabe que eu sempre fui contra coisas erradas e codigos mal feito

 

agora se quiser discultir isso disculta com logica e nao com palavras sem sentido

Compartilhar este post


Link para o post
Compartilhar em outros sites

Adailton gosto de você de mais por que manda ver :)Eu ja testei essa função ai com varios hacker amigo, sei bem o que estou falando...vamos fazer uma coisa então pra acabar com o assunto e vamos ver se essa função segura alguma coisa...vamos fazer um sisteminha de login para o usuario se logar e mudar sua senha usando essa função ai, vou colocar online no meu site, e vo tentar invadir se eu não conseguir, peço mil disculpas ate de joelho se for preciso aqui...mais se eu conseguir o Fabyo reconheçe que a função não é segura, topas?

Compartilhar este post


Link para o post
Compartilhar em outros sites

sem problemas nenhum, nao to defendendo minha função, to defendendo a ideia , se você fazer um sistema que funciona e sem erros para começar pode postar o link, mas nao adianta nada uma função se o resto do script esta mal feito

 

eu faço um sistema de login para você testar sem usar essa função e duvido que você consiga entrar, nao precisa de função basta ter conhecimento do que esta fazendo e nao falar as coisas porque ouviu e nem sabe do que esta falando

 

eu sempre briguei com isso, nao gosto que as pessoas peguem scripts e saia usando, eu prefiro que ela entenda o script e saiba do que se trata

 

a função esta fazendo o que ela propoe mas você precisa fazer o resto, ela nao faz tudo sozinha

 

precisa ter um banco bem modelado, um sistema de login bem feito e que valide o usuario de forma correta

e uma senha criptografada, agora você vem aqui com uma função mas nem sabe montar o select e ainda da erro de php porque nao soube fazer um script sem erros e ainda quer falar de segurança?

 

= )

 

mas to esperando ai se nao souber fazer o script de login alguem pode fazer pra você

Compartilhar este post


Link para o post
Compartilhar em outros sites

Fabyo OK não vou mais descutir o assunto feche o topico, você é bom de mais pra sair falando que os outros não sabem, você deve saber de tudo né boa sorte com seus super conhecimentos de programador...Minha intenção não foi nunca me chatear no forum e aconteceu, você levo pro lado pessoal não imaginava isso não, você esta claramente afirmando uma coisa que não tem nada haver...você é programador claro se fizer um script bem feito seria quase impossivel invadir, mais isso nao vem ao caso o que vem ao caso é somente sua função nada maiscomo você ensinou a usar ela entende, nada mais so queria que o pessoal soubesse e que você reconhecese que não segura, a função não segura, mais deixa isso pra la...como vc6 ja falaram sou apenas um burro que não sei de nada, você é que sabem de tudo...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bobrinha, voce que ficou auterado e partiu para disculssao, nós estamos num forum e aqui é o lugar certo, mas você tbm tem que ouvir o que as pessoas falam e nao só falar, voce ta falando que uma função sozinha é tudo?, pelo contrario nenhuma função sozinha faz alguma coisa, nao só essas aqui, mas qualquer outra, você precisa do script completo, como sempre falei segurança é ter a logica, imagina você tem uma casa com alarme, cerca eletrica, e tudo mais se você coloca a chave debaixo do tapete?, é a mesma coisa uma função sozinha e aplicada de forma errada ou incompleta deixa o sistema inseguro

 

e sobre a minha função ela esta fazendo o que ela propoe, e se quiser testar montamos um script e te mostramos ela em funcionamento

 

você só tem a perder se você só quer discultir, mas você poderia aprender mais alguma coisa se você parar para escultar e ver o que estamos falando

 

ninguem aqui é melhor ou você é "burro", mas estamos falando do que praticamos, pois aqui no forum temos usuarios comuns, avançados e profissionais, e todos aprendemos e ensinamos, se você para-se para ouvir o que temos para falar você iria dar razao e ver que tava falando besteira

 

mas beleza se prefere chutar o balde se que sabe

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.