Fil-qosor: Command Injection f'PHP tevitawha l-aktar b'mod sigur billi ma ssejħu l-ebda shell: ħafna kompiti jiġu mwettqa direttament minn funzjonijiet jew libreriji ta' PHP. Fejn hemm bżonn programm estern, minn PHP 7.4 tgħaddu l-kmand bħala array lil proc_open(), u PHP imbagħad jibda l-programm mingħajr shell. Il-valuri tivverifikawhom kontra lista ta' permess, taghlqu l-għażliet b'-- u thalluh il-proċess jaħdem bid-drittijiet minimi.
Għaliex sejħa tas-sistema għandha daqshekk setgħa
Immaniġġjar ta' immaġini, ġenerazzjoni ta' PDF, arkivjar, skan tal-viruses, mistoqsija ta' entrata DNS: għal kompiti bħal dawn l-applikazzjonijiet PHP jieħdu pjaċir isejħu programmi esterni. Teknikament dan huwa komdu, linja waħda b'exec() jew shell_exec() hija biżżejjed. Mil-lat tas-sigurtà huwa wieħed mill-aktar postijiet perikolużi fil-kodiċi.
Meta kmand jinġabar bħala test u jiġi eżegwit minn shell, hija s-shell li tiddeċiedi x'inhu kmand u x'inhi data. Jekk valur minn barra jidħol mingħajr verifika, jista' jibdel it-tifsira tal-kmand. Il-konsegwenza fl-agħar każ hija l-istess bħal b'PHP2Shell: eżekuzzjoni ta' kmandi arbitrarji fuq is-server bid-drittijiet tal-proċess ta' PHP.
Id-differenza: PHP2Shell tirranġawha b'aġġornament ta' PHP. Command Injection fil-kodiċi proprju tibqa' wara kull aġġornament. Barra minn hekk postijiet bħal dawn spiss jinsabu fi skripts awżiljarji maħsuba għall-admins biss, pereżempju għal manutenzjoni, dijanjostika jew importazzjonijiet, u aktar tard jibqgħu aċċessibbli mingħajr protezzjoni.
Fejn tinħoloq Command Injection f'PHP
Kull post fejn PHP jibda shell jew programm huwa f'riskju. Il-funzjonijiet għal dan huma:
| Funzjoni | Tuża shell? | Nota |
|---|---|---|
exec(), system(), passthru(), shell_exec() |
iva | Kmand bħala test, is-shell tinterpretah |
| Operatur backtick | iva | jikkorrispondi għal shell_exec() |
popen() |
iva | Kmand bħala test |
proc_open() b'string |
iva | Kmand bħala test |
proc_open() b'array |
le | minn PHP 7.4, l-argumenti jiġu mgħoddija direttament |
mail() bil-ħames parametru |
indirettament | parametri addizzjonali lill-programm tal-posta |
Mudell tipiku mhux sigur jidher hekk. L-isem tal-fajl jiġi mit-talba u jispiċċa direttament fil-linja tal-kmand:
<?php
// MHUX SIGUR: valur mit-talba jsir parti minn kmand tas-shell
$datei = $_POST['datei'];
exec('convert uploads/' . $datei . ' -resize 800x800 vorschau/' . $datei);
L-ewwel għażla: l-ebda shell
L-aktar protezzjoni effettiva hija li tissostitwixxu s-sejħa tas-sistema. OWASP isemmi dan espliċitament bħala l-ewwel linja ta' difiża. Għal ħafna kompiti PHP għandu funzjonijiet jew estensjonijiet proprji:
- Direttorji u fajls:
mkdir(),copy(),rename(),unlink() - Arkivji:
ZipArchivejewPharData - Immaġini: GD jew Imagick bħala estensjoni ta' PHP
- Mistoqsijiet tan-netwerk:
dns_get_record(),gethostbyname(), cURL - Checksums:
hash_file()
B'hekk il-mistoqsija dwar liema karattri tinterpreta s-shell tisparixxi kompletament. Barra minn hekk il-funzjonijiet għal kmandi tas-sistema jistgħu mbagħad jiġu mblukkati fil-konfigurazzjoni, kif jiddeskrivi l-gwida Uża disable_functions sewwa.
Meta jkun hemm bżonn programm estern: proc_open b'array
Minn PHP 7.4 proc_open() jaċċetta l-kmand bħala array. Skont il-manwal ta' PHP il-proċess jinbeda mbagħad direttament, mingħajr triq mill-shell, u PHP jieħu ħsieb il-maskerar meħtieġ tal-argumenti. Karattri bħal punt u virgola jew pipe ma jkollhomx aktar tifsira speċjali.
<?php
declare(strict_types=1);
$name = basename((string) ($_POST['datei'] ?? ''));
if (!preg_match('/^[a-z0-9_-]{1,64}\.(jpg|png)$/', $name)) {
throw new InvalidArgumentException('Ungültiger Dateiname.');
}
$befehl = ['/usr/bin/convert', '/srv/app/uploads/' . $name, '-resize', '800x800',
'/srv/app/vorschau/' . $name];
$prozess = proc_open($befehl, [1 => ['pipe', 'w'], 2 => ['pipe', 'w']], $pipes);
if (!is_resource($prozess)) {
throw new RuntimeException('Programm konnte nicht gestartet werden.');
}
$fehlerausgabe = stream_get_contents($pipes[2]);
$status = proc_close($prozess);
Tliet affarijiet jagħmlu l-eżempju robust: il-programm huwa fiss fil-kodiċi bil-mogħdija sħiħa, l-isem tal-fajl jiġi vverifikat kontra mudell dejjaq, u kull argument varjabbli jibda b'mogħdija assoluta, għalhekk ma jistax jinqara bħala għażla. Fejn valur ikun waħdu, agħlqu l-għażliet b'--, sakemm il-programm jappoġġjah skont id-dokumentazzjoni, jew irrifjutaw valuri li jibdew b'trattin (-).
Għal kompiti li regolarment jeħtieġu programmi esterni, pereżempju proċessar ta' immaġini jew PDF fuq skala akbar, jixraq tisseparaw: l-applikazzjoni tal-web tpoġġi biss ordni f'kju, servizz separat fl-isfond b'utent proprju u drittijiet proprji jeżegwiha. Il-proċess ta' PHP li jwieġeb talbiet mill-internet ma jibqax jeħtieġ funzjonijiet għal kmandi tas-sistema, u jistgħu jiġu mblukkati għalih. Programmi esterni għandu jkollhom ukoll limiti ta' ħin u memorja, biex ordni waħda ma tibblokkax is-server.
Każ speċjali huwa mail(). Il-ħames parametru jgħaddi għażliet addizzjonali lill-programm tal-posta tas-sistema. Valuri minn formoli, pereżempju indirizz tal-mittent, qatt m'għandhom jispiċċaw hemmhekk mingħajr verifika. Aktar robusta hija librerija tal-posta li tibgħat permezz ta' SMTP u ma teħtieġx sejħa tas-sistema.
escapeshellarg: uża sewwa u agħraf il-limiti
Fejn il-kodiċi eżistenti għadu jaħdem b'linji ta' kmand, escapeshellarg() għal kull valur individwali huwa l-minimu. Il-funzjoni tpoġġi l-valur bejn il-kwotazzjonijiet, biex is-shell tittrattah bħala eżattament argument wieħed. escapeshellcmd() mhuwiex adattat għall-inputs tal-utent, għax jippermetti parametri addizzjonali, kif juri OWASP b'eżempju.
Limiti importanti ta' escapeshellarg():
- Argument injection tibqa' possibbli: Valur mimsuħ li jibda b'trattin (-) xorta jinqara mill-programm fil-mira bħala għażla.
- Windows iġib ruħu differenti: Hemmhekk il-funzjoni, skont il-manwal, tissostitwixxi ċerti karattri bħal
%u"b'spazji; il-valuri jaslu għalhekk mibdula. - Sett tal-karattri: Skont l-issettjar tal-locale tas-server, karattri mhux ASCII jistgħu jintilfu.
Sib il-postijiet fil-kodiċi eżistenti
Tfittxija għal sejħiet tas-sistema ssir malajr u tagħti lista maniġġabbli:
grep -rnE "\b(exec|system|passthru|shell_exec|popen|proc_open)\s*\(" src/ --include="*.php"
grep -rn '`' src/ --include="*.php" | grep -v '^\s*//'
Kull post misjub jeħtieġ tweġiba għal tliet mistoqsijiet: is-sejħa tista' tiġi sostitwita b'funzjonijiet ta' PHP? Valuri minn barra jidħlu fiha? Bid-drittijiet ta' min jaħdem il-proċess? L-aħħar mistoqsija hija deċiżiva għad-dannu fil-każ serju. Proċess ta' PHP b'utent proprju u mingħajr drittijiet ta' kitba fuq il-kodiċi jagħmel inqas ħsara, ara Least Privilege: id-drittijiet tal-utent tas-server tal-web.
Jekk proċess ta' PHP-FPM jew tas-server tal-web jibda shell, dan huwa sinjal b'saħħtu ta' twissija ta' dħul. Kif tagħrfuh jiddeskrivi Sinjal ta' twissija: is-server tal-web jibda shell.
Kif tgħin PHP SOS b'mod konkret?
- Infittxu s-sejħiet kollha tas-sistema fl-applikazzjoni tagħkom, fil-plugins u fi skripts awżiljarji.
- Nissostitwixxu sejħiet, fejn possibbli, b'funzjonijiet ta' PHP u nibdlu l-bqija għal sejħiet mingħajr shell.
- Nibblukkaw funzjonijiet mhux meħtieġa fil-konfigurazzjoni ta' PHP u nivverifikaw id-drittijiet tal-utent ta' PHP.
- Nittestjaw il-bidliet u niddokumentaw liema programmi l-applikazzjoni għad tista' ssejjaħ.
Il-verifika tas-softwer proprju noffruha bħala Awditu tas-sigurtà u test ta' penetrazzjoni.
Mistoqsijiet frekwenti
escapeshellarg huwa biżżejjed kontra Command Injection?
Jevita li valur jiġi eżegwit bħala kmand ieħor. Ma jevitax li l-valur jinqara bħala għażla tal-programm imsejjaħ, jekk jibda b'trattin (-). Għalhekk ivverifikaw ukoll il-valuri u, fejn il-programm jappoġġjah, agħlqu l-għażliet b'--.
X'inhi d-differenza bejn escapeshellarg u escapeshellcmd?
escapeshellarg jittratta valur wieħed bħala eżattament argument wieħed. escapeshellcmd jimmaskra biss metakarattri f'linja sħiħa ta' kmand u jippermetti parametri addizzjonali. Għall-inputs tal-utent escapeshellarg hija l-għażla t-tajba, sejħa mingħajr shell hija saħansitra aħjar.
Għandi nbluka exec u system b'disable_functions?
Jekk l-applikazzjoni tagħkom ma teħtiġhomx, iva. Dan jillimita d-dannu wara dħul. Imma ma jissostitwix kodiċi sigur, għax applikazzjonijiet li jeħtieġu kmandi xorta jeħtieġu l-funzjonijiet.
Kif nagħraf jekk Command Injection ġietx sfruttata?
Sinjal b'saħħtu ta' twissija huma proċessi ta' PHP jew tas-server tal-web li jibdew shell bħal sh jew bash. Ta' dan jiżdiedu proċessi mhux magħrufa, fajls ġodda fil-folders tal-upload u konnessjonijiet ħerġin mhux tas-soltu.