Segurança Informação Tecnologia Total Security Hackers Proteção Vigilância Notícias

Publicidade
   
  • Total Security - O Seu Portal em Segurança da Informação e Tecnologia

  • Bom dia, Quinta, 09 de Setembro de 2010 
 
   
Newsletter





Ex.: 15/05/1980
Apenas números









 



Enviar para Amigo         0 comentário(s) (0)     Aumentar Texto   Diminuir Texto  
Bugs
03/02/2010 | 00h12m

Publique! CMS tem vulnerabilidade de SQL Injection


Uma vulnerabilidade explorável remotamente foi encontrada no componente central do framework. A exploração deste bug não necessita de autenticação e mostrará informações potencialmente confidenciais do banco de dados do Publique!. Particularmente, um atacante pode extrair nomes de usuários e senhas necessárias para autenticar na interface administrativa e ganhar controle completo do site e (dependendo de certas condições) do próprio servidor.

Sistemas vulneráveis:
 * Publique! versão 2.3 e anteriores

O sistema Publique! referencia cada página com um ID específico ("sid") que o frameword usa na maioria das URLs. Por exemplo, para acessar a página referida pelo ID = 1, a seguinte URL é usada:

http://your_website.com/publique/cgi/cgilua.exe/sys/start.htm?sid=1

Verificou-se que Publique! não valida corretamente o "valor do parâmetro sid" e faz com que essa entrada seja interpretada como um comando SQL inves de dados comuns.

O seguinte erro é exibido quando uma simples aspas é adicionada depois do valor original (sid=1'):


Content-type: text/html
CGILua message
Lua error on configuration (or extension)

Error: unexpected type to index table
Active Stack:
function _ERRORMESSAGE at C code
function _initStart at
//S/Publique/work/carregal/sys/reader/start.lua
main of //S/Publique/work/carregal/sys/reader/start.lua
function old_dofile at C code
function dofile at
//S/Publique/work/carregal/cgi/cgilua/cgilua.conf/pos_env.lua
main of string " write("") dofile(ReaderDir.."start.bin")
write("\n") det", 2
function dostring at C code
function: 0042E0D0 at
//S/Publique/work/carregal/cgi/cgilua/cgilua.conf/preprocess.lua
function: 0042A8C8 at
//S/Publique/work/carregal/cgi/cgilua/cgilua.conf/preprocess.lua
function: 0035CE60 at
//S/Publique/work/carregal/cgi/cgilua/cgilua.conf/cgilua.lua
function: 0035D650 at
//S/Publique/work/carregal/cgi/cgilua/cgilua.conf/cgilua.lua
main of //S/Publique/work/carregal/cgi/cgilua/cgilua.conf/cgilua.lua

CGILua 3.2.1 CGI 1995-99.

Após vários testes, parece que o framework executa duas consultas SQL em seqüência e o erro é emitido pela primeira consulta. É pouco provável que a falha poderia ser explorada através de métodos convencionais. No entanto, é possível extrair informações do banco de dados usando o Time-Based Blind SQL Injection.

Basicamente, este consiste na utilização de alguma operação SQL de tempo-de-resposta (por exemplo, a função interna do mySQL BENCHMARK()) que vai atrasar as respostas do servidor se a condição específica for satisfeita. Ao monitorar o tempo de resposta, é possível saber se a expressão condicional é verdadeira ou falsa.

Usando esta técnica, é possível extrair os nomes de usuários e senhas necessárias para se autenticar na interface de gerenciamento do Publique!. Informações de banco de dados podem ser recuperadas por meio de testes do valor ASCII de cada caractere retornado pela consulta injetada.

O exemplo a seguir mostra como pode ser utilizado para extrair o valor ASCII do primeiro caractere retornado pela consulta:

http://your_website.com/publique/cgi/cgilua.exe/sys/start.htm?sid=1))+UNION+ALL
+SELECT+IF((ASCII(SUBSTRING((SELECT+CONCAT(F_Login,':',F_Password)+FROM
+Publique.T_Actor+LIMIT+1+OFFSET+0),1,1))>97),BENCHMARK(1000000,MD5('A')),0)%23

Essa consulta primeiro junta os campos "F_Login" e "F_Password" da tabela interna "T_Actor" e retorna a primeira linha (graças à "LIMIT 1 OFFSET 0"). Então, ele verifica se o valor ASCII do primeiro caractere retornado é maior do que 97 (a letra 'a'). Se a condição for satisfeita então irá acionar a função BENCHMARK, causando um atraso significativo na resposta do servidor (cerca de 4 segundos, usando o nosso laboratório de testes). Ao repetir a consulta com valores diferentes para comparar, é possível recuperar o valor exato do primeiro caractere. A seqüência completa pode ser extraída para reproduzir o processo para cada caractere.

Embora a senha seja criptografada, é possível descobrir isso. Após uma investigação mais aprofundada e usando engenharia reversa no binário pré-compilado do Lua do Framework Publique!, parece que o algoritmo de criptografia usado é reversível (isto é, não é uma função de hash).

Basicamente, antes de armazenar as senhas no banco de dados, o framework os criptografa com duas funções embutidas no CGILua [4]: "crypt()" e "encode()". Desde que a chave usada pelo algoritmo de criptografia é codificados no binário do Publique!, é possível recuperar a senha normal a partir da cifra usando as duas seguintes funções embutidas: "decrypt()" e "decode()".

Essas credenciais simples poderiam ser usadas para entrar no admin do Publique!, habilitando a funcionalidade de upload do framework e, eventualmente, permitir a um atacante instalar um código malicioso no servidor, por exemplo.



Traduzido por Marcelo Gomes
Fonte: Securiteam





Comentários   |   0 comentário(s)

Comentário - Deixe seu comentário.