protegendo sites php no seu servidor web
DESCRIPTION
Palestra dada por Claudio Borges no CONAPHP 2008 - Congresso Nacional de PHP que ocorreu em São Paulo nos dias 18 e 19 de Outubro dentro do CONISLI 2008TRANSCRIPT
CláudioBorgescborges@openbsd‐sp.org
OQueseráabordado
Oporquedasegurança. Diretivasefunçõesperigosas. Configurandooopen_basedire
disable_functions. Utilizandoasdiretivasphp_flagephp_value. Apolêmicadoregister_globals. Mod_security. Suhoshin. Cuidadoscomlogseexibiçãodeerrosem
ambientedeprodução. Programandocomsegurança.
OPorquedasegurança
Falhaspodemexistiremqualquersistema. Programasinsegurospodemserfeitosem
qualquerlinguagem. Protegerasaplicaçõeswebétarefatantodo
administradorquandodoprogramador. Muitasfeaturesajudamnaprogramaçãomas
diminuemasegurança. Porserumalinguagemmuitorica,muitos
programadoresnãoconsideramqueasegurançatambémdependedaqualidadedoseucódigoPHP.
Diretivasperigosas
allow_url_fopen–Permiteutilizararquivosexternoscomosefossemarquivoslocais.
allow_url_include–Permiteutilizararquivosexternoseminclude/require.
expose_php–Adicionaumaassinaturanoheaderdoseuservidorweb,informandoqueophpestáinstalado.
Exemplodeusodesitemaldesenvolvidoeallow_url_fopen/allow_url_includehabilitado:
Agoradesabilitado:
Exemplodescanemservidorcomexpose_phphabilitado:
Ecomeledesabilitado:
Funçõesperigosas
Asfunçõesexec,shellexec,systemepassthruexecutamcomandosexternos.
Outrasfunções:phpinfo,proc_open,proc_nice,chdir,chroot,dir,closedir,getcwd,opendir,readdir,rewinddir,scandir,popen,pcntl_exec,pcntl_fork,pcntl_alarm,pcntl_setpriority,pcntl_signal,pcntl_wait,pcntl_waitpid,ini_get,ini_get_all,ini_set,ini_restore.
Configurandooopen_basediredisable_functions
open_basedir–DefineosdiretóriosapartirdosquaisoPHPpodeutilizar.
open_basedir = /var/www/:/tmp/
disable_functions–Permitedesabilitarfunçõesquenãoprecisemserutilizadas.
disable_functions = phpinfo, shell_exec, exec, passthru, proc_open, proc_nice, system, chdir, chroot, dir, closedir, getcwd, opendir, readdir, rewinddir, scandir, popen, pcntl_exec, pcntl_fork, pcntl_alarm, pcntl_setpriority,
pcntl_signal, pcntl_wait, pcntl_waitpid, ini_get, ini_get_all, ini_set, ini_restore
Exemplodeumapáginasemopen_basedirconfigurado:
Outroexemplo:crieiumarquivochamadoreadfile.phpcomoseguinteconteúdo:
<?php readfile(‘/etc/passwd’); ?>
Eoresultado:
Eomesmoexemplocomeleconfigurado:open_basedir = /var/www/:/tmp/
Ecomocódigodoreadfile.php:
Apolêmicadoregister_globals
Comregister_globalshabilitado,sãocriadasvariáveislocaiscomonomeequivalenteàsdaEGPCS.
Épossívelutilizarregister_globalshabilitadoeterminhaaplicaçãosegura?
Porquetantosprogramadoresinsistememhabilitarregister_globals?
Porquenãoutilizarregister_globals?
Exemplosdeusoderegister_globals
Exemplodecódigocomregister_globalshabilitado:
if (authenticated_user())
$auth = true;
if ($auth)
echo “Usuário autorizado…”;
else
echo “Usuário sem autorização!”;
OcódigoacimapodeserfacilmenteburladocomaseguinteURL:
http://www.site.com.br?login.php?auth=1
Eagoradaformacorreta:
if (authenticated_user())
$_SESSION[‘auth’] = true;
if ($_SESSION[‘auth’])
echo “Usuário autorizado…”;
else
echo “Usuário sem autorização!”;
Utilizandoasdiretivasphp_flagphp_value
Comasdiretivasphp_value,php_flag,épossíveldefiniropçõespersonalizadasparacadavhostviaarquivos.htaccess.ÉnecessárioqueadiretivaAllowOverrideestejadefinidacomovalorAll.
Asdiretivasphp_admin_flagephp_admin_valuesópodemserutilizadasemarquivosdeconfiguraçãodoApacheenãopodemsersobrescritaspordiretivas.htaccess.
Exemplodeusodadiretivaphp_admin_value:
Mod_security
Éumfirewalldeaplicaçãoweb(WAF). ÉummódulodoApache. Monitoramento,detecçãoeprevençãoemtemporeal.
Existemarquivosderegrasdisponíveisparadownload.
Vocêmesmopodecriarsuasregras. Épossívelcriarwhitelists.
Suhoshin
UmpatchparaoPHPquepodeserutilizadocomoestensão.
Proteçãoemtempodeexecução. Temmododesimulaçãoeproteção. Aceitafiltrarentradadedados. Permiteencriptarsessões. Proteçãodememória. Aplicalimitesderequisiçõesportipodevariável. Váriasopçõesdelogs. Aceitacriarwhitelist/blacklist.
Cuidadoscomlogseexibiçãodeerrosemambientede
produção
Gravarlogsdeerroséútilparadebugarproblemas.
Ousuárionãodeveteracessoatodasasinformaçõesdeerro.
Exibirerrosemambientedeproduçãopodefornecerinformaçõessobresistemaeservidor.
Opçõesdeerroselogsnophp.ini
error_reporting–Definequaisníveisdeerrosserãoreportados.
display_errors–Determinaseoserrosdevemserexibidoscomopartedasaídaounão.
log_errors–Defineseoserrosserãogravadosemarquivoounão.
error_log–Defineemqualarquivooserrosserãogravados.Necessitaqueolog_errorsestejaativado.
Programandocomsegurança
Sempreverifiqueotipodedado,utilizefunçõesctype_alpha,ctype_alnum,ctype_digit,is_numeric,is_digit,eexpressõesregulares.
Filtreosdadosdeentradacomfunçõesdotipofilter_varefilter_input.
Utilizarfunçõesdeescapeoutput,comoporexemplohtmlentities,strip_tags.
Nuncautilizemagic_quotes. Nuncaarmazenesenhaemtextoplano,utilize
hashes(md5,sha1,…). Utilizerequire_oncenolugardeinclude. Nuncaconfieemusuário,sempreverifiquea
origemdosdados.
Referências
Siteoficialdalinguagemphp:http://www.php.net
Siteoficialdomod_securityhttp://www.modsecurity.org
Siteoficialdosuhoshin:http://www.hardened‐php.net/suhosin/
Siteoficialdophpsecinfo:http://phpsec.org/projects/phpsecinfo/index.html
SiteoficialdoChorizo:https://chorizo‐scanner.com
Perguntas?
cborges@openbsd‐sp.org
IRC:irc.freenode.netCanais:slackware‐br,sysadms,openbsd‐br,opensd‐sp