# Evita Command Injection f'PHP

> Evita Command Injection f'PHP: tuża shell, proc_open b'array, uża escapeshellarg sewwa u sib sejħiet perikolużi fil-kodiċi eżistenti.

Sors: https://phpsos.de/mt/blog/command-injection-php/  
Stat: 25/10/2026  
Fornitur: PHP SOS, Għajnuna ta' emerġenza għal PHP u sigurtà tas-server. Għajnuna immedjata fuq WhatsApp: https://wa.me/491736494914?text=Bongu%20PHP%20SOS%2C%20g%C4%A7andna%20b%C5%BConn%20g%C4%A7ajnuna%20bis-server%20tal-PHP%20tag%C4%A7na.%20Kumpanija%3A%20%E2%80%A6%20Websajt%3A%20%E2%80%A6

**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
<?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: `ZipArchive` jew `PharData`
- 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](https://phpsos.de/mt/ratgeber/disable-functions/).

## 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
<?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()`:

1. **Argument injection tibqa' possibbli:** Valur mimsuħ li jibda b'trattin (-) xorta jinqara mill-programm fil-mira bħala għażla.
2. **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.
3. **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:

```bash
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](https://phpsos.de/mt/blog/rechte-des-webserver-benutzers/).

> **Importanti:**
> 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](https://phpsos.de/mt/blog/webserver-startet-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](https://phpsos.de/mt/leistungen/sicherheitsaudit-penetrationstest/).


## 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.

## Sorsi

- [OWASP OS Command Injection Defense Cheat Sheet](https://cheatsheetseries.owasp.org/cheatsheets/OS_Command_Injection_Defense_Cheat_Sheet.html)
- [Manwal ta' PHP: proc_open](https://www.php.net/manual/de/function.proc-open.php)
- [Manwal ta' PHP: escapeshellarg](https://www.php.net/manual/de/function.escapeshellarg.php)
