Fil-qosor: Fis-sigurtà tal-uploads f'PHP ma tiddeċiedix verifika waħda, imma l-kombinazzjoni: tivverifikaw it-tip tal-fajl fuq is-server, issemmu mill-ġdid il-fajls, taħżnuhom barra mill-webroot u ma tippermettux eżekuzzjoni ta' skripts fil-folder tal-upload. Formola tal-upload mhux ivverifikata hija waħda mit-toroq klassiċi li bihom l-attakkanti jdaħħlu backdoor fuq server tal-web.
Għaliex il-formoli tal-upload huma punt favorit ta' dħul
Kull formola li taċċetta fajls tikteb data barranija fuq is-server tagħkom. Dan jinkludi formoli ta' applikazzjoni, portals tal-klijenti, gallariji tal-immaġini, żoni ta' appoġġ u ħafna estensjonijiet ta' CMS u ħwienet. Jekk attakkant jirnexxilu jpoġġi hemm fajl li s-server tal-web imbagħad jesegwixxi bħala PHP, ikollu backdoor permanenti.
Għall-maniġment dan ifisser: upload li jidher bla ħsara għal CVs jista' fl-agħar każ iwassal biex jittieħed is-server tal-web kollu. Barra minn hekk, fil-folders tal-upload spiss ikun hemm data personali li, b'konfigurazzjoni żbaljata, tista' tinqara pubblikament.
Għall-admins u l-iżviluppaturi dan ifisser: il-kodiċi tal-applikazzjoni u l-konfigurazzjoni tas-server iridu jaqblu. Dgħufija f'livell waħda spiss tinqabad mill-oħra, jekk it-tnejn jiġu implimentati sewwa. Kif issibu fajls diġà introdotti tiddeskrivi l-gwida Kif tagħrfu u tneħħu webshells.
Ir-regoli bażiċi għas-sigurtà tal-uploads f'PHP
Ir-regoli li ġejjin jikkorrispondu għar-rakkomandazzjonijiet tal-OWASP Cheat Sheets u ppruvaw ruħhom fit-tħaddim:
- Lista permessa minflok lista bloċċata: Aċċettaw biss tipi ta' fajls espliċitament permessi, pereżempju PDF, JPG u PNG. Listi bloċċati għal estensjonijiet individwali jistgħu jiġu evitati permezz ta' varjanti u estensjonijiet doppji.
- Ivverifikaw il-kontenut, mhux biss l-estensjoni: Iddeterminaw it-tip attwali fuq is-server b'
finfo. It-tip MIME f'$_FILEShuwa dikjarazzjoni tal-mittent u mhux affidabbli. - Isem ġdid tal-fajl: Qatt ma tużaw l-isem oriġinali bħala isem tal-fajl. Oħolqu isem każwali u żidu l-estensjoni mil-lista permessa.
- Ħażna barra mill-webroot: Aħżnu l-fajls b'mod li ma jintlaħqux direttament permezz ta' URL. Il-konsenja ssir permezz ta' skript b'verifika tal-awtorizzazzjoni.
- Illimitaw id-daqs: Fl-applikazzjoni, f'PHP u fis-server tal-web.
- L-ebda eżekuzzjoni: Jekk l-uploads xorta jridu jkunu fil-webroot, itfu l-eżekuzzjoni ta' skripts f'dan id-direttorju.
- Verifika biss fuq is-server: Verifiki ta' JavaScript fil-browser itejbu l-użu, imma ma jipproteġux.
Eżempju sikur b'finfo u isem każwali
L-eżempju li ġej juri l-qalba ta' pproċessar sikur. Huwa apposta qasir u jrid jiddaħħal fl-applikazzjoni tagħkom, jiġifieri b'login, verifika tal-awtorizzazzjoni, protezzjoni CSRF u reġistrazzjoni.
<?php
declare(strict_types=1);
const MAX_BYTES = 5 * 1024 * 1024; // 5 MB
const ERLAUBT = [
'application/pdf' => 'pdf',
'image/jpeg' => 'jpg',
'image/png' => 'png',
];
const ZIELORDNER = '/var/www/daten/uploads'; // barra mill-webroot
$datei = $_FILES['dokument'] ?? null;
if (!is_array($datei) || $datei['error'] !== UPLOAD_ERR_OK) {
http_response_code(400);
exit('Upload fehlgeschlagen.');
}
if ($datei['size'] > MAX_BYTES || !is_uploaded_file($datei['tmp_name'])) {
http_response_code(400);
exit('Datei ungültig.');
}
$finfo = new finfo(FILEINFO_MIME_TYPE);
$typ = $finfo->file($datei['tmp_name']);
if (!isset(ERLAUBT[$typ])) {
http_response_code(415);
exit('Dateityp nicht erlaubt.');
}
$name = bin2hex(random_bytes(16)) . '.' . ERLAUBT[$typ];
$ziel = ZIELORDNER . '/' . $name;
if (!move_uploaded_file($datei['tmp_name'], $ziel)) {
http_response_code(500);
exit('Speichern fehlgeschlagen.');
}
chmod($ziel, 0640);
// Aħżnu l-isem oriġinali biss bħala test fid-database
// u f'kull output eskeppjawh b'htmlspecialchars().
Għall-immaġini jixraq pass ieħor: ikkodifikaw mill-ġdid l-immaġni b'GD jew Imagick u armu l-metadata. Dan ma jissostitwixxix il-verifiki l-oħra, imma jnaqqas ir-riskju li jifdal minħabba data barranija inkorporata.
Għal dokumenti minn sorsi mhux magħrufa, pereżempju applikazzjonijiet jew ritratti ta' ilmenti, huwa sensat ukoll scan tal-viruses qabel ma jingħaddew 'il quddiem. Jipproteġi anqas is-server tal-web milli l-impjegati li aktar tard jiftħu l-fajls fuq il-kompjuters tax-xogħol tagħhom. Irreġistraw ukoll kull upload bil-ħin, il-kont, id-daqs tal-fajl u t-tip identifikat, biex mudelli mhux tas-soltu jkunu jistgħu jiġu traċċati aktar tard.
F'CMS u ħwienet il-libreriji tal-midja inkorporati ġeneralment iġibu verifiki proprji. Aktar riskjużi huma l-estensjonijiet tal-formoli, il-funzjonijiet ta' importazzjoni u paġni addizzjonali mibnija apposta, li jaħżnu fajls billi jevitaw il-librerija. Propju dawn il-postijiet għandkom tħarsu lejhom l-ewwel waqt verifika.
Ikkunsinjaw fajls mill-folder protett b'Content-Disposition: attachment u X-Content-Type-Options: nosniff. Imbagħad il-browser ma juri direttament l-ebda kontenut problematiku, imma joffrih bħala download.
Itfu l-eżekuzzjoni ta' PHP fil-folder tal-upload
Anke jekk fajl b'kontenut żbaljat jgħaddi, is-server tal-web m'għandux jesegwih bħala skript. Din it-tieni saff ta' protezzjoni tappartjeni fuq kull server li jaħżen uploads fil-webroot.
Għal Nginx b'PHP-FPM:
location ^~ /uploads/ {
location ~* \.(php|phtml|phar)$ {
deny all;
}
}
Għal Apache, l-aħjar direttament fil-VirtualHost minflok f'.htaccess, biex ir-regola ma tkunx tista' tiġi megħluba mill-applikazzjoni:
<Directory "/var/www/html/uploads">
AllowOverride None
<FilesMatch "\.(php|phtml|phar)$">
Require all denied
</FilesMatch>
</Directory>
Jekk PHP jaħdem bħala modulu ta' Apache (mod_php), fl-istess blokk tistgħu iżżidu wkoll php_admin_flag engine off. Wara l-bidla ivverifikaw b'fajl tat-test bla ħsara, li jtella' test biss, li s-server iweġibha b'403.
Limiti tad-daqs u r-rabta ma' PHP2Shell
L-uploads huma marbutin mill-qrib mal-issettjar ta' PHP post_max_size u upload_max_filesize. Fil-kuntest ta' PHP2Shell php.net jirrakkomanda bħala miżura temporanja li post_max_size jiġi ffissat fuq 8M meta ma jinħtieġu l-ebda uploads, jew fuq 32M b'uploads, u upload_max_filesize jinżamm taħtu. Din mhix protezzjoni sħiħa u ma tissostitwixxix l-aġġornament għal verżjoni rranġata ta' PHP.
; php.ini jew pool FPM (php_admin_value), wara dan erġgħu ibdew il-workers kollha
file_uploads = On
post_max_size = 32M
upload_max_filesize = 20M
max_file_uploads = 5
Jekk websajt ma teħtieġ l-ebda uploads, file_uploads = Off hija l-aktar soluzzjoni nadifa. Liema issettjar huma sensati sal-patch jinsab taħt Miżuri immedjati mingħajr patch. Drittijiet xierqa għal direttorji tal-upload tiddeskrivi l-gwida Drittijiet tal-fajls fuq is-server tal-web.
Żbalji tipiċi fil-funzjonijiet tal-upload
Meta jiġu eżaminati applikazzjonijiet eżistenti, l-istess mudelli jidhru ripetutament. Ivverifikaw il-formoli tagħkom b'mod immirat għal dawn il-punti:
- L-estensjoni tiġi vverifikata biss parzjalment, hekk li ismijiet tal-fajls b'diversi estensjonijiet jgħaddu.
- L-isem oriġinali mill-formola jispiċċa fil-mogħdija tal-ħażna. Dan jiftaħ toroq għall-manipulazzjoni tal-mogħdijiet u għas-sovrascrittura ta' fajls eżistenti.
- L-uploads jinsabu pubblikament b'ismijiet prevedibbli. Fil-każ ta' applikazzjonijiet jew kuntratti dan huwa wkoll problema ta' protezzjoni tad-data.
- Il-folder tal-upload jista' jinkiteb mis-server tal-web u fl-istess ħin jista' jiġi eżegwit.
- Estensjonijiet qodma tal-upload jew plugins tal-formoli ma jiġux aġġornati, għalkemm il-manifattur ippubblika aġġornamenti tas-sigurtà.
- L-iżbalji ma jiġux irreġistrati. Uploads miċħuda, madankollu, huma sinjal bikri ta' tentattivi immirati.
Kif tgħin PHP SOS b'mod konkret?
- Nivverifikaw il-funzjonijiet tal-upload tagħkom fil-kodiċi u fil-konfigurazzjoni tas-server u nsemmu dgħufijiet konkreti bi prijorità.
- Napplikaw is-sakra tal-eżekuzzjoni fil-folder tal-upload, drittijiet xierqa u limiti tad-daqs fil-qafas tat-Tisħiħ tas-server.
- B'suspett infittxu fid-direttorji tal-upload skripts introdotti u ninnadfuhom permezz tat-Tneħħija ta' malware tagħna.
- Fuq talba nħallu l-implimentazzjoni tiġi vverifikata b'mod indipendenti permezz ta' test ta' penetrazzjoni.
Mistoqsijiet frekwenti
Huwa biżżejjed li tiġi vverifikata l-estensjoni tal-fajl fl-upload?
Le. L-estensjoni u t-tip MIME irrapportat mill-browser ġejjin mill-mittent u jistgħu jintgħażlu liberament. Ivverifikaw il-kontenut fuq is-server, agħtu isem ġdid lill-fajl u imblukkaw l-eżekuzzjoni tal-iskripts fid-direttorju tal-uploads.
Fejn għandhom jinħażnu l-fajls mgħobbija?
L-aħjar barra mid-direttorju pubbliku tal-web. Il-konsenja imbagħad tieħu hi skript li qabel jivverifika jekk l-utent jistax jara l-fajl. Hekk il-fajls la jistgħu jinfetħu direttament u lanqas jiġu eżegwiti.
Fajls SVG bħala immaġini huma bla periklu?
Mhux awtomatikament. SVG huwa XML u jista' jkun fih kontenut attiv. Ippermettu SVG biss jekk tnaddfu l-fajls jew tikkunsinjawhom esklussivament bħala download bl-header Content-Disposition xieraq.
Id-daqs tal-upload għandu x'jaqsam ma' PHP2Shell?
Iva, indirettament. php.net jirrakkomanda bħala miżura temporanja valuri aktar baxxi għal post_max_size u upload_max_filesize. Dan inaqqas ir-riskju, imma ma jissostitwixxix l-aġġornament għal verżjoni rranġata ta' PHP u r-restart tal-workers kollha.