Bem, já vi alguns posts aqui no GH que "explicavam" como fazer upload de uma shell como se fosse image. O problema é que esses posts não explicavam como isso era possivel e qual o funcionamento, e se você tem alguem que consegue invadir mas não sabe como foi possivel, então você terá um script kiddie ou lamer, chame do que quiser. Mas o importante é entender.
Primeiro vamos entender como os scripts de upload identificam o tipo de arquivo.
1. Pela extenção.
Dependendo da versão do PHP essa é dificil de burlar, mas tem varias formas.
Null Charactere.
Essa técnica pode ou não funcionar, depende da versão do PHP, funciona porque a
função que filtra para quando encontra o caractere NULL, é simples, desde o C que
para identificar o fim de uma string deve-se achar o caractere NULL, então é só adicionar
os caracteres %00 no fim do nome arquivo, mas não no formulario, use o curl por exemplo.
$ curl -F "imagem=@c99.php;filename=c99.php%00" --url Apenas usuários registrados e ativados podem ver os links., Clique aqui para se cadastrar...
Capitalize
Essa técnica depende do script, digamos que haja uma comparação no script como essa:
observe que essa comparação compara apenas com '.php', então pare e pense, se a comparação
é case-sensitive, então.... isso mesmo, você tem apenas que mudar a extenção para .PHP ou pHp,etc
funciona bem em servidores windows.
.jpg.php
Alguns scripts só procuram por um texto no meio da string, então basta você inserir a extenção acima
2. Type
Essa é mais ou menos simples, você precisa fazer o upload usando alguma ferramenta como o curl ou
programando um script que envie a requisição certa.
Funciona porque é o requerinte da página que envia, então é bem fácil. Digamos que no script tenha
o seguinte código:
então basta enviar com o tipo como "image/jpg", que vai junto com a requisição HTTP, em um cabeçalho
Content-Type. Pra fazer isso com o curl use o comando:
$ curl -F "imagem=@c99.php;type=image/jpg" --url Apenas usuários registrados e ativados podem ver os links., Clique aqui para se cadastrar...
3. Magic Headers
Essa funciona quando o alvo usa o comando file do linux ou a função mime_content_type do PHP
Primeiro você tem que saber que magic é uma informação que fica dentro do arquivo e que identifica ele.
Funciona assim: primeiro você tem que saber o offset (o local onde começa), depois a string de identificação,
vamos usar o GIF, o offset é 0, e a string é GIF89a ou GIF87a, no caso do GIF esses numeros são a versão do GIF,
mas isso não interessa no momento.
Então basta adicionar GIF89a no começo da shell, ou do arquivo que quiser, mas tem de ser bem no começo mesmo,
sem espaços,
ex:
Pra testar se deu certo use:
$ file nomedoarquivo.php
a saida será:
nomedoarquivo.php: GIF image data, version 87a,
Você pode disfarçar como outros formatos de arquivo, alias, qualquer um, basta estudar as especificações, ou achar só o
magic.
Mais a dica mais importante é: Aprenda a programar scripts
Qualquer linguagem que você se der bem, perl, python, shell script, php, assim você terá a mais poderosa ferramenta de todas.
Primeiro vamos entender como os scripts de upload identificam o tipo de arquivo.
1. Pela extenção.
Dependendo da versão do PHP essa é dificil de burlar, mas tem varias formas.
Null Charactere.
Essa técnica pode ou não funcionar, depende da versão do PHP, funciona porque a
função que filtra para quando encontra o caractere NULL, é simples, desde o C que
para identificar o fim de uma string deve-se achar o caractere NULL, então é só adicionar
os caracteres %00 no fim do nome arquivo, mas não no formulario, use o curl por exemplo.
$ curl -F "imagem=@c99.php;filename=c99.php%00" --url Apenas usuários registrados e ativados podem ver os links., Clique aqui para se cadastrar...
Capitalize
Essa técnica depende do script, digamos que haja uma comparação no script como essa:
Código PHP:
if(substr(strstr($filename, '.'), 1) != '.php')
é case-sensitive, então.... isso mesmo, você tem apenas que mudar a extenção para .PHP ou pHp,etc
funciona bem em servidores windows.
.jpg.php
Alguns scripts só procuram por um texto no meio da string, então basta você inserir a extenção acima
2. Type
Essa é mais ou menos simples, você precisa fazer o upload usando alguma ferramenta como o curl ou
programando um script que envie a requisição certa.
Funciona porque é o requerinte da página que envia, então é bem fácil. Digamos que no script tenha
o seguinte código:
Código PHP:
if(eregi("^image/(jpg|png|gif)$", $_FILES['imagem']['type']))
Content-Type. Pra fazer isso com o curl use o comando:
$ curl -F "imagem=@c99.php;type=image/jpg" --url Apenas usuários registrados e ativados podem ver os links., Clique aqui para se cadastrar...
3. Magic Headers
Essa funciona quando o alvo usa o comando file do linux ou a função mime_content_type do PHP
Primeiro você tem que saber que magic é uma informação que fica dentro do arquivo e que identifica ele.
Funciona assim: primeiro você tem que saber o offset (o local onde começa), depois a string de identificação,
vamos usar o GIF, o offset é 0, e a string é GIF89a ou GIF87a, no caso do GIF esses numeros são a versão do GIF,
mas isso não interessa no momento.
Então basta adicionar GIF89a no começo da shell, ou do arquivo que quiser, mas tem de ser bem no começo mesmo,
sem espaços,
ex:
Código PHP:
GIF89a <?php .... ?>
$ file nomedoarquivo.php
a saida será:
nomedoarquivo.php: GIF image data, version 87a,
Você pode disfarçar como outros formatos de arquivo, alias, qualquer um, basta estudar as especificações, ou achar só o
magic.
Mais a dica mais importante é: Aprenda a programar scripts
Qualquer linguagem que você se der bem, perl, python, shell script, php, assim você terá a mais poderosa ferramenta de todas.