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:
- 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.
- Ippermettu biss HTTPS: Eskludu protokolli oħra bħal
file,gopherjewftpf'cURL, anke għal redirects. - Issegwux redirects: Indirizz permess jista' inkella jibgħat lejn mira interna.
- 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.
- 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.
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.