Caso real de um hacking usando método rename() do PHP.

Na semana passada, nós mostramos em dois posts como podemos usar o rename para criar problemas para o sistema e como se proteger. Você pode ver nos links abaixo.

Hacking usando PHP rename() method.

Como pode ser proteger dos problemas causados pelo rename().

Ok, agora nós vamos ver um caso real de muitos

O sistema é um plugin WordPress com o nome de SP Project & Document Manager, com mais de 3k de downloads ativos. O projeto Safe Code Developers enviou o problema e o dono do plugin corrigiu rapidamente.

Observação a ser feita é que o problema não é grave, visto que você precisa de alto nível para efetuar o hacking.

Veja esse vídeo e vamos explicar melhor depois.

Esse sistema é responsável por gerenciar versões e controles de downloads de arquivos.

Obs: I sei que nos temos muitos problemas até chegar no método rename(), mas vamos focar no rename().

Quais os passos?

Primeiro, nós fazemos um upload de arquivos para sobre escrever como um arquivo .htaccess, imagens da página principal por exemplo, mas agora é apenas fazer o upload para pasta padrão.

Nesse caso nós usamos index.htm porque em muitos servidores o index.html tem uma prioridade maior que index.php, ou seja entre um index.php e um index.htm, ele mostraria o index.htm. Nesse caso ele pode efetuar um deface ou redirecionar para outra página.

Segundo ponto, nós mudamos o id da pasta para “../../../” para navegar entre pastas e encontrar a pasta que você deseja.

Quando fazemos isso, o sistema vai renomear todos os arquivos dentro da pasta para uma nova pasta incluindo o index.html para a pasta root.

Veja o código:

Busque os arquivos inseridos no sistema referente aquela pasta.

$r = $wpdb->get_results($wpdb->prepare("SELECT *  FROM " . $wpdb->prefix . "sp_cu   where pid = %d",sanitize_text_field( $_POST['id'])), ARRAY_A);

Essa query usando método WordPress usa a forma certa de evitar um sql injection nesse momento, mas nesse caso não é importante.

Usa o $r com todos os arquivos que vão ser renomeados no loop abaixo, inclusive o index.htm por exemplo.

for ($i = 0; $i < count($r); $i++) {
...
}

E dentro do loop o real problema que explicamos no post passado.

rename('' . SP_CDM_UPLOADS_DIR . ''.$r[$i]['uid'].'/'.$r[$i]['file'].'', '' . SP_CDM_UPLOADS_DIR . '' . sanitize_text_field($_POST['uid']) . '/'.$r[$i]['file'].'');

Você pode ver que o programa tenta salvar o código usando sanitize_text_field, um método para limpar string. Mas você verá em outros posts que esse método é um problema and não salva tudo. Lembrando que não existe bala de prata.

Ele monta um o caminho com nome do arquivo que buscou do banco de dados e usa o $_POST[‘uid’] para completar o caminho.

Veja:

$_POST['uid'] = '../../../';
$r[$i]['file'] = 'index.htm';


rename('' . SP_CDM_UPLOADS_DIR . ''.$r[$i]['uid'].'/'.$r[$i]['file'].'', '' . SP_CDM_UPLOADS_DIR . '' . sanitize_text_field($_POST['uid']) . '/'.$r[$i]['file'].'');

para  

rename('' . SP_CDM_UPLOADS_DIR . ''.$r[$i]['uid'].'/'.$r[$i]['file'].'', '' . SP_CDM_UPLOADS_DIR . '../../..//index.htm');

Existe uma diferença entre esse ataque e o dos últimos posts, é que no post nos usamos o primeiro parâmetro para executar hacking e nesse exemplo usamos o segundo. Mas não se preocupe, nós vamos mostrar um ataque usando segundo parâmetro como exemplo, nesse link.

Nós temos mais casos reais com rename.

Nós estamos esperando os ajusta para mostrar mais.

Vejo vocês em breve.

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *