Go achomair: Cuireann tú cosc ar XXE i PHP trí XML ó fhoinsí coimhthíocha a luchtú gan na roghanna LIBXML_NOENT, LIBXML_DTDLOAD agus LIBXML_DTDVALID, doiciméid le DTD dá gcuid féin a dhiúltú agus luchtóir eintitis a shocrú a dhiúltaíonn acmhainní seachtracha. Ó libxml 2.9.0 ní chuireann PHP eintitis in ionad a chéile de réir réamhshocraithe a thuilleadh, agus is é sin an fáth a bhfuil libxml_disable_entity_loader() as dáta ó PHP 8.0. Ó PHP 8.4 le libxml 2.13 tá LIBXML_NO_XXE ar fáil ina theannta sin.
Seanlaige nach n-imíonn
Measann a lán forbróirí gur topaic réitithe é XML External Entities, XXE go hachomair. Mhúch PHP luchtú eintiteas seachtrach de réir réamhshocraithe le leaganacha nua-aimseartha de libxml, agus marcáladh an tseanfheidhm chosanta mar fheidhm as dáta le PHP 8.0. Fós féin leanann laigí XXE de bheith le feiceáil i seiceálacha.
Is beagnach i gcónaí ceann de thrí chás atá mar chúis leis: Shocraigh duine rogha chun fadhb allmhairithe a réiteach agus mar sin d'athchumasaigh sé ionadaíocht eintiteas. Déanann leabharlann é sin go hinmheánach. Nó ritheann an feidhmchlár ar sheanchóras a bhfuil a PHP tógtha le libxml an-sean.
Tá XXE contúirteach toisc go luchtaíonn an parsálaí XML ábhar a dtagraítear dó sa doiciméad amháin: comhaid áitiúla nó seoltaí sa líonra. Is féidir leis na hiarmhairtí a bheith comhaid chumraíochta a léamh, iarratais ar chórais inmheánacha cosúil le SSRF agus ró-ualú an fhreastalaí.
Cad atá bailí ó libxml 2.9 agus PHP 8.0
Déanann lámhleabhar PHP cur síos ar an staid mar seo: ó libxml 2.9.0 ar aghaidh tá ionadú eintiteas díchumasaithe de réir réamhshocraithe. Dá bhrí sin ní gá eintitis sheachtracha a mhúchadh ar leith a thuilleadh, mura bhfuil tagairtí eintitis inmheánacha le réiteach le roghanna áirithe. As sin a thagann an forbhreathnú seo:
| Rogha | Éifeacht | Riosca le XML coimhthíoch |
|---|---|---|
LIBXML_NOENT |
cuireann sí eintitis in ionad a chéile | de réir an lámhleabhair, is féidir leis ionsaithe XXE a éascú |
LIBXML_DTDLOAD |
luchtaíonn an fo-thacar seachtrach | cumasaíonn luchtú eintiteas seachtrach |
LIBXML_DTDVALID |
bailíochtaíonn i gcoinne an DTD | is féidir leis ionsaithe XXE a éascú |
LIBXML_NONET |
toirmisceann rochtain líonra le linn luchtaithe | rogha chosanta bhreise |
LIBXML_NO_XXE |
múchann eintitis sheachtracha le linn ionadaíochta | cosantach, ó PHP 8.4 agus libxml 2.13.0 |
LIBXML_PARSEHUGE |
cuireann teorainneacha inmheánacha an pharsálaí ar ceal | éascaíonn ró-ualú, do shonraí iontaofa amháin |
Is cunning aitheanta é ainm míthreorach LIBXML_NOENT: Fuaimníonn sé mar „gan eintitis“, ach déanann sé a mhalairt.
Don fhorbróir ciallaíonn sé seo: Ní hé XML a luchtú atá contúirteach as féin, ach gach áit a athraíonn an gnáthiompar d'aon ghnó. Is é cuardach ar na tairisigh seo sa chód an bealach is tapúla chuig measúnú tosaigh dá bhrí sin, roimh aon seiceáil chasta.
XXE a chosc i PHP go slán: patrún do DOMDocument
Comhcheanglaíonn an sampla seo a leanas roinnt sraitheanna cosanta. Socraíonn sé luchtóir eintitis a dhiúltaíonn gach acmhainn sheachtrach, luchtaíonn sé gan roghanna contúirteacha agus diúltaíonn do dhoiciméid le DTD dá gcuid féin:
<?php
declare(strict_types=1);
function ladeFremdesXml(string $xml): DOMDocument
{
// Acmhainní seachtracha a dhiúltú go bunúsach
libxml_set_external_entity_loader(
static fn (?string $public, string $system, array $context) => null
);
$optionen = LIBXML_NONET;
if (defined('LIBXML_NO_XXE')) {
$optionen |= LIBXML_NO_XXE;
}
$vorher = libxml_use_internal_errors(true);
$dom = new DOMDocument();
$ok = $dom->loadXML($xml, $optionen);
libxml_use_internal_errors($vorher);
if (!$ok) {
throw new InvalidArgumentException('XML ungültig.');
}
if ($dom->doctype !== null) {
throw new InvalidArgumentException('Dokumente mit DTD werden nicht angenommen.');
}
return $dom;
}
De réir lámhleabhar PHP cuireann luach ar ais null sa luchtóir cosc ar an acmhainn sheachtrach a luchtú. Tugann OWASP le fios nach leor null a thabhairt go díreach do libxml_set_external_entity_loader(); teastaíonn feidhm a thugann null ar ais. Baineann na roghanna céanna le SimpleXML agus XMLReader. Nuair is féidir, molann OWASP DTDanna a dhiúltú go hiomlán.
Má is féidir leat an fhormáid sonraí a chinneadh tú féin, is minic gurb é JSON an rogha is simplí don mhalartú idir do chórais féin. I gcás formáidí coimhthíocha ar nós SAML nó comhaid Office, ní féidir XML a sheachaint.
Ionchuir XML fholaithe a aimsiú
Próiseálann a lán feidhmchlár níos mó XML ná mar a cheapann a bhforbróirí. Téigh tríd an liosta seo:
- Comhéadain: cliaint agus freastalaithe SOAP, XML-RPC, seirbhísí íocaíochta agus seoltóireachta le freagraí XML.
- Logáil isteach: Tá single sign-on le SAML bunaithe ar dhoiciméid XML a thagann ón taobh amuigh.
- Allmhairithe: sonraí táirgí, fothaí, sitemaps, formáidí catalóige.
- Uaslódálacha: Is XML iad íomhánna SVG; tá formáidí Office ar nós DOCX agus XLSX comhdhéanta go hinmheánach de chomhaid XML.
- Leabharlanna: pacáistí Composer do dhoiciméid, do thaenna nó do SAML a úsáideann libxml go hinmheánach.
Sa chód cabhraíonn dhá chuardach:
grep -rnE "LIBXML_(NOENT|DTDLOAD|DTDVALID|PARSEHUGE)" src/ vendor/ --include="*.php"
grep -rnE "(loadXML|simplexml_load_(string|file)|XMLReader|->load\()" src/ --include="*.php"
Ní cúis scaoill iad torthaí i vendor/, ach is cúis iad leagan agus fógraí slándála na leabharlainne a sheiceáil.
Le huaslódálacha SVG ní hé XXE ach ceann amháin de roinnt rioscaí, mar is féidir scripteanna a bheith i gcomhaid SVG freisin. Mura bhfuil an fhormáid riachtanach d'fheidhmchlár, ná ceadaigh í d'uaslódálacha ar chor ar bith. Seachas sin próiseáil SVG leis an bpatrún slán thuas amháin agus seachaid na comhaid ionas nach ritheann an brabhsálaí scripteanna atá iontu.
Tabhair aird ar theachtaireachtaí earráide freisin. Má thugann feidhmchlár teachtaireachtaí libxml ar ais d'úsáideoirí gan scagadh, d'fhéadfadh codanna den ábhar a próiseáladh a bheith iontu. Baineann earráidí leis an loga, faigheann an t-úsáideoir teachtaireacht ghinearálta; sa sampla thuas cinntíonn libxml_use_internal_errors(true) nach dtéann rabhaidh isteach san aschur. Cuir teorainn freisin le méid na ndoiciméad XML a fhaightear sula bhfeiceann an parsálaí iad ar chor ar bith.
Seanchórais: nuair a bhíonn an gnáthchosaint ar iarraidh
Braitheann an chosaint ón ngnáthiompar ar leagan libxml lenar tógadh PHP. Taispeánann php -r 'echo LIBXML_DOTTED_VERSION, PHP_EOL;' ar an líne ordaithe cén leagan atá ag rith, nó aschur phpinfo() i dtimpeallacht chosanta. Seiceáil an luach do gach leagan PHP ar an bhfreastalaí, mar is féidir le CLI agus freastalaí gréasáin tógálacha difriúla a úsáid. Tagann libxml dá chuid féin le híomhánna coimeádán; seiceáil sa choimeádán atá ag rith ansin, ní ar an óstach.
Bíonn tionchar ar chórais a ritheann ar sheanleaganacha PHP ar aon nós. Do PHP 8.1 agus níos sine níl nuashonruithe oifigiúla ó thionscadal PHP ann a thuilleadh tar éis PHP2Shell; cad is brí leis sin, déanann PHP 8.1 agus níos sine: cad atá i bhfeidhm anois cur síos air. Ba cheart seanchóras le libxml as dáta agus le leochaileachtaí oscailte san ateangaire a aistriú, ní a chosaint sa chód amháin. Déanann Dí-shraitheadú neamhshlán i PHP cur síos ar rioscaí gaolmhara le sonraí coimhthíocha a phróiseáil, agus Server-Side Request Forgery a chosc i PHP ar ghlaonna ar spriocanna inmheánacha.
Conas a chabhraíonn PHP SOS go nithiúil?
- Aimsímid gach áit ina bpróiseálann d'fheidhmchlár agus a leabharlanna XML ó fhoinsí coimhthíocha.
- Bainimid roghanna contúirteacha parsálaí agus tógaimid feidhm luchtaithe lárnach, chosanta.
- Seiceálaimid leaganacha libxml agus PHP ar gach freastalaí agus pleanáilimid imirce do sheanchórais.
- Déanaimid na hathruithe a thástáil le doiciméid sheiceála neamhdhíobhálacha agus an toradh a dhoiciméadú.
Déanann an tseirbhís Iniúchadh slándála agus tástáil threáite cur síos ar sheiceáil bhogearraí féin.
Ceisteanna coitianta
An bhfuil feidhmchláir PHP cosanta go huathoibríoch ar XXE ó PHP 8?
Sa ghnáthchás den chuid is mó, mar nach gcuireann libxml eintitis in ionad a chéile ó leagan 2.9.0 ar aghaidh. Ach cailltear an chosaint chomh luath agus a shocraíonn cód roghanna ar nós LIBXML_NOENT, LIBXML_DTDLOAD nó LIBXML_DTDVALID, nó má tá PHP tógtha le leagan an-sean de libxml.
Ar cheart dom libxml_disable_entity_loader a ghlaoch fós?
Níor cheart. Tá an fheidhm as dáta ó PHP 8.0 toisc go bhfuil luchtú eintiteas seachtrach múchta de réir réamhshocraithe. Le haghaidh cosanta breise molann lámhleabhar PHP libxml_set_external_entity_loader agus, ó PHP 8.4 le libxml oiriúnach, an tairiseach LIBXML_NO_XXE.
Cá bpróiseálann m'fheidhmchlár XML ar chor ar bith?
Go minic in áiteanna gan choinne: comhéadain SOAP, single sign-on le SAML, fothaí RSS, sitemaps, allmhairithe táirgí, uaslódálacha SVG agus comhaid Office a bhfuil XML iontu go hinmheánach. D'fhéadfadh leabharlanna XML a phróiseáil freisin gan é a bheith infheicthe i do chód féin.
Cad is ionsaí Billion Laughs ann?
Doiciméad le heintitis neadaithe a fhásann go mór nuair a réitítear é agus a úsáideann cuimhne agus am ríomhaireachta. Baineann sé leis an teaghlach céanna le XXE. Is cosaint iad múchadh na hionadaíochta eintiteas agus doiciméid le DTD dá gcuid féin a dhiúltú.