Sitwazzjoni attwali: PHP2Shell. Żewġ vulnerabbiltajiet kritiċi ta' PHP (CVSS 9,2) jippermettu kodiċi malizzjuż mingħajr login. Patches mill-21/10/2026.X'għandu jsir issa →

Evita Server-Side Request Forgery (SSRF) f'PHP

Kif l-iżviluppaturi jevitaw li applikazzjoni PHP tistaqsi sistemi interni f'isem barranin: listi ta' permess, restrizzjoni tal-protokoll, verifika tal-indirizz riżolut u limiti fin-netwerk.

Stat 6 min. qariŻvilupp sigur

Fil-qosor: SSRF f'PHP tevitawh billi l-applikazzjoni tagħkom titlob biss indirizzi li jinsabu fuq lista fissa ta' permess, esklussivament permezz ta' HTTPS, mingħajr ma ssegwi redirects. L-indirizz IP riżolut jiġi vverifikat kontra firxiet privati u riżervati u mbagħad jinżamm għall-konnessjoni. Firewall għat-traffiku ħerġin tiżgura li sistemi interni jibqgħu mhux aċċessibbli anke jekk ikun hemm żball fil-kodiċi.

Meta s-server proprju jagħmel talbiet għal barranin

Previews ta' links f'chat, importazzjoni ta' immaġini ta' prodott permezz ta' URL, webhooks lejn sistemi ta' sħab, feed reader fis-CMS: ħafna applikazzjonijiet PHP jitolbu indirizzi li utent indika. Din hija funzjoni utli u fl-istess ħin bieb lejn ġewwa.

Fil-każ ta' Server-Side Request Forgery, fil-qosor SSRF, attakkant iġiegħel lill-applikazzjoni tibgħat talba lejn mira li hu jagħżel. L-għajb: it-talba tiġi mis-server innifsu. B'hekk tilħaq sistemi li huma mblukkati mill-barra, bħal databases, interfaces ta' amministrazzjoni fin-netwerk intern, servizzi li jisimgħu biss fuq localhost, jew is-servizzi ta' metadata tal-fornituri tal-cloud.

Fl-OWASP Top 10 tal-2021 SSRF kienet kategorija għaliha. F'proġetti PHP il-vulnerabbiltà ħafna drabi tidher fejn xi ħadd mgħaġġel bena funzjoni „żid immaġni b'URL“.

SSRF f'PHP: liema funzjonijiet jitolbu indirizzi

Mhux biss cURL jitlob indirizzi. Dawn il-postijiet għandkom iżommu f'moħħkom:

Funzjoni jew qasam Għaliex rilevanti
cURL (curl_exec()) l-aktar mod frekwenti, ħafna protokolli possibbli
file_get_contents(), fopen(), copy() b'URL jużaw URL wrappers meta allow_url_fopen ikun attiv
getimagesize() u libreriji tal-immaġini jistgħu jgħabbu fajls mill-bogħod
Ipproċessar ta' XML, klijenti SOAP f'ċerti ċirkostanzi jgħabbu riżorsi esterni
Libreriji HTTP bħal Guzzle jibnu fuq cURL jew streams, l-istess regoli

Jekk l-applikazzjoni tagħkom m'għandhiex bżonn tiftaħ fajls mill-bogħod permezz ta' funzjonijiet tal-fajls, itfu allow_url_fopen fuq in-naħa tas-server. Suġġett relatat, l-inklużjoni ta' fajls permezz ta' mogħdijiet mit-talba, jittrattah il-gwida Evita Local u Remote File Inclusion.

Id-difiża fi ħames passi

OWASP jirrakkomanda taħlita ta' miżuri li waħedhom kull waħda tista' tiġi evitata, imma flimkien iżommu:

  1. Lista ta' permess minflok URL ħieles: L-aħjar li l-utent jagħżel biss minn miri magħrufa, jew jindika biss identifikatur, u l-applikazzjoni tibni l-indirizz hi stess.
  2. Ippermettu biss HTTPS: Eskludu protokolli oħra bħal file, gopher jew ftp f'cURL, anke għal redirects.
  3. Issegwux redirects: Indirizz permess jista' inkella jibgħat lejn mira interna.
  4. Ivverifikaw u żommu l-indirizz riżolut: Irriżolvu l-hostname, ivverifikaw l-IP kontra firxiet privati, loopback u link-local u uża eżattament dan l-IP għall-konnessjoni. Inkella riżoluzzjoni DNS tat-tieni darba tista' tagħti mira differenti.
  5. Illimitaw in-netwerk: Is-server tal-web jista' jilħaq mill-barra biss il-miri li jeħtieġ.

Mudell sigur b'cURL

L-eżempju li ġej japplika l-passi 1 sa 4 għal IPv4. Hostnames u fluss huma eżempji; għal IPv6 japplikaw l-istess verifiki.

<?php
declare(strict_types=1);

function ladeVonPartner(string $url): string
{
    $teile = parse_url($url);
    if (!is_array($teile) || ($teile['scheme'] ?? '') !== 'https'
        || isset($teile['user']) || isset($teile['pass']) || isset($teile['port'])) {
        throw new InvalidArgumentException('Adresse nicht erlaubt.');
    }

    $host = strtolower($teile['host'] ?? '');
    $erlaubt = ['api.partner.example', 'bilder.partner.example'];
    if (!in_array($host, $erlaubt, true)) {
        throw new InvalidArgumentException('Ziel nicht erlaubt.');
    }

    $ip = gethostbyname($host);
    $oeffentlich = filter_var($ip, FILTER_VALIDATE_IP,
        FILTER_FLAG_IPV4 | FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE);
    if ($oeffentlich === false) {
        throw new RuntimeException('Ziel löst auf eine nicht erlaubte Adresse auf.');
    }

    $ch = curl_init($url);
    curl_setopt_array($ch, [
        CURLOPT_RETURNTRANSFER  => true,
        CURLOPT_FOLLOWLOCATION  => false,
        CURLOPT_PROTOCOLS       => CURLPROTO_HTTPS,
        CURLOPT_REDIR_PROTOCOLS => CURLPROTO_HTTPS,
        CURLOPT_RESOLVE         => [$host . ':443:' . $ip],
        CURLOPT_CONNECTTIMEOUT  => 3,
        CURLOPT_TIMEOUT         => 10,
    ]);
    $antwort = curl_exec($ch);
    if ($antwort === false) {
        throw new RuntimeException('Abruf fehlgeschlagen.');
    }
    return $antwort;
}

Xi dettalji huma importanti. gethostbyname() f'każ ta' żball jirritorna l-hostname; il-verifika sussegwenti tal-IP taqbad dan. Il-flags FILTER_FLAG_NO_PRIV_RANGE u FILTER_FLAG_NO_RES_RANGE jeskludu, skont il-manwal ta' PHP, fost oħrajn il-firxiet 10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16, 127.0.0.0/8 u 169.254.0.0/16. Minn PHP 8.2 hemm ukoll FILTER_FLAG_GLOBAL_RANGE, li jippermetti biss indirizzi validi globalment. CURLOPT_RESOLVE jiżgura li cURL juża eżattament l-indirizz vverifikat, filwaqt li l-hostname u l-verifika taċ-ċertifikat jinżammu.

Żewġ punti oħra jillimitaw dak li attakkant jitgħallem minn vulnerabbiltà SSRF. Tirritornawx tweġibiet u messaġġi ta' żball tal-mira mitluba lill-utent mhux iffiltrati: anke d-distinzjoni bejn „konnessjoni rifjutata“ u „timeout“ turi liema servizzi interni jeżistu. U illimitaw il-ħin u d-daqs tat-tweġiba, biex il-funzjoni ma tkunx adattata biex tgħabbi żżejjed is-server proprju. Webhooks lejn indirizzi li l-klijenti stess jidħlu l-aħjar tibagħtuhom minn kju u mhux waqt it-talba li taħdem.

Importanti

Jekk l-applikazzjoni tagħkom tassew trid titlob indirizzi arbitrarji, pereżempju għal previews tal-links, ibdlu din il-funzjoni għal servizz separat mingħajr aċċess għan-netwerk intern. Lista ta' permess mbagħad mhijiex possibbli, is-separazzjoni tan-netwerk hija aktar importanti.

Il-livell tan-netwerk bħala xibka tas-sigurtà

Verifiki tal-kodiċi jistgħu jkollhom nuqqasijiet, pereżempju meta żewġ libreriji jaqsmu URL b'mod differenti. OWASP jagħti parir li inkonsistenzi bħal dawn jiġu trattati bħala rifjut u li jiġi llimitat ukoll fil-livell tan-netwerk. Server tal-web mill-barra ġeneralment jeħtieġ ftit miri: sorsi tal-pakketti, fornituri tal-ħlas u tal-konsenja, mail relay, ċerti interfaces.

Firewall għat-traffiku ħerġin jgħin darbtejn. Twaqqaf talbiet SSRF lejn in-netwerk intern, u wara dħul, pereżempju permezz ta' verżjoni mhux ippatchjata ta' PHP, tagħmel aktar diffiċli t-tagħbija ta' għodod ulterjuri. Kif tibnu r-regoli jiddeskrivi Firewall għas-server tal-web: iftħu biss il-ports meħtieġa. Liema konnessjonijiet server jibni fil-fatt juri Ivverifika l-konnessjonijiet ħerġin ta' server.

F'ambjenti tal-cloud tappartjeni l-verżjoni sodda tas-servizz ta' metadata. OWASP għal AWS isemmi l-bidla għal IMDSv2 u l-itfi ta' IMDSv1.

Sib SSRF fil-kodiċi eżistenti

Bidu mgħaġġel huwa t-tfittxija għal postijiet fejn funzjonijiet ta' talba jirċievu valuri mit-talba:

grep -rnE "(curl_init|file_get_contents|fopen|getimagesize|copy)\s*\(" src/ --include="*.php" | grep -E '\$_(GET|POST|REQUEST)|\$url'
grep -rn "CURLOPT_FOLLOWLOCATION" src/ --include="*.php"

Il-hits huma ordnijiet ta' verifika. Partikolarment bir-reqqa għandkom tħarsu lejn funzjonijiet li l-admins jużaw: importazzjonijiet, issettjar ta' webhooks, verifiki tal-aġġornamenti tal-plugins.

Faċilment jiġu injorati l-ġeneraturi tal-PDF li jibdlu HTML b'immaġini jew stylesheets inkorporati f'dokumenti. Jekk parti minn dan l-HTML tiġi minn inputs tal-utent, pereżempju fil-fatturi b'logo li jintgħażel liberament, il-ġeneratur f'ċerti ċirkostanzi jitlob indirizzi li l-utent jiddetermina. Ivverifikaw hemmhekk l-issettjar għat-tagħbija ta' riżorsi mill-bogħod u itfuh jekk mhux meħtieġ.

Kif tgħin PHP SOS b'mod konkret?

  • Infittxu l-postijiet kollha fejn l-applikazzjoni tagħkom titlob indirizzi, anke fil-plugins u fil-libreriji.
  • Nibnu funzjoni ċentrali ta' talba b'lista ta' permess, restrizzjoni tal-protokoll u verifika tal-IP.
  • Niddefinixxu regoli għat-traffiku ħerġin u nipproteġu s-servizzi ta' metadata f'ambjenti tal-cloud.
  • Nivverifikaw l-implimentazzjoni mill-barra u niddokumentaw il-miri permessi.

Verifika indipendenti tal-applikazzjoni tagħkom tiddeskriviha Awditu tas-sigurtà u test ta' penetrazzjoni.

Mistoqsijiet frekwenti

Liema funzjonijiet ta' PHP jistgħu jiġu abbużati għal SSRF?

Dawk kollha li jitolbu indirizz minn inputs tal-utent: cURL, file_get_contents u fopen b'URL wrappers, funzjonijiet tal-immaġini u tal-XML li jgħabbu fajls mill-bogħod, kif ukoll libreriji għal webhooks, feeds jew previews tal-links.

Huwa biżżejjed li nibblokkaw indirizzi IP interni?

Waħdu le. OWASP jiddeskrivi listi ta' blokk bħala vulnerabbli għall-evitar u jirrakkomanda listi ta' permess. Barra minn hekk l-applikazzjoni trid tuża eżattament l-indirizz li vverifikat u ma għandhiex issegwi redirects.

Għaliex SSRF huwa partikolarment kritiku fil-cloud?

Il-fornituri tal-cloud jagħtu lill-istanzi servizzi interni ta' metadata, li minnhom parzjalment jistgħu jinġiebu dettalji tal-aċċess. Jekk applikazzjoni tista' tibgħat talbiet hemmhekk, attakkant jista' jilħaq din id-data permezz tagħha. Il-fornituri joffru verżjonijiet sodi ta' dawn is-servizzi li għandhom ikunu attivati.

X'jgħin firewall għat-traffiku ħerġin?

Tillimita liema miri s-server jista' jilħaq fl-ewwel lok. Anke jekk verifika fil-kodiċi tfalli, sistemi interni jibqgħu mhux aċċessibbli. Barra minn hekk, wara dħul tagħmel aktar diffiċli t-tagħbija ta' kodiċi malizzjuż u t-tnixxija tad-data.

Sorsi

Kuntatt immedjat

Kull siegħa tgħodd. Iktbu lilna issa.

Iddeskrivu fil-qosor is-sistema, il-verżjoni ta' PHP u dak li osservajtu. Nikkuntattjawkom, niċċaraw is-sitwazzjoni u naħdmu mill-bogħod sakemm l-inċident jingħalaq u jiġi ddokumentat.

Għajnuna immedjata