Em muitos casos, o software pode vir predefinido com vários parâmetros configurados por padrão. Em muitos casos, os valores-padrão são configurados sem levar em conta a segurança. O invasor pode utilizar esses padrões malfeitos durante um ataque.
Por razões de conveniência (ou seria preguiça?) alguns programadores podem integrar variáveis secretas nas suas aplicações. A variável secreta funciona como um código. Quando o código secreto é utilizado, a aplicação abre o cofre. Um exemplo disso é a aplicação WEB que faz distinção entre os usuários normais e os admins procurando uma variável de uma forma oculta com um determinado valor como ADMIN=YES. Pode parecer maluquice, mas várias aplicações baseadas na WEB desenvolvidas internamente que são utilizadas pelos maiores bancos do mundo funcionam desta maneira. Esse é um dos truques que as equipes de auditoria de software procuram.
Às vezes esses tipos de problema não são causados intencionalmente pelos própios programadores, mas fazem parte da plataforma ou da linguagem. Isso é o que acontece com as variáveis globais de PHP.
O PHP é um grande exemplo de segurança inadequada. A idéia predominante no PHP é a facilidade de uso, e o mantra "não dar ao desenvolvedor nenhum trabalho extra para fazer as coisas" se aplica a todos os casos. O PHP faz isso removendo o formalismo da linguagem, permitindo a declaração de variáveis na primeira utilização, inicializando tudo com valores predefinidos e pegando todas as variáveis significativas de uma transação e tornando-as disponíveis. Nos casos de conflito cmo algo mais técnico, o mais simples quase sempre prevalece no PHP. Uma das consequências de tudo isso é que o PHP permite que os usuários de uma aplicação WEB sobrescrevam variáveis de ambiente com variáveis de consulta não-confiáveis, fornecidas pelo usuário. Portanto, valores críticos como o CWD e o caminho de busca podem ser sobrescritos e controlados diretamente por um usuário anônimo remoto. Outra consequência semelhante é que as variáveis podem ser controladas diretamente atribuídas a partir dos valores controlados pelo usuário, fornecidos nos campos GET e POST da solicitação. Dessa forma, um código aparentemente normal como esse faz coisas esquisitas:
Normalmente esse loop executará seu corpo dez vezes. A primeira iteração será um zero indefinido, e as outras passagens pelo loop terão como resultado o incremento da variável $count. O problema é que o codificador não zera a variável antes de entrar no loop. Isso é bom porque o PHP inicializa a variável na declaração. O resultado é um código que parece funcionar, mesmo sendo ruim. O problema é que um usuário da aplicação WEB pode fornecer uma solicitação como:
e fazer o $count iniciar no valor 9, tendo como resultado somente uma passagem pelo loop. Mas que azar. Dependendo da configuração, o PHP pode aceitar variáveis fornecidas pelo usuário, em vez das variáveis de ambiente. O PHP inicializa as variáveis globais para todas as variáveis de ambiente de processo, como $PATH e $HOSTNAME. Essas variáveis são de importância crítica, porque podem ser utilizadas em operações de arquivos ou de rede. Se um invasor pude fornecer uma nova variável $PATH (como PATH='/var'), o programa pode ser explorável. O PHP também pode aceitar tags de campo fornecidos em solicitações de GET/POST e transformá-los em variáveis globais. Isso é o que acontece com a variável $count que exploramos no exemplo anterior. Considere outrio exemplo desse problema, em que o programa define uma variável chamada $tempfile. O invasor pode fornecer um novo arquivo temporário, como $tempfile = "/etc/passwd". Em seguida, o arquivo temporário pode ser apagado posteriormente por meio de uma chamada unlink($tempfile);. Agora o arquivo passwd também foi apagado -- Uma coisa muito ruiim na maioria dos sistemas operacionais. Considere também que o uso do include() e require() procura primeiro $PATH e que o uso de chamadas para o shell pode executar programas cruciais como ls. Dessa forma, o ls pode ser modificado maliciosamente (o invasor pode alterar $PATH para fazer com que uma cópia troiana de ls seja carregada). Esse tipo de ataque também pode ser aplicado a bibliotecas carregáveis se $LD_LIBRARY_PATH for modificado.
Por fim, algumas versões do PHP podem passar dados de usuários para o syslog como um format string, expondo a aplicação a um buffer overflow por format string.
Padrão de ataque: Variáveis globaos fornecidas pelo usuário (DEBUG=1, globais no PHP etc.)
Em linguagens repletas de brechas como o PHP, várias configurações-padrão são configuradas erradamente. É prudente testar essas linguagens.
Em linguagens repletas de brechas como o PHP, várias configurações-padrão são configuradas erradamente. É prudente testar essas linguagens.
Às vezes esses tipos de problema não são causados intencionalmente pelos própios programadores, mas fazem parte da plataforma ou da linguagem. Isso é o que acontece com as variáveis globais de PHP.
- Exemplo de ataque: Variáveis globais do PHP
O PHP é um grande exemplo de segurança inadequada. A idéia predominante no PHP é a facilidade de uso, e o mantra "não dar ao desenvolvedor nenhum trabalho extra para fazer as coisas" se aplica a todos os casos. O PHP faz isso removendo o formalismo da linguagem, permitindo a declaração de variáveis na primeira utilização, inicializando tudo com valores predefinidos e pegando todas as variáveis significativas de uma transação e tornando-as disponíveis. Nos casos de conflito cmo algo mais técnico, o mais simples quase sempre prevalece no PHP. Uma das consequências de tudo isso é que o PHP permite que os usuários de uma aplicação WEB sobrescrevam variáveis de ambiente com variáveis de consulta não-confiáveis, fornecidas pelo usuário. Portanto, valores críticos como o CWD e o caminho de busca podem ser sobrescritos e controlados diretamente por um usuário anônimo remoto. Outra consequência semelhante é que as variáveis podem ser controladas diretamente atribuídas a partir dos valores controlados pelo usuário, fornecidos nos campos GET e POST da solicitação. Dessa forma, um código aparentemente normal como esse faz coisas esquisitas:
Código PHP:
while($count < 100{
//faz algo
$count++;
}
Código PHP:
GET /login.php?count=9
Por fim, algumas versões do PHP podem passar dados de usuários para o syslog como um format string, expondo a aplicação a um buffer overflow por format string.
Comment