PDA

Bekijk Volledige Versie : Gevaarlijke php functies uitgeschakeld maar kan ze nog steeds gebruiken :S



slikkaticz
17/04/13, 09:55
Goedemorgen beste forum leden,

Ik ben druk bezig met mijn server te beveiligen en in te richten, ik heb de volgende functies toegevoegd aan mijn disable_functions lijst in de php.ini file:

apache_child_terminate
apache_setenv
define_syslog_variables
escapeshellarg
escapeshellcmd
eval
exec
fp
fput
ftp_connect
ftp_exec
ftp_get
ftp_login
ftp_nb_fput
ftp_put
ftp_raw
ftp_rawlist
highlight_file
ini_alter
ini_get_all
ini_restore
inject_code
mysql_pconnect
openlog
passthru
php_uname
phpAds_remoteInfo
phpAds_XmlRpc
phpAds_xmlrpcDecode
phpAds_xmlrpcEncode
popen
posix_getpwuid
posix_kill
posix_mkfifo
posix_setpgid
posix_setsid
posix_setuid
posix_setuid
posix_uname
proc_close
proc_get_status
proc_nice
proc_open
proc_terminate
shell_exec
syslog
system
xmlrpc_entity_decode


en ook als test heb ik zelfs echo toegevoegd. Na het editen heb ik de file gesaved en apache gereboot met de volgende command: /etc/init.d/httpd restart dan krijg ik een OK bij het stoppen maar het starten krijg ik helemaal niets, geen ok maar ook geen error, als ik vervolgens zeg 'service httpd start' zegt die dat die al runt dus het zou goed moeten zijn neem ik aan.

Ik heb de functies op de volgende manier toegevoegd aan de php.ini file:

disable_functions = echo, syslog, system........ dus zonder qoutes en ook geen afsluiting aan het einde.


Nu heb ik om te testen een php bestand gemaakt met daarin een simpele echo 'test'; en deze geupload naar mijn website, ik kan dit bestand zonder problemen runnen en de echo werkt gewoon ondanks ik deze heb toegevoegd aan disabled functions :S

Help mij a.u.b.

joriz
17/04/13, 10:03
Dat lijkt me correct al heb ik geen spaties tussen de opgesomde functies. Heb je gekeken of er niet toevallig twee webservers draaien of php.ini meerdere keren op de server voorkomt? Meestal heeft het controlepaneel ook nog een eigen php.ini.

slikkaticz
17/04/13, 10:22
Dat lijkt me correct al heb ik geen spaties tussen de opgesomde functies. Heb je gekeken of er niet toevallig twee webservers draaien of php.ini meerdere keren op de server voorkomt? Meestal heeft het controlepaneel ook nog een eigen php.ini.

Beste Joriz,

Bedankt voor de reactie, zouden die spaties echt het verschil maken?

Als ik deze command geef: find / -name "*php.ini*" dan krijg ik enkel: /usr/local/lib/php.ini dus dat zou moeten betekenen dat ik maar 1 php.ini file heb toch?

Ik heb nu alle spaties weggehaald en als bijlage toegevoegd hoe het er uitziet:

10771

Daarna heb ik apache herstart en kreeg ik de volgende response:

10772

Helaas kan ik nog steeds gewoon mijn test.php met de echo runnen dus echo is niet geblokkeerd ondanks deze in de lijst staat.

Spyder01
17/04/13, 10:44
Kijk eens via een phpinfo() uitdraai of de file die je vind hetzelfde is als die genoemd wordt bij "Loaded Configuration File" bij een phpinfo()

slikkaticz
17/04/13, 11:01
Kijk eens via een phpinfo() uitdraai of de file die je vind hetzelfde is als die genoemd wordt bij "Loaded Configuration File" bij een phpinfo()

Bedankt Spyder, voor je hulp!

Bij een phpinfo() uitdraai krijg ik als: Loaded Configuration File: "/usr/local/lib/php.ini" en in die php.ini staat dus al mijn disabled functions.

Zou het kunnen dat ik mijn apache niet goed reboot? Ik heb voor de zekerheid ook maar even mijn vps reboot maar dit mocht niet helpen helaas.

Yourwebhoster
17/04/13, 11:14
In je phpinfo(); moet je even de disabled_functions opzoeken, als het goed is staan ze daar. Het zou kunnen dat echo gewoon werkt, probeer eens een eval uit te voeren en kijk of dat werkt.

slikkaticz
17/04/13, 11:14
Ik heb zojuist de volgende command gedaan in de test.php file op mijn website:

var_dump(ini_get('disable_functions'));

En dan krijg ik dit:

string(593) "ini_set,echo,apache_child_terminate,apache_setenv, define_syslog_variables,escapeshellarg,escapeshell cmd,eval,exec,fp,fput,ftp_connect,ftp_exec,ftp_get ,ftp_login,ftp_nb_fput,ftp_put,ftp_raw,ftp_rawlist ,highlight_file,ini_alter,ini_get_all,ini_restore, inject_code,mysql_pconnect,openlog,passthru,php_un ame,phpAds_remoteInfo,phpAds_XmlRpc,phpAds_xmlrpcD ecode,phpAds_xmlrpcEncode,popen,posix_getpwuid,pos ix_kill,posix_mkfifo,posix_setpgid,posix_setsid,po six_setuid,posix_setuid,posix_uname,proc_close,pro c_get_status,proc_nice,proc_open,proc_terminate,sh ell_exec,syslog,system,xmlrpc_entity_decode"

Dan zou je toch zeggen dat alles goed staat???

Spyder01
17/04/13, 11:18
Probeer het eens met een kleine lijst om te testen, die enorme waslijst is ook aardig onoverzichtelijk:

disable_functions =exec,passthru,shell_exec,proc_open,popen,curl_mul ti_exec,show_source,system

Daarna: /etc/init.d/httpd restart

Je kunt vervolgens eens in je test.php een exec of system functie gebruiken om te kijken wat hij doet. Check daarna ook je log eens.

Yourwebhoster
17/04/13, 11:21
Heb je al een andere functie gebruikt? Zoals ik al aangaf zou het best kunnen dat het bij echo niet werkt.

slikkaticz
17/04/13, 11:23
In je phpinfo(); moet je even de disabled_functions opzoeken, als het goed is staan ze daar. Het zou kunnen dat echo gewoon werkt, probeer eens een eval uit te voeren en kijk of dat werkt.

Bedankt voor uw reactie!

In de phpinfo() staat inderdaad disable_functions en deze geeft dit aan:

disable_functions: Local value: ini_set,echo,apache_child_terminate,apache_setenv, define_syslog_variables,escapeshellarg,escapeshell cmd,eval,exec,fp,fput,ftp_connect,ftp_exec,ftp_get ,ftp_login,ftp_nb_fput,ftp_put,ftp_raw,ftp_rawlist ,highlight_file,ini_alter,ini_get_all,ini_restore, inject_code,mysql_pconnect,openlog,passthru,php_un ame,phpAds_remoteInfo,phpAds_XmlRpc,phpAds_xmlrpcD ecode,phpAds_xmlrpcEncode,popen,posix_getpwuid,pos ix_kill,posix_mkfifo,posix_setpgid,posix_setsid,po six_setuid,posix_setuid,posix_uname,proc_close,pro c_get_status,proc_nice,proc_open,proc_terminate,sh ell_exec,syslog,system,xmlrpc_entity_decode


master value:ini_set,echo,apache_child_terminate,apache_s etenv,define_syslog_variables,escapeshellarg,escap eshellcmd,eval,exec,fp,fput,ftp_connect,ftp_exec,f tp_get,ftp_login,ftp_nb_fput,ftp_put,ftp_raw,ftp_r awlist,highlight_file,ini_alter,ini_get_all,ini_re store,inject_code,mysql_pconnect,openlog,passthru, php_uname,phpAds_remoteInfo,phpAds_XmlRpc,phpAds_x mlrpcDecode,phpAds_xmlrpcEncode,popen,posix_getpwu id,posix_kill,posix_mkfifo,posix_setpgid,posix_set sid,posix_setuid,posix_setuid,posix_uname,proc_clo se,proc_get_status,proc_nice,proc_open,proc_termin ate,shell_exec,syslog,system,xmlrpc_entity_decode


eval werkt ook gewoon, net als andere functies in de lijst :S

slikkaticz
17/04/13, 11:45
Het lijkt erop dat het nu wel werkt!

Ik heb de lijst verkleind en apache gereboot.

Toen in mijn test.php file de volgede code gezet:


<?php

echo 'verboden!';

show_source(__FILE__);

if(!exec('cd .'))
{ die('ERROR: Exec is not available!!!');}


?>

Ik krijg als output:

"verboden!
ERROR: Exec is not available!!!"

Dus het lijkt mij dat het werkt alleen heb ik ook echo als disabled functions toegevoegd en die voert die wel gewoon uit, komt dat omdat echo niet te disablen is?

Ik wil iedereen alvast hartelijk danken voor de hulp! Met name: Yourwebhoster en Spyder01

davinci
17/04/13, 11:58
waarom zou je in godsnaam 'echo' willen disablen? mi kan dat niet omdat je daarmee ALLE functies die ook maar iets van output 'kunnen' genereren ook raakt.

t.bloo
17/04/13, 12:00
echo is geen functie, maar een language construct en kun je dus niet uitschakelen

http://nl1.php.net/manual/en/function.echo.php

echo is not actually a function (it is a language construct)

slikkaticz
17/04/13, 13:33
echo is geen functie, maar een language construct en kun je dus niet uitschakelen

http://nl1.php.net/manual/en/function.echo.php

Klopt inderdaad!

Ik wou het alleen even disablen om te testen of het werkt maar dit kan inderdaad niet omdat het geen functie is.

Het is in ieder geval opgelost!

SebastiaanStok
17/04/13, 20:05
Je bent er een vergeten: dl

fopen functies uitschakelen is echt zwaar overkill, als je de applicatie zowaar moet beveiligen kan je eigenlijk net zo goed static HTML gebruiken.
shell en exec uitschakelen kan ik nog begrijpen maar is niet voldoende omdat je namelijk nog steeds de backtics `` kan gebruiken.

De meest veilige oplossing is om de applicatie onder een compleet andere gebruiker te draaien dan de eigenaar.
En dan alleen een beperkt aantal mappen schrijfrechten te geven, en bij voorkeur GEEN PHP CODE HIERIN WEGSCHRIJVEN!!

Ja ik begrijp dat er situaties zijn waarin je dit moet doen, maar meestal is dit puur overkill.