Fil-qosor: Local File Inclusion f'PHP tinħoloq meta include, require jew funzjonijiet tal-fajls jużaw mogħdija li l-viżitatur jista' jinfluwenza. Is-soluzzjoni sikura hija lista permessa fissa: il-parametru jagħżel biss minn valuri magħrufa, il-mogħdija nnifisha qatt ma tiġi mit-talba. Fuq in-naħa tas-server allow_url_include=Off, open_basedir u drittijiet restrittivi tal-fajls jikkompletaw il-protezzjoni.
X'inhi Local File Inclusion f'PHP?
Ħafna applikazzjonijiet eqdem ta' PHP jgħabbu l-paġni skont mudell sempliċi: parametru fl-indirizz jiddetermina liema fajl jiddaħħal. Jekk dan il-parametru jiġi mgħoddi mhux ivverifikat lil include, attakkant jista' jitlob fajls oħra fuq is-server. Fl-aħjar każ jaqra fajls ta' konfigurazzjoni b'kredenzjali. Fl-agħar każ iġiegħel lil PHP jesegwixxi kontenut li qabel poġġa x'imkien ieħor, pereżempju f'upload jew f'fajl tal-log.
Għall-maniġment hu importanti: din il-vulnerabbiltà rari tkun fil-qalba tas-CMS, imma l-aktar fi żviluppi proprji, estensjonijiet qodma jew paġni addizzjonali mibnija bil-għaġla. Ma tidhirx fil-ħajja ta' kuljum, għax il-websajt taħdem b'mod normali.
F'Remote File Inclusion PHP jgħabbi kodiċi minn indirizz barrani. Dan jippreżupponi li allow_url_include ikun attivat. F'verżjonijiet attwali ta' PHP dan l-issettjar huwa mitfi b'mod standard, imma fuq servers qodma jew ikkonfigurati ħażin għadu jinstab.
Mudelli vulnerabbli tipiċi fil-kodiċi
Fil-periklu huma postijiet fejn valur mit-talba, minn cookies jew mid-database jsir parti minn mogħdija ta' fajl. Eżempji frekwenti huma selettur tal-lingwa li jgħabbi fajl tal-lingwa skont parametru, għażla tal-paġna permezz ta' parametru fl-indirizz, għażla ta' templates jew themes u skripts ta' download għal dokumenti. .php imwaħħal fl-aħħar tal-mogħdija ma jipproteġix b'mod affidabbli, għax l-attakkanti jistgħu jaqilbu għal fajls PHP eżistenti.
L-ewwel ħarsa ġenerali tiksbuha b'tiftix għal inklużjonijiet li fihom varjabbli. Iwassal ukoll sejbiet bla ħsara, imma juri fejn għandu jitħares aktar mill-qrib:
grep -rnE --include='*.php' '(include|require)(_once)?\s*\(?\s*\$' /var/www/projekt \
| grep -v '/vendor/'
Ivverifikaw kull sejba minn fejn ġejja l-varjabbli u jekk viżitatur jistax jinfluwenzaha.
Il-mudell sikur: lista permessa minflok mogħdija mit-talba
L-aktar protezzjoni affidabbli hija li l-viżitatur jagħżel biss ċavetta u l-applikazzjoni stess tiddeċiedi liema fajl jappartjeni għaliha. Il-mogħdija qatt ma tinbena minn inputs.
<?php
declare(strict_types=1);
$seiten = [
'start' => __DIR__ . '/../vorlagen/start.php',
'leistungen' => __DIR__ . '/../vorlagen/leistungen.php',
'kontakt' => __DIR__ . '/../vorlagen/kontakt.php',
];
$wahl = is_string($_GET['seite'] ?? null) ? $_GET['seite'] : 'start';
if (!array_key_exists($wahl, $seiten)) {
http_response_code(404);
$wahl = 'start';
}
require $seiten[$wahl];
Dan il-mudell huwa qasir, faċli biex jiġi vverifikat u ma jħalli l-ebda spazju. Fi frameworks moderni r-router jieħu din il-kompitu; hemmhekk ukoll il-kontrollers u t-templates m'għandhomx qatt jiġu ddeterminati minn parametri ħielsa.
Meta l-ismijiet tal-fajls jridu jkunu dinamiċi: realpath u direttorju bażiku
Kultant lista fissa mhix prattika, pereżempju f'downloads minn folder tad-dokumenti. Allura ivverifikaw il-mogħdija solvuta kontra direttorju bażiku fiss u ippermettu biss ismijiet sempliċi ta' fajls.
<?php
declare(strict_types=1);
const BASIS = '/var/www/daten/dokumente';
function sichererPfad(string $name): string
{
if (!preg_match('/^[a-z0-9_-]{1,64}\.pdf$/', $name)) {
throw new InvalidArgumentException('Ungültiger Dateiname.');
}
$basis = realpath(BASIS);
$pfad = realpath($basis . DIRECTORY_SEPARATOR . $name);
if ($basis === false || $pfad === false
|| !str_starts_with($pfad, $basis . DIRECTORY_SEPARATOR)) {
throw new RuntimeException('Datei nicht gefunden.');
}
return $pfad;
}
// Ikkunsinjaw minflok ma tinkludu: readfile() ma jesegwix l-ebda kodiċi.
$datei = sichererPfad((string) ($_GET['datei'] ?? ''));
header('Content-Type: application/pdf');
header('Content-Disposition: attachment; filename="' . basename($datei) . '"');
readfile($datei);
Żewġ punti huma deċiżivi. L-espressjoni regolari ma tippermetti l-ebda separaturi tad-direttorji u l-ebda karattri speċjali. U l-fajls li għandhom jiġu biss ikkunsinjati jinqraw b'readfile(), mhux b'include, biex kodiċi li jinsab fihom qatt ma jiġi eżegwit. str_starts_with() hija disponibbli minn PHP 8.0.
Protezzjoni fuq in-naħa tas-server: php.ini, open_basedir u drittijiet
Kodiċi sikur huwa l-ewwel linja ta' difiża. Il-konfigurazzjoni tas-server tiżgura li żball li ma ġiex innotat jagħmel inqas ħsara.
; php.ini jew pool FPM (php_admin_value / php_admin_flag)
allow_url_include = Off
allow_url_fopen = Off ; biss jekk l-applikazzjoni ma tgħabbix URLs esterni
open_basedir = /var/www/kunde-a/:/tmp/kunde-a/
display_errors = Off
log_errors = On
allow_url_fopen ċerti applikazzjonijiet jeħtiġuh għal aġġornamenti jew interfaces. Ittestjaw it-tifi l-ewwel f'ambjent tat-test. open_basedir jillimita lil PHP għad-direttorji proprji tal-websajt, li huwa speċjalment importanti fuq servers b'diversi klijenti. Dettalji jinsabu fil-gwidi open_basedir u iżolament għal kull websajt u Kif tikkonfiguraw php.ini b'mod sikur.
Barra minn hekk, id-direttorji tal-upload u tal-cache m'għandhomx ikunu eżegwibbli u l-fajls tal-log m'għandhomx jinsabu fil-webroot. B'hekk l-attakkant jitlef il-postijiet fejn seta' jpoġġi kontenut proprju għall-inklużjoni.
Kif tagħrfu tentattivi ta' sfruttament fil-logs
Tentattivi biex file inclusion tiġi sfruttata ġeneralment iħallu traċċi fil-log tal-aċċess. Jolqtu l-għajn parametri li fihom bidliet tad-direttorju, mogħdijiet assoluti tas-sistema, stream wrappers jew indirizzi barranin sħaħ, speċjalment f'parametri bħal page, file, template jew lang. Sejba waħda ġeneralment hija scanning awtomatizzat. Importanti hu jekk talba bħal din ġietx imwieġba bil-kodiċi ta' stat 200 u b'daqs mhux tas-soltu tat-tweġiba.
Kif tipproċedu b'mod sistematiku jiddeskrivi Kif tevalwaw il-logs tas-server wara attakk. Jekk issibu indikazzjonijiet ta' aċċessi b'suċċess, ippreżumu li l-fajls ta' konfigurazzjoni nqraw u ġeddu l-kredenzjali li jinsabu fihom.
Dan jinkludi fuq kollox il-passwords tad-database, iċ-ċwievet għas-servizzi tal-ħlas u tal-ispedizzjoni, l-aċċessi SMTP u ċ-ċwievet sigrieti tas-CMS. Ivverifikaw ukoll jekk mill-ewwel aċċess suspettuż inħolqu fajls ġodda. Min seta' jaqra fajls, forsi pprova wkoll jpoġġi tiegħu. F'dan il-każ mhuwiex biss kwistjoni ta' vulnerabbiltà fil-kodiċi, imma ta' inċident tas-sigurtà li għandu jiġi ttrattat b'mod strutturat.
Assiguraw il-korrezzjonijiet b'mod dejjiemi
Wara korrezzjoni jixraq li l-funzjoni ta' protezzjoni tiġi assigurata b'testijiet awtomatizzati. Test sempliċi jgħaddi lill-għażla tal-paġna valuri mhux magħrufa, bidliet tad-direttorju u inputs vojta u jistenna fil-każijiet kollha l-paġna standard jew żball 404. Testijiet bħal dawn jipprevjenu li bidla aktar tard terġa' tiftaħ il-vulnerabbiltà mingħajr ma tiġi nnotata.
Għall-maniġment u r-responsabbli tal-proġetti tgħin mistoqsija lill-aġenzija: Hemm fl-applikazzjoni postijiet fejn il-fajls jitgħabbew skont parametri, u kif huma assigurati? Tweġiba konkreta b'postijiet misjuba u testijiet hija sinjal tajjeb.
Kif tgħin PHP SOS b'mod konkret?
- Infittxu fil-kodiċi tagħkom b'mod immirat għal
include,requireu funzjonijiet tal-fajls b'inputs mit-talba u nevalwaw kull sejba. - Niffissaw
allow_url_include,open_basediru drittijiet xierqa għal kull websajt u nivverifikaw li l-applikazzjoni tkompli taħdem wara. - Nevalwaw il-logs għal tentattivi ta' sfruttament u niċċaraw jekk il-kredenzjali jridux jiġu mġedda.
- Għal verifika indipendenti noffru awdit tas-sigurtà b'test ta' penetrazzjoni għal applikazzjonijiet ta' PHP.
Mistoqsijiet frekwenti
X'inhi d-differenza bejn LFI u RFI?
F'Local File Inclusion l-applikazzjoni tgħabbi fajl li diġà jinsab fuq is-server, imma li ma kellux jitgħabba. F'Remote File Inclusion jitgħabba kodiċi minn indirizz barrani. RFI jippreżupponi issettjar mhux sikur ta' PHP, LFI le.
Huwa biżżejjed li neħħi ../ mill-parametru?
Le. Filtri bħal dawn spiss jistgħu jiġu evitati b'kodifika jew varjanti u ma jaqbdux mogħdijiet assoluti. Sikura hija biss assenjazzjoni fissa ta' valuri permessi għal fajls jew verifika tal-mogħdija solvuta kontra direttorju bażiku.
open_basedir jipproteġi għal kollox minn file inclusion?
Le, jillimita biss id-direttorji li PHP jista' jaċċessa. Ġewwa dawn il-limiti vulnerabbiltà tibqa' tista' tiġi sfruttata. open_basedir huwa saff addizzjonali ta' protezzjoni u ma jissostitwixxix kodiċi sikur.
CMS bħal WordPress huma affettwati minn LFI?
Il-qalba tas-CMS komuni titqies f'dan il-punt bħala verifikata tajjeb. Vulnerabbiltajiet jidhru aktar fl-estensjonijiet, fit-themes u fi żviluppi proprji. Aġġornamenti tal-estensjonijiet u ħarsa lejn l-avviżi tas-sigurtà tagħhom huma għalhekk importanti.