Estou tentando criar uma lista de funções que podem ser usadas para execução arbitrária de código. O objetivo não é listar as funções que devem estar na lista negra ou não permitidas. Em vez disso, eu gostaria de ter uma grep
lista habilitada de palavras - chave com bandeira vermelha ao procurar um servidor comprometido por back-doors.
A idéia é que, se você deseja criar um script PHP mal-intencionado multiuso - como um script de "shell da web" como c99 ou r57 - precisará usar um ou mais de um conjunto relativamente pequeno de funções em algum lugar do arquivo para permitir que o usuário execute código arbitrário. A busca por essas funções ajuda a reduzir mais rapidamente um palheiro de dezenas de milhares de arquivos PHP para um conjunto relativamente pequeno de scripts que requerem um exame mais detalhado.
Claramente, por exemplo, qualquer um dos seguintes itens seria considerado malicioso (ou terrível de codificação):
<? eval($_GET['cmd']); ?>
<? system($_GET['cmd']); ?>
<? preg_replace('/.*/e',$_POST['code']); ?>
e assim por diante.
Pesquisando em um site comprometido no outro dia, não notei um código malicioso porque não sabia que preg_replace
poderia ser perigoso pelo uso da /e
bandeira (o que, sério? Por que isso acontece ?). Há outros que eu perdi?
Aqui está minha lista até agora:
Shell Execute
system
exec
popen
backtick operator
pcntl_exec
Execução do PHP
eval
preg_replace
(com/e
modificador)create_function
include
[_once
] /require
[_once
] ( consulte a resposta de mario para obter detalhes da exploração)
Também pode ser útil ter uma lista de funções capazes de modificar arquivos, mas imagino que 99% do código de exploração do tempo conterá pelo menos uma das funções acima. Mas se você tiver uma lista de todas as funções capazes de editar ou gerar arquivos, poste-a e incluirei aqui. (E não estou contando mysql_execute
, já que isso faz parte de outra classe de exploração.)
/e
modificador faz?e
modificador faz com que a string de substituição seja avaliada como código PHP.Respostas:
Para construir esta lista, usei 2 fontes. Um estudo sobre Scarlet e RATS . Eu também adicionei alguns dos meus à mistura e as pessoas neste segmento ajudaram.
Edit: Depois de postar esta lista, entrei em contato com o fundador do RIPS e, a partir de agora, essas ferramentas pesquisam o código PHP para o uso de todas as funções nesta lista.
A maioria dessas chamadas de função é classificada como Pias. Quando uma variável contaminada (como $ _REQUEST) é passada para uma função de coletor, você tem uma vulnerabilidade. Programas como RATS e RIPS usam a funcionalidade grep para identificar todos os coletores em um aplicativo. Isso significa que os programadores devem ter cuidado extra ao usar essas funções, mas se elas banirem todas, você não poderá fazer muito.
" Com grande poder vem grande responsabilidade. "
--Stan Lee
Execução de comando
Execução de código PHP
Além de
eval
outras maneiras de executar o código PHP:include
/require
pode ser usado para execução remota de código na forma das vulnerabilidades de inclusão local de arquivo e inclusão remota de arquivo .Lista de funções que aceitam retornos de chamada
Essas funções aceitam um parâmetro de string que pode ser usado para chamar uma função de escolha do atacante. Dependendo da função, o invasor pode ou não ter a capacidade de passar um parâmetro. Nesse caso, uma
Information Disclosure
função comophpinfo()
poderia ser usada.Divulgação de informação
A maioria dessas chamadas de função não são sumidouros. Mas, talvez, seja uma vulnerabilidade se algum dos dados retornados estiver visível para um invasor. Se um invasor pode ver
phpinfo()
, é definitivamente uma vulnerabilidade.De outros
Funções do sistema de arquivos
De acordo com o RATS, todas as funções do sistema de arquivos no php são desagradáveis. Alguns deles não parecem muito úteis para o atacante. Outros são mais úteis do que você imagina. Por exemplo, se
allow_url_fopen=On
um URL pode ser usado como um caminho de arquivo, uma chamada paracopy($_GET['s'], $_GET['d']);
pode ser usada para carregar um script PHP em qualquer lugar do sistema. Além disso, se um site estiver vulnerável a uma solicitação de envio via GET, todas essas funções do sistema de arquivos podem ser abusadas para canalizar e atacar outro host por meio do servidor.fonte
eval()
codificar, executar comandos do sistema, acessar um banco de dados e ler / gravar em arquivos. Esse código pode ser influenciado por um invasor, e isso é uma vulnerabilidade.preg_match
come
não é mal. O manual diz "Apenas preg_replace () usa esse modificador; é ignorado por outras funções do PCRE".Você precisaria procurar por include ($ tmp) e exigir (HTTP_REFERER) e * _once também. Se um script de exploração puder gravar em um arquivo temporário, ele poderá ser incluído posteriormente mais tarde. Basicamente, uma avaliação em duas etapas.
E é ainda possível ocultar o código remoto com soluções alternativas, como:
Além disso, se o seu servidor da web já tiver sido comprometido, você nem sempre verá o mal não codificado. Geralmente, o shell de exploração é codificado em gzip. Pense em
include("zlib:script2.png.gz");
Sem avaliação aqui, ainda o mesmo efeito.fonte
$_GET[xyz]
ao invés de$xyz
? Ou havia algo mais profundo nisso?grep
uso. PHP - que desastre.include
não requer parênteses;include "…"
é suficiente.Esta não é uma resposta em si, mas aqui está algo interessante:
No mesmo espírito,
call_user_func_array()
pode ser usado para executar funções ofuscadas.fonte
Estou surpreso que ninguém tenha mencionado
echo
eprint
como pontos de exploração de segurança.Script entre sites (XSS) é uma exploração de segurança séria, porque é ainda mais comum que as explorações de execução de código no servidor.
fonte
Eu gostaria particularmente de adicionar unserialize () a esta lista. Ele tem um longo histórico de várias vulnerabilidades, incluindo execução arbitrária de códigos, negação de serviço e vazamento de informações de memória. Nunca deve ser chamado em dados fornecidos pelo usuário. Muitos desses vuls foram corrigidos em lançamentos nos últimos anos de orvalho, mas ainda retêm alguns vuls desagradáveis no momento atual da escrita.
Para outras informações sobre funções / uso desonesto do php, consulte o Hardened PHP Project e seus conselhos. Também o recente mês de segurança do PHP e os de 2007 projetos Month of PHP Bugs de
Observe também que, por design, a desserialização de um objeto fará com que as funções construtor e destruidor sejam executadas; outro motivo para não chamar dados fornecidos pelo usuário.
fonte
Meu VPS está definido para desativar as seguintes funções:
O PHP possui funções potencialmente destrutíveis suficientes para a sua lista ser grande demais para a qual grep. Por exemplo, o PHP possui chmod e chown, que podem ser usados para simplesmente desativar um site.
EDIT: Talvez você queira criar um script bash que procure um arquivo por uma matriz de funções agrupadas por perigo (funções ruins, funções piores, funções que nunca devem ser usadas) e depois calcule a relatividade do perigo que o arquivo impõe em uma porcentagem. Em seguida, imprima isso em uma árvore do diretório com as porcentagens marcadas ao lado de cada arquivo, se maior que um limite de, digamos, 30% de perigo.
fonte
Também esteja ciente da classe de "vulnerabilidades de interrupção" que permite que locais arbitrários de memória sejam lidos e gravados!
Isso afeta funções como trim (), rtrim (), ltrim (), explode (), strchr (), strstr (), substr (), chunk_split (), strtok (), addcslashes (), str_repeat () e mais . Isso ocorre em grande parte, mas não exclusivamente, devido ao recurso de passagem por referência do tempo de chamada do idioma que foi descontinuado por 10 anos, mas não desativado.
Para obter mais informações, consulte a palestra de Stefan Esser sobre vulnerabilidades de interrupção e outros problemas de PHP de nível inferior no BlackHat USA 2009 Slides Paper
Este artigo / apresentação também mostra como dl () pode ser usado para executar código arbitrário do sistema.
fonte
Vetores exec específicos da plataforma, mas também teóricos:
E existem muitos outros métodos de disfarce:
fonte
Além da
eval
construção da linguagem, há outra função que permite a execução arbitrária de código:assert
fonte
Uma fonte de explorações interessantes não foi mencionada. O PHP permite que as strings tenham
0x00
bytes. As funções subjacentes (libc) tratam isso como o fim de uma string.Isso permite situações em que a verificação de sanidade (mal implementada) no PHP pode ser enganada, por exemplo, em uma situação como:
Isso pode incluir qualquer arquivo - não apenas aqueles que terminam em
.php
- chamandoscript.php?file=somefile%00.php
Portanto, qualquer função que não obedeça ao comprimento da string do PHP pode levar a alguma vulnerabilidade.
fonte
E quanto aos elementos sintáticos perigosos?
A " variável variável " (
$$var
) encontrará uma variável no escopo atual com o nome de $ var. Se usado incorretamente, o usuário remoto pode modificar ou ler qualquer variável no escopo atual. Basicamente, um mais fracoeval
.Ex: você escreve algum código
$$uservar = 1;
e o usuário remoto define$uservar
como "admin", fazendo$admin
com que seja definido1
no escopo atual.fonte
$innocentFunc = 'exec'; $innocentFunc('activate skynet');
.Acho que você não conseguirá realmente encontrar todas as explorações possíveis analisando seus arquivos de origem.
Além disso, se houver realmente ótimas listas fornecidas aqui, você poderá perder uma função que pode ser explorada
ainda pode haver código maligno "oculto" como este
você poderia dizer agora, eu simplesmente estendo meu script para combinar com isso
mas você terá esse "código possivelmente maligno" que, além disso, está fora de seu contexto
de modo a ser (pseudo-) garantir, você deve realmente escrever código bom e ler todos os códigos existentes se
fonte
Operador de Backtick Backtick no manual php
fonte
Eu sei
move_uploaded_file
que foi mencionado, mas o upload de arquivos em geral é muito perigoso. Apenas a presença de$_FILES
deve suscitar alguma preocupação.É bem possível incorporar código PHP em qualquer tipo de arquivo. As imagens podem ser especialmente vulneráveis aos comentários de texto. O problema é particularmente problemático se o código aceitar a extensão encontrada nos
$_FILES
dados como está.Por exemplo, um usuário pode fazer upload de um arquivo PNG válido com código PHP incorporado como "foo.php". Se o script for particularmente ingênuo, ele poderá copiar o arquivo como "/uploads/foo.php". Se o servidor estiver configurado para permitir a execução de scripts nos diretórios de upload do usuário (geralmente o caso e uma supervisão terrível), você poderá executar instantaneamente qualquer código PHP arbitrário. (Mesmo que a imagem seja salva como .png, pode ser possível executar o código por outras falhas de segurança.)
Uma lista (não exaustiva) de itens a serem verificados nos envios:
fonte
Vamos adicionar
pcntl_signal
epcntl_alarm
à lista.Com a ajuda dessas funções, você pode contornar qualquer restrição set_time_limit criada no php.ini ou no script.
Este script, por exemplo, será executado por 10 segundos, apesar de
set_time_limit(1);
(O crédito vai para o tweet e essência de Sebastian Bergmanns :
fonte
Existem muitas explorações do PHP que podem ser desabilitadas pelas configurações no arquivo PHP.ini. O exemplo óbvio é register_globals, mas, dependendo das configurações, também pode ser possível incluir ou abrir arquivos de máquinas remotas via HTTP, que podem ser explorados se um programa usar nomes de arquivos variáveis para qualquer uma de suas funções include () ou de manipulação de arquivos.
O PHP também permite a chamada de função variável adicionando () ao final de um nome de variável - por exemplo
$myvariable();
, chamará o nome da função especificado pela variável. Isso é explorável; por exemplo, se um invasor pode fazer com que a variável contenha a palavra 'eval' e controlar o parâmetro, ele pode fazer o que quiser, mesmo que o programa não contenha a função eval ().fonte
Essas funções também podem ter efeitos desagradáveis.
str_repeat()
unserialize()
register_tick_function()
register_shutdown_function()
Os dois primeiros podem esgotar toda a memória disponível e os últimos mantêm a exaustão em andamento ...
fonte
Houve alguma discussão sobre isso em security.stackexchange.com recentemente
Bem, isso reduz um pouco o escopo - mas como 'print' pode ser usado para injetar javascript (e, portanto, roubar sessões etc.), ainda é um tanto arbitrário.
Essa é uma abordagem sensata.
No entanto, considere escrever seu próprio analisador - muito em breve você encontrará uma abordagem baseada em grep ficando fora de controle (o awk seria um pouco melhor). Em breve, você começará a desejar também ter implementado uma lista de permissões!
Além dos óbvios, eu recomendaria sinalizar qualquer coisa que inclua com um argumento de qualquer coisa que não seja uma string literal. Cuidado com __autoload () também.
fonte
Temo que minha resposta possa ser um pouco negativa demais, mas ...
IMHO, todas as funções e métodos existentes podem ser usados para fins nefastos. Pense nisso como um efeito superficial da nefastidão: uma variável é atribuída a um usuário ou entrada remota, a variável é usada em uma função, o valor de retorno da função usado em uma propriedade de classe, a propriedade de classe usada em uma função de arquivo, e assim por diante. Lembre-se: um endereço IP forjado ou um ataque intermediário pode explorar todo o site.
Sua melhor aposta é a de vestígios do início ao fim qualquer usuário possível ou entrada remota, começando com
$_SERVER
,$_GET
,$_POST
,$_FILE
,$_COOKIE
,include(some remote file)
( se interruptores igual ao número de funções e métodos em PHP (incluindo definido pelo usuário).allow_url_fopen
estiver ligado), todas as outras funções / classes que lidam com arquivos remotos, etc. Você programaticamente criar um perfil pilha-trace de cada valor fornecido pelo usuário ou remotamente. Isso pode ser feito de forma programática, obtendo todas as instâncias repetidas da variável e funções ou métodos atribuídos em que é usado, compilando recursivamente uma lista de todas as ocorrências dessas funções / métodos e assim por diante. Examine-o para garantir que ele passe primeiro pelas funções de filtragem e validação adequadas em relação a todas as outras funções que toca. É claro que este é um exame manual; caso contrário, você terá um número total decase
Como alternativa, para lidar apenas com a entrada do usuário, tenha uma classe de controlador estático inicializada no início de todos os scripts que 1) valide e armazene todos os valores de entrada fornecidos pelo usuário em uma lista branca de propósitos permitidos; 2) limpa a fonte de entrada (ou seja
$_SERVER = null
). Você pode ver onde isso fica um pouco nazista.fonte
Aqui está uma lista de funções que meu provedor desabilita por motivos de segurança:
fonte
A maioria dos ataques no código usa várias fontes de acesso ou várias etapas para se executar. Eu pesquisaria não apenas um código ou método com código malicioso, mas todos os métodos, que funcionam executando ou chamando-o. A melhor segurança também incluiria a codificação e validação dos dados do formulário à medida que eles entram e saem.
Cuidado também ao definir as variáveis do sistema, elas podem ser chamadas posteriormente a partir de qualquer função ou método no código.
fonte
Vários estouros de buffer foram descobertos usando funções de caracteres de 4 bits que interpretam o texto. htmlentities () htmlspecialchars ()
No topo, uma boa defesa é usar mb_convert_encoding () para converter em codificação única antes da interpretação.
fonte
Você pode encontrar uma lista atualizada continuamente de sumidouros sensíveis (funções php exploráveis) e seus parâmetros em RIPS /config/sinks.php, um analisador de código fonte estático para vulnerabilidades em aplicativos PHP que também detectam backdoors PHP.
fonte