Como negar a execução do shell em todos os subdiretórios?

1

Eu quero que o nginx negue usuários com pastas dentro de / webroot / uploads

por exemplo.

/webroot/uploads/user1
/webroot/uploads/user2
/webroot/uploads/user1000

para executar qualquer shell (php, pl, exe).

Os shells são frequentemente escondidos em arquivos jpg ou gif. como badfile.php.jpg

Eu também vejo arquivos binários mal-intencionados sendo enviados para a pasta.

Aqui estão as minhas regras preliminares:

location ~ /webroot/uploads/(.+)\.php$ {
 deny all;
}

location ~ /webroot/uploads/(.+)\.pl$ {
 deny all;
}

Mas não tenho certeza se é robusto. Então agradeço sua ajuda.

    
por alfish 21.01.2014 / 22:25

2 respostas

1

Se você quiser absolutamente garantir que nada seja executado em / webroot / uploads, ou em qualquer lugar abaixo, sugiro bloquear a execução no nível do sistema de arquivos. Crie um sistema de arquivos para / webroot / uploads e monte-o com a opção 'noexec':

mount -t ext4 -o 'noexec,rw' /dev/<device-name> /webroot/uploads/

Observação: Se você estiver usando um servidor gerenciado ou não tiver armazenamento disponível para provisionar um sistema de arquivos, poderá montá-lo em um dispositivo de loopback:

Aviso: Antes de executar os seguintes comandos, faça o backup / webroot / uploads e mova os arquivos para um local temporário.

  1. Retorna o próximo dispositivo de loop disponível - será um dos / dev / loop [0-8]

    sudo losetup -f  
    
  2. Crie uma imagem para funcionar como o sistema de arquivos - isso cria um arquivo de 1GB em / opt

    sudo dd if=/dev/zero of=/opt/uploads_fs.img bs=1M count=1024  
    
  3. Configure o dispositivo de loopback retornado no primeiro comando para usar o novo arquivo

    losetup /dev/loop0 /opt/uploads_fs.img    
    
  4. Crie um sistema de arquivos

    mkfs.ext4 -m 1 -v /dev/loop0  
    
  5. Monte / webroot / uploads no novo dispositivo com o conjunto noexec

    mount -t ext4 -o 'noexec,rw' /dev/loop0 /webroot/uploads/
    

Neste ponto , restaure seus arquivos para os locais anteriores. Mesmo como usuário root, você não poderá executar arquivos nesse sistema de arquivos:

[root@localhost testfs]# ll myscript*   
-rwxrwxrwx. 1 root root 41 Jan 21 19:20 myscript.sh  
[root@localhost testfs]# ./myscript.sh  
-bash: ./myscript.sh: Permission denied  
[root@localhost testfs]#   
    
por 22.01.2014 / 03:17
0

Que tal isso?

location ~ /webroot/uploads/.*\.(php|pl|rb|sh)$ {
  deny all;
}

Por padrão, o nginx não passa arquivos para um analisador ou os executa. Isso simplesmente servirá a eles. A regra de negação é necessária apenas se você já tiver o nginx configurado para passar arquivos php / pl / rb para algo que os analisará ou executará.

    
por 21.01.2014 / 23:07