Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Olá pessoal, então estou criando um segundo topico, pois tenho uma outra duvida, eu estava usando sqlmap para tentar invadir meu priprio site, e tentar achar vulnerabilidades, não consegui das formas que eu sei, então passei para outra etapa e usei o acunetix para verificar as vulnerabilidades do meu php, no meu site de verdade, ele não encontra vulnerabilidade de SQL Injection (a unica que quero tratar neste topico), encontra outra, (CSRF), até ai tudo bem, o problema começa quando eu rodo o acunetix no sistema que está no meu
localhost(no meu computador), ele acha inumeras vulnerabilidades, e 2 arquivos com vulnerabilidades de sql Injection, ele acha de uma forma tão pesada, que deleta o meu banco de dados, e as vezes ele inseri outros bancos de dados ao lado do meu, e torna meu sistema impossível de se conectar com o banco.
lembrando que o mesmo sistema do site, é o mesmo do meu servidor local(computador)
dados servidor do site, (IIS 7.5, mysql 5...) apache não me lembro bem, PHP 7.0.9 Orientado a Objetos com PDO
dados do servidor local (xampp mais atual) PHP 7.0.9 Orientado a Objetos com PDO
como ele acha a vulnerabilidade na index onde se faz o login, vou apresentar para vocês o codigo da index, apenas o php, e o formulario
nota-se que eu uso alguns métodos próprios para fazer verificação da entrada, e alguns nativos do php,
verificação para login
IF(ISSET($_POST['logar'])){
$nome = filter_input(INPUT_POST, 'nome' ,FILTER_SANITIZE_STRING ,FILTER_FLAG_ENCODE_AMP);
$senha = filter_input(INPUT_POST, 'senha',FILTER_SANITIZE_STRING ,FILTER_FLAG_ENCODE_AMP);
$nome = trim($nome);
$nome = limpar_stringl($nome);
$nome = addslashes($nome);
$nome = strip_tags($nome, '');
$senha = trim($senha);
$senha = limpar_stringl($senha);
$senha = addslashes($senha);
$senha = strip_tags($senha, '');
IF ($nome == "" || $senha == ""){
$errors .= "✖ Campos vasios!<br>";
}ELSE IF($nome != "" && $senha != ""){
$userPDo = new UsuarioPdo();
$dados = $userPDo->estou_banido($nome);
if($dados == TRUE){
$sessao = new Sessao();
$sessao->banSessao();
}else{
$_username = $nome;
$header = new HeaderPdo();
$_password = $header->criptografia_Hash_MD5($senha);
$usuario = new Usuario($_username, $_password);
$tentativa = new UsuarioPdo();
$logou = $tentativa->fazer_login($usuario, $_password);
IF($logou == TRUE){
$sessao = new Sessao();
$sessao->carregaSessao($logou);
}else{
$errors .="✖ Dados invalidos!";
}
}
}
}
Função utilizada no login $nome = limpar_stringl($nome);
function limpar_stringl($string){ // replace para limpar variaveis
$string = str_replace(' ','', $string);
$string = str_replace('(','', $string);
$string = str_replace(')','', $string);
$string = str_replace('[','', $string);
$string = str_replace(']','', $string);
$string = str_replace('{','', $string);
$string = str_replace('}','', $string);
$string = str_replace('&','', $string);
$string = str_replace('/','', $string);
$string = str_replace('\\','', $string);
$string = str_replace('?','', $string);
$string = str_replace('*','', $string);
$string = str_replace('+','', $string);
$string = str_replace('"','', $string);
$string = str_replace("'",'', $string);
$string = str_replace("Ç",'', $string);
$string = str_replace("ç",'', $string);
return $string;
}
formulario html
<form method="POST" action="">
<table>
<tr>
<td colspan="2"><h1 style="margin-bottom: 25px;">▾ Fazer Login</h1></td>
</tr>
<tr>
<td><div style="
border-top-left-radius: 3px; border-bottom-left-radius: 3px;
margin-left: 20px; width:40px; height:40px; background: white;">
<img class="icon_login"src="imagens/icons/index/user.png" alt=""/></div></td>
<td><input class="campo_texto" name="nome" min="4" max="15" placeholder="Usuário" type="text"></td>
</tr>
<tr>
<td><div style="
border-top-left-radius: 3px; border-bottom-left-radius: 3px;
margin-left: 20px; width:40px; height:40px; background: white;">
<img class="icon_login" src="imagens/icons/index/password.png" alt=""/></div></td>
<td><input class="campo_texto" name="senha" min="1" max="15" placeholder="************" type="password"></td>
</tr>
<tr>
<td colspan="2"><input class="campo_btn" type="submit" name="logar" value="➲ Confirmar Login"</td>
</tr>
<tr>
<td colspan="2">
<p class="resposta">
<i class="fa fa-check-circle" aria-hidden="true"></i> Ao fazer login no <?php echo NOMEHOTEL ?>, você concorda com todas as regras e termos de uso.
</p>
</td>
</tr>
</table>
<p style="color:red; font-family: verdana; font-weight: bold; padding-left: 20px; padding-top: 30px;"><?php echo $errors; ?></p>
</form>
aqui um pedaço da função de login do php com PDO
public function fazer_login($usuario){
try{
$nome = $usuario->get_username();
$senha = $usuario->get_password();
$query = "SELECT * FROM users WHERE username = :nome AND password = :senha";
$this->Select = $this->Conn->prepare($query);
$this->Select->bindParam(':nome', $nome, PDO::PARAM_STR);
$this->Select->bindParam(':senha', $senha, PDO::PARAM_STR);
$this->Select->execute();
if($this->Select->rowCount() == 1){
$dados = $this->Select->fetch(PDO::FETCH_ASSOC);
return $dados;
}
} catch (PDOException $ex) {
exibeMensagens($Msg, $ErrNo);
}
}
eu não consigo entender, como ele consegue invadir com SQL injection e deletar meu banco de dados???
Eu tinha pesquisado na internet, e achei uns scripts bem parecido com esse que você mencionou, porem quando eu tornei a usar o acunetix acusou mais de 400 falhas de CSRF, vou testar com esse que você me indicou, e já reposto.
Tem certeza de que é essa página de login mesmo onde está o problema com SQL Injection? Não pode ser uma outra página do seu sistema, ou ainda algum outro sistema que está em seu computador?
Pelo código, só acho desnecessário toda essa "limpeza"/conversão que você faz em $nome e $senha (isto é se essa limpeza for para prevenir SQL Injection)... veja que até espaço e * você remove da senha. Contanto que você continue utilizando query parametrizada (bindParam) e não adicione variáveis diretamente na consulta, estas duas variáveis não deverá gerar esse problema...
Dê uma olhada nas recomendações do OWASP quanto à esta questão:
https://www.owasp.org/index.php/SQL_Injection_Prevention_Cheat_Sheet
Você está implementando a opção "Prepared Statements (with Parameterized Queries)" e também a opção "Escaping All User Supplied Input", quando apenas a query parametrizada, feita da forma correta, é o suficiente.
E oque CSRF tem haver com SQL Injection?
Uma coisa não tem nada haver com a outra.
Apesar que o script tem problemas com o excesso de Validações, misturar as coisas acaba confundindo ainda mais.
Acho que na correria acabei lendo/entendendo errado a questão dele então... achei que ele queria tratar à respeito de SQL Injection (pelas frases abaixo).
Me desculpe se a mensagem foi indevida.
Abraço
>
ele não encontra vulnerabilidade de SQL Injection (a unica que quero tratar neste topico),
....
e 2 arquivos com vulnerabilidades de sql Injection, ele acha de uma forma tão pesada, que deleta o meu banco de dados, e as vezes ele inseri outros bancos de dados ao lado do meu, e torna meu sistema impossível de se conectar com o banco.
E oque CSRF tem haver com SQL Injection?
Uma coisa não tem nada haver com a outra.
Apesar que o script tem problemas com o excesso de Validações, misturar as coisas acaba confundindo ainda mais.
neste topico não trato de csrf, apenas de sql injection, só mencionei que tambem da como vulnerabilidade.
>
Tem certeza de que é essa página de login mesmo onde está o problema com SQL Injection? Não pode ser uma outra página do seu sistema, ou ainda algum outro sistema que está em seu computador?
Pelo código, só acho desnecessário toda essa "limpeza"/conversão que você faz em $nome e $senha (isto é se essa limpeza for para prevenir SQL Injection)... veja que até espaço e * você remove da senha. Contanto que você continue utilizando query parametrizada (bindParam) e não adicione variáveis diretamente na consulta, estas duas variáveis não deverá gerar esse problema...
Dê uma olhada nas recomendações do OWASP quanto à esta questão:
https://www.owasp.org/index.php/SQL_Injection_Prevention_Cheat_Sheet
Você está implementando a opção "Prepared Statements (with Parameterized Queries)" e também a opção "Escaping All User Supplied Input", quando apenas a query parametrizada, feita da forma correta, é o suficiente.
com relação a limpeza, é para evitar nomes com alguns caracteres.
o problema estava no phpmyadmin, quando retirei ele do diretório raiz htdocs acabou o problema.
o problema estava no phpmyadmin, quando retirei ele do diretório raiz htdocs acabou o problema.
Ah sim, então está explicado. Porque pelo código que você tinha exibido não era para ter problemas com isso mesmo ^^
Add o Script contra CSRF e teste
https://www.owasp.org/index.php/PHP_CSRF_Guard