Unconfigured Ad Widget

Collapse

Anúncio

Collapse
No announcement yet.

Anti-SQL Injection

Collapse
X
 
  • Filter
  • Tempo
  • Show
Clear All
new posts

  • Font Size
    #1

    Dica Anti-SQL Injection


    Boa noite. Aqui vai um Script Muito bom para Desenvolvedores de Web Sites em PHP

    Eu Invadi um site e encontrei este Script no Site então fica a dica pros Desenvolvedores.
    Pra quem não sabe isso evita o SQL Injection

    Código PHP:
    <?php
    function check_inject()
      {
        
    $badchars = array(";""'""\"""*""DROP""SELECT""UPDATE""DELETE""-""ORDER""GROUP""UNION""AND");
        foreach(
    $_POST as $value)
        {
          if(
    in_array($value$badchars))
          {
            die(
    "SQL Injection Detectado\n<br />\nIP: ".$_SERVER['REMOTE_ADDR']\n Seu Crime Cibernetico foi Reportado.);
    sleep(2);
    header'Location: http://www.usdoj.gov/criminal/cybercrime/reporting.htm' );
          else
          {
    $check preg_split("//"$value, -1PREG_SPLIT_OFFSET_CAPTURE);
       foreach(
    $check as $char)
            {
              if(
    in_array($char$badchars))
            {
                die(
    "SQL Injection Detectado!\n<br />\nIP: ".$_SERVER['REMOTE_ADDR']\n Seu Crime Cibernetico foi Reportado.);
    sleep(2);
    header'Location: http://www.usdoj.gov/criminal/cybercrime/reporting.htm' );
    ?>
    Se vocês analisarem verão que funciona como uma espécie de BlackList

    Código:
    "ORDER", "GROUP", "UNION", "AND","'","Select"
    vocês poderam Adicionar Strings para que evite outros tipos de Injeção como alguns métodos de WAF Bypassing entre outros..

    Enjoy~


    O Único modo de Evitar Erros é Adquirindo Experiência. No Entando a única Maneira de Adquirir Experiência é cometendo Erros.
    Napoleão Bonaparti
    sigpic




    Skype: JoasRock
    Similar Threads

  • Font Size
    #2
    Sem exageros, esse sem dúvida é um script PHP da pior qualidade.
    Não faz muito sentido nem vai te proteger de nada.Serve de exemplo do que não fazer.


    Não vai nem rodar sem corrigir os erros de sintaxe.
    A função não vai de fato reportar o ataque e só vai checar injeções por um método HTTP, o POST, quando existem outros como o GET (dados fornecidos por URL, por exemplo) o PUT, o HEAD e outras formas de fornecer dados, como por cookies.
    A chamada as funções sleep e header nunca vão ser atingidas, já que a chamada ao die finaliza o script antes disso (age como um echo "algo";exit(0); ).
    No primeiro foreach ele checa se os dados fornecidos pelo método POST (por formulários, por exemplo) estão contidos no array de badwords.O problema é que o in_array vai fazer isso a partir de testes de igualdade entre cada elemento, i.e, se um dos elementos do array for igual ao elemento "buscado", ele vai retornar true, senão false.
    Ou seja, esse primeiro teste só vai bloquear injeções que contenham únicamente a badword.
    No segundo foreach ele faz a mesma checagem, teóricamente para cada caracter.Veja bem que nessa situação só as badwords de um único caracter seriam de fato checadas, já que um caracter nunca vai ser igual a uma palavra.Mas nem isso é o que de fato acontece, o preg_split com o parametro PREG_SPLIT_OFFSET_CAPTURE retorna uma matriz (i.e, array de arrays) sendo cada elemento um vetor (i.e, array) e é isso que é comparado com a badword (uma string) e essa comparação nunca vai retornar verdadeiro.
    Mesmo que esse teste especifico de badwords funcionasse, ele seria extremamente restritivo bloqueando o uso de caracteres e palavras em usos legitimos, como uma citação (i.e, "O homem que amava cabras" - José Valdo).Esses testes devem vir acompanhados de contexto (mesmo que minimo) e existem outros bloqueios como testar e forçar tipos de parametros fornecidos (como no caso dos inteiros e um cast (i.e, (int)$_POST['algo']) para o mesmo) e mudar a representação dos caracteres para uma não conflitante com a query SQL (no MySQL e alguns outros DBs, escapar o caracter de aspas simples ou transformar qualquer parametro na sua representação hexadecimal (o dobro de espaço na representação de cada string, deselegante)).

    Comment


    • Font Size
      #3
      Uma boa configuração no .htaccess e php.ini poderiam bloquear esses caracteres como por exemplo essas:

      magic_quotes_gpc
      magic_quotes_runtime
      magic_quotes_sybase
      allow_url_fopen
      display_errors
      allow_url_include
      expose_php
      register_globals
      De qualquer forma obrigado.

      Comment


      • Font Size
        #4
        Não sn3fa, só o magic_quotes que vai escapar a aspa simples.
        Ainda assim haveriam outros vetores de injeção, como uma query que não utiliza esse delimitador (pra um inteiro, por exemplo) ou um banco de dados que não o faz.
        E não é uma boa usar o magic_quotes, o uso sempre foi descreditado e ele foi removido no PHP 5.4 além de ter sido deprecated no 5.3.

        Comment


        • Font Size
          #5
          Postado Originalmente por singur Ver Post
          Sem exageros, esse sem dúvida é um script PHP da pior qualidade.
          Não faz muito sentido nem vai te proteger de nada.Serve de exemplo do que não fazer.


          Não vai nem rodar sem corrigir os erros de sintaxe.
          A função não vai de fato reportar o ataque e só vai checar injeções por um método HTTP, o POST, quando existem outros como o GET (dados fornecidos por URL, por exemplo) o PUT, o HEAD e outras formas de fornecer dados, como por cookies.
          A chamada as funções sleep e header nunca vão ser atingidas, já que a chamada ao die finaliza o script antes disso (age como um echo "algo";exit(0); ).
          No primeiro foreach ele checa se os dados fornecidos pelo método POST (por formulários, por exemplo) estão contidos no array de badwords.O problema é que o in_array vai fazer isso a partir de testes de igualdade entre cada elemento, i.e, se um dos elementos do array for igual ao elemento "buscado", ele vai retornar true, senão false.
          Ou seja, esse primeiro teste só vai bloquear injeções que contenham únicamente a badword.
          No segundo foreach ele faz a mesma checagem, teóricamente para cada caracter.Veja bem que nessa situação só as badwords de um único caracter seriam de fato checadas, já que um caracter nunca vai ser igual a uma palavra.Mas nem isso é o que de fato acontece, o preg_split com o parametro PREG_SPLIT_OFFSET_CAPTURE retorna uma matriz (i.e, array de arrays) sendo cada elemento um vetor (i.e, array) e é isso que é comparado com a badword (uma string) e essa comparação nunca vai retornar verdadeiro.
          Mesmo que esse teste especifico de badwords funcionasse, ele seria extremamente restritivo bloqueando o uso de caracteres e palavras em usos legitimos, como uma citação (i.e, "O homem que amava cabras" - José Valdo).Esses testes devem vir acompanhados de contexto (mesmo que minimo) e existem outros bloqueios como testar e forçar tipos de parametros fornecidos (como no caso dos inteiros e um cast (i.e, (int)$_POST['algo']) para o mesmo) e mudar a representação dos caracteres para uma não conflitante com a query SQL (no MySQL e alguns outros DBs, escapar o caracter de aspas simples ou transformar qualquer parametro na sua representação hexadecimal (o dobro de espaço na representação de cada string, deselegante)).
          Nossa Senhora do Jesus Amado... mas você gosta de Criticar hein... não vejo nada seus Tópicos ou Posts de Ajuda só vejo Criticas e Reclamações...

          E outra eu não sei se você leu o Tópico, ou se fez de que não sabe.

          eu mencionei que ele "EVITA" os Ataques contra SQL Injection.
          E não tira a Falha da Vulnerabilidade.

          E o Script sendo de boa qualidade ou não, eu apenas estou tentando ajudar os que precisam.
          quero ver se tem algum Post ou Tópico no Forum, que fala sobre isso ou mostra pelo menos mais conteúdo do que o Meu.

          na próxima vez leia com atenção por favor..


          O Único modo de Evitar Erros é Adquirindo Experiência. No Entando a única Maneira de Adquirir Experiência é cometendo Erros.
          Napoleão Bonaparti
          sigpic




          Skype: JoasRock

          Comment


          • Font Size
            #6
            caralho

            criticar é uma coisa, agora falar que isso não vai resolver já é falta de conhecimento. O script apenas aplica uma mensagem e assusta o "atacante", querer tampar essa vulnerabilidade por completo teríamos q criar um outro post!



            Comment


            • Font Size
              #7
              Postado Originalmente por Agares Ver Post
              Nossa Senhora do Jesus Amado... mas você gosta de Criticar hein... não vejo nada seus Tópicos ou Posts de Ajuda só vejo Criticas e Reclamações...

              E outra eu não sei se você leu o Tópico, ou se fez de que não sabe.

              eu mencionei que ele "EVITA" os Ataques contra SQL Injection.
              E não tira a Falha da Vulnerabilidade.

              E o Script sendo de boa qualidade ou não, eu apenas estou tentando ajudar os que precisam.
              quero ver se tem algum Post ou Tópico no Forum, que fala sobre isso ou mostra pelo menos mais conteúdo do que o Meu.

              na próxima vez leia com atenção por favor..

              apenas foi citado q ao invés de quebrar com essa vulnerabilidade ele simplesmente evita o ataque assuntado o atacante, simples!!

              Comment


              • Font Size
                #8
                Pra ficar mais claro, depois de corrigir os erros de sintaxe (repito: senão nem roda), faz o teste:
                Código:
                <?php
                $_POST = array(" ' UNION SELECT algo;--", "DROP DATABASE exemplo"); //e outros
                check_inject();
                ?>
                Ele não vai detectar nada, simplesmente porque sua checagem nem funciona.
                Meu primeiro post explicita e aprofunda isso e outras coisas.
                Vou ignorar seu comentário estúpido e o fato de sequer ter entendido meu comentário (falta conhecimento).

                Comment


                • Font Size
                  #9
                  Observação: a função check_inject ou um arquivo que a contenha deve ser incluido no exemplo anterior.Isso é bem óbvio, explicito pra evitar posteriores comentários errôneos.
                  Last edited by NullS3c; 13-12-2013, 13:50. Motivo: remoção de palavras possivelmente ofencivas

                  Comment


                  • Font Size
                    #10
                    Postado Originalmente por singur Ver Post
                    Não sn3fa, só o magic_quotes que vai escapar a aspa simples.
                    Ainda assim haveriam outros vetores de injeção, como uma query que não utiliza esse delimitador (pra um inteiro, por exemplo) ou um banco de dados que não o faz.
                    E não é uma boa usar o magic_quotes, o uso sempre foi descreditado e ele foi removido no PHP 5.4 além de ter sido deprecated no 5.3.
                    Estava me referindo ao código e inclui alguns outros que auxiliariam, o código pode ser vulnerável mas não explorável (sim pode ser explorável por outras maneiras da mesma técnica, mas não em referência ao código que ele postou).

                    Comment


                    • Font Size
                      #11
                      Será que nimguem entendeu que o script não vai exibir essa mensagem porque ele nunca vai chegar a detectar nada?
                      Podem por favor reler meus comentários e estudar um pouco de PHP?

                      Comment


                      • Font Size
                        #12
                        Código:
                        <?php
                        $db = "percona";
                        $table = "whitelist";
                        $table_exception = "whitelist_exception";
                        
                        $user="noinject";
                        $pass="injectno";
                        $host="127.0.0.1";
                        
                        // DO NOT MODIFY BELOW HERE
                        $fqtn = $db . "." . $table;
                        $fqten = $db . "." . $table_exception;
                        $conn = mysqli_connect($host, $user, $pass);
                        
                        if(!$conn) {
                        	throw new Exception('Could not connect to database');
                        }
                        
                        $whitelist_sql = "select *, conv(checksum, 10, 16) hex_checksum from $fqtn where 1=1";
                        $count_sql = "select count(*) from $fqtn where 1=1";
                        
                        $checksum="";
                        $sample="";
                        
                        /* default order by */
                        $order_by = "last_seen";
                        $dir = "desc";
                        
                        $page = 1;
                        $page_by = 20;
                        if(!empty($_REQUEST)) {
                        
                        	if(!empty($_REQUEST['deny'])) {
                        		foreach($_REQUEST['deny'] as $k => $v) {
                        			if(!is_numeric($v)) unset($_REQUEST['deny'][$k]);
                        		}
                        		$sql = "UPDATE $fqtn SET reviewed_on = now(), comments=CONCAT('Set to deny: ', now()), reviewed_by = 'deny' WHERE reviewed_by != 'deny' and checksum IN (" . join(",", $_REQUEST['deny']) . ")";
                        		$stmt = mysqli_query($conn, $sql);
                        		if(!$stmt) throw new Exception("Could not update!");
                        	}
                        	if(!empty($_REQUEST['allow'])) {
                        		foreach($_REQUEST['allow'] as $k => $v) {
                        			if(!is_numeric($v)) unset($_REQUEST['allow'][$k]);
                        		}
                        		$sql = "UPDATE $fqtn SET reviewed_on = now(), comments=CONCAT('Set to allow: ', now()), reviewed_by = 'allow' WHERE reviewed_by != 'allow' and checksum IN (" . join(",", $_REQUEST['allow']) . ")";
                        		$stmt = mysqli_query($conn, $sql);
                        		if(!$stmt) throw new Exception("Could not update!");
                        	}
                        
                        	/* escape the string fields properly */
                        	if(!empty($_REQUEST['checksum'])) {
                        		$whitelist_sql .= " AND checksum like '%" . mysqli_real_escape_string($conn, $_REQUEST['checksum']) . "%'";
                        		$count_sql .= " AND checksum like '%" . mysqli_real_escape_string($conn, $_REQUEST['checksum']) . "%'";
                        		$checksum = $_REQUEST['checksum'];	
                        	}
                        	if(!empty($_REQUEST['sample'])) { 
                        		$whitelist_sql .= " AND sample like '%" . mysqli_real_escape_string($conn, $_REQUEST['sample']) . "%'";
                        		$count_sql .= " AND sample like '%" . mysqli_real_escape_string($conn, $_REQUEST['sample']) . "%'";
                        		$sample = $_REQUEST['sample'];
                        	}
                        
                        	/*whitelist the order by*/
                        	if(!empty($_REQUEST['order_by'])) {
                        		switch($_REQUEST['order_by']) {
                        			case 'last_seen':
                        			case 'first_seen':
                        			case 'reviewed_on':
                        			case 'checksum':
                        				$order_by = $_REQUEST['order_by'];
                        		}
                        	}
                        
                        	/* whitelist the order by */
                        	if(!empty($_REQUEST['dir'])) {
                        		if(strtolower($_REQUEST['dir'][0]) == 'a') {
                        			$dir = 'asc';
                        		}
                        	}
                        
                        	/* Check numeric data types before interpolation */
                        	if(!empty($_REQUEST['page_by'])) {
                        		if(is_numeric($_REQUEST['page_by'])) {
                        			$page_by = $_REQUEST['page_by'];
                        		}
                        	}
                        
                        	if(!empty($_REQUEST['page'])) {
                        		if(is_numeric($_REQUEST['page'])) {
                        			$page = $_REQUEST['page'];
                        		}
                        	}
                        
                        }
                        
                        $whitelist_sql .= " order by $order_by $dir";
                        
                        $offset = ($page - 1) * $page_by;
                        $whitelist_sql .= " LIMIT $offset, $page_by";
                        
                        $stmt = mysqli_query($conn, $whitelist_sql);
                        if(!$stmt) throw new Exception('Could not get list of queries from database');
                        while($row = mysqli_fetch_assoc($stmt)) {
                        	$rows[] = $row;
                        }
                        $stmt = mysqli_query($conn, $count_sql);
                        $count = mysqli_fetch_array($stmt);
                        $count = $count[0];
                        if($page_by >= 0) {
                        	$pages = $count / $page_by;
                        	unset($_REQUEST['page_by']);
                        	for($i=0;$i<$pages;++$i) {
                        		$linklist = "<a href='" . make_request(array('page' => ( $i + 1 ) )) . "'>" . ($i + 1) . "</a> "; 	
                        	}
                        }
                        
                        function make_request($add) {
                        	$r = "";
                        	foreach($_REQUEST as $k => $v) {
                        		if($r) $r .= '&';
                        		$r .= urlencode($k) . "=" . urlencode($v);	
                        	}
                        	foreach($add as $k => $v) {
                        		if($r) $r .= '&';
                        		$r .= urlencode($k) . "=" . urlencode($v);	
                        	}
                        	return "?$r";
                        }
                        ?>
                        <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
                           "http://www.w3.org/TR/html4/strict.dtd">
                        <HTML>
                        <head>
                        <title>NOINJECT! - Whitelist Interface 1.0</title>
                        <script>
                        function clickCheck(mode, checksum) {
                        	if(mode == "deny") {
                        		var el = document.getElementById("deny_" + checksum);
                        		var el2 = document.getElementById("allow_" + checksum);
                        	} else {
                        		var el = document.getElementById("allow_" + checksum);
                        		var el2 = document.getElementById("deny_" + checksum);
                        	} 
                        	el2.checked = !el.checked;
                        }
                        </script>
                        </head>
                        <body>
                        <table border=0 width="100%"><tr><td width=33% valign='bottom'>
                        <font color="#005500" size=+5 face="Times New Roman">NOINJECT!</font><br>
                        <a href="exceptions.php">See security exceptions</a>
                        </td><td valign='top'>
                        <img src="small.jpg" height=200 align=right>
                        </td></tr></table>
                        <form method="post" action="index.php" id='frm'>
                        <p>
                        <h4>Search<hr></h4>checksum: <input type="text" name="checksum" value="<?php echo $checksum;?>">&nbsp; sample: <input type="text" name="sample" value="<?php echo $sample;?>"><br>
                        Order by:<select name="order_by">
                        <option value="first_seen" <?php if($order_by == "first_seen") echo "selected";?>>First Seen</option>
                        <option value="last_seen" <?php if($order_by == "last_seen") echo "selected";?>>Last Seen</option>
                        <option value="reviewed_on" <?php if($order_by == "reviewed_on") echo "selected";?>>Last Updated</option>
                        </select>
                        Direction: <select name="dir">
                        <option value="a" <?php if ($dir=='asc') echo 'selected';?>>Asc</option>
                        <option value="d" <?php if ($dir=="desc") echo "selected"; ?>>Desc</option>
                        </select><p><input type="submit" value="Search"><br>
                        <h3>Whitelist
                        <hr>
                        </h3>
                        </form>
                        <form method="post" action="index.php" id='frm'>
                        <input type="submit" value="Update whitelist">
                        <?php
                        echo("<br>Page: " . $linklist . "<br>");
                        ?>
                        <p>
                        <table border=3 width="100%" cellspacing=15 cellpadding=10>
                        <tr><th>Deny<th>Allow<th>Info<th>Sample</tr>
                        <?php
                        foreach($rows as $row) {
                        	echo "<tr>";
                        	echo "<td valign='center' align='center'>";
                        	echo "<img src='deny.png' height='60px' onclick=\"el = document.getElementById('deny_' + '{$row['checksum']}'); el.checked=true;clickCheck('deny','{$row['checksum']}');\">";
                        	$checked = "";
                        	if($row['reviewed_by'] !== 'allow') $checked = "checked";
                        	echo "<input name='deny[]' onchange=\"clickCheck('deny','{$row['checksum']}')\" id='deny_{$row['checksum']}' type='checkbox' value='{$row['checksum']}' $checked>";
                        	echo "</div>";
                        	echo "<td valign='center' align='center'><img onclick=\"el = document.getElementById('allow_' + '{$row['checksum']}'); el.checked=true;clickCheck('allow','{$row['checksum']}');\" height='60px' src='allow.png'>";
                        	$checked = "";
                        	if($row['reviewed_by'] === 'allow') $checked = "checked";
                        	echo "<input name='allow[]' onchange=\"clickCheck('allow','{$row['checksum']}')\" id='allow_{$row['checksum']}' type='checkbox' value='{$row['checksum']}' $checked>";
                        	echo "</td><td valign='center'>";
                        	echo "Checksum:&nbsp;" . $row['hex_checksum']  . "<br>";
                        	echo "First_seen:&nbsp;" . $row['first_seen']  . "<br>";
                        	echo "Last_seen:&nbsp;" . $row['last_seen']  . "<br>";
                        	echo "Note:&nbsp;<font color=red>" . $row['comments'] . "</font>";
                        	echo "</td>";
                        	echo "<td valign='top'><table cellpadding=0><tr><td><textarea cols=80 rows=6>{$row['sample']}</textarea></td></tr></table></td>";
                        	echo "</tr>";
                        }
                        ?>
                        </table>
                        <p>
                        <input type="submit" value="Update whitelist">
                        <?php
                        echo("<br>Page: " . $linklist . "<br>");
                        ?>
                        </form>
                        </body>
                        </html>

                        Podem verificar ai > Apenas usuários registrados e ativados podem ver os links., Clique aqui para se cadastrar...
                        Yes, I am a criminal. My crime is that of curiosity. My crime is
                        that of judging people by what they say and think, not what they look like.
                        My crime is that of outsmarting you, something that you will never forgive me
                        for.

                        I am a hacker, and this is my manifesto. You may stop this individual,
                        but you can't stop us all... after all, we're all alike.

                        Comment


                        • Font Size
                          #13
                          Postado Originalmente por singur Ver Post
                          Será que nimguem entendeu que o script não vai exibir essa mensagem porque ele nunca vai chegar a detectar nada?
                          Podem por favor reler meus comentários e estudar um pouco de PHP?
                          Não posso falar por todos mas eu vi isso a primeira vez que vi o código (e olha que não sou programador e nem da área de tecnologia, longe disso). A questão é que vc está discutindo como foi programado e eu pelomenos não entrei nesse assunto, é mesma coisa que vc achar um exploit com um erro de programação de propósito e criticar o autor por isso (não que seja esse o caso aqui).

                          Comment


                          • Font Size
                            #14
                            Nossa.

                            Postado Originalmente por singur Ver Post
                            Será que nimguem entendeu que o script não vai exibir essa mensagem porque ele nunca vai chegar a detectar nada?
                            Podem por favor reler meus comentários e estudar um pouco de PHP?

                            Velho parei.... vou mais ficar batendo cabeça com isso não!!!
                            Cara se o Script que eu postei ta "Errado" porque você que é o "Fodão" entende de Tudo e alias é "programador" porque Não Concerta o Script ? e posta novamente no msm Thead ?

                            Você tem, um grande Egocentrismo... e outra

                            PARA DE TA FLOODANDO MINHA CAIXA DE MENSAGENS PRIVADAS OK ?



                            Será que você é tão FAN assim ? já tem 15 mensagens suas ou mais só provando que é meu fan...

                            Quem foi que te deu TAG de programador ? ainda não vi um projeto seu sobre programação

                            VOCÊ SÓ SABE ^^


                            O Único modo de Evitar Erros é Adquirindo Experiência. No Entando a única Maneira de Adquirir Experiência é cometendo Erros.
                            Napoleão Bonaparti
                            sigpic




                            Skype: JoasRock

                            Comment


                            • Font Size
                              #15
                              Mais de 15?Eu contei 4, mas talvez sua matemática seja melhor que o resto...

                              Comment

                              X
                              Working...
                              X