Dans le développement Web moderne, XML est largement utilisé dans l'échange de données, les fichiers de configuration et de nombreux autres scénarios. Cependant, s'il n'est pas empêché pendant l'analyse XML, il peut devenir une source de vulnérabilité pour les attaques d'entités externes (XXE, attaque en entité externe XML). Les attaques XXE permettent aux attaquants d'injecter du contenu malveillant via des fichiers XML, entraînant une fuite d'informations, des attaques de déni de service (DOS) ou une exécution de code malveillant.
Pour résoudre ce problème, PHP fournit certaines fonctions intégrées pour empêcher les attaques d'entités externes. Parmi eux, libxml_use_internal_errors () et libxml_disable_entity_loader () sont deux méthodes de protection très efficaces. Cet article expliquera en détail comment combiner ces deux fonctions pour empêcher les attaques d'entités externes.
L'attaque de l'entité externe (XXE) est une attaque effectuée par une déclaration d'entité externe dans un fichier XML. Les fichiers XML peuvent se référer à des ressources externes, qui peuvent être des fichiers système, des URL ou d'autres ressources externes. Un attaquant peut pointer le contenu du fichier vers des informations sensibles ou faire effectuer le serveur d'effectuer des opérations non sécurisées via un fichier XML construit de manière malveillante.
Par exemple, un attaquant pourrait construire un fichier XML dans le formulaire suivant:
<!DOCTYPE foo [
<!ENTITY xxe SYSTEM "file:///etc/passwd">
]>
<root>
<data>&xxe;</data>
</root>
À ce stade, le Parser XML essaie de lire le fichier / etc / passwd du système et d'injecter son contenu dans l'élément de données . De telles attaques peuvent entraîner des violations de données sensibles.
Lors du traitement des données XML, PHP lance un avertissement ou une erreur lors de l'analyse d'une erreur par défaut, ce qui peut exposer trop de message d'erreur. Utilisez libxml_use_internal_errors () pour désactiver ces sorties d'erreur par défaut et utiliser les mécanismes de gestion des erreurs internes. De cette façon, même si les données XML sont incorrectes ou qu'il existe une vulnérabilité potentielle, le programme n'expose pas les informations d'erreur détaillées.
libxml_use_internal_errors(true);
$xmlString = '<root><data>&xxe;</data></root>';
$xml = simplexml_load_string($xmlString);
if ($xml === false) {
echo "charger XML Une erreur s'est produite pendant。\n";
foreach(libxml_get_errors() as $error) {
echo $error->message . "\n";
}
}
Dans cet exemple, libxml_use_internal_errors (true) garantit que le programme ne lance pas directement un avertissement s'il y a un problème avec le fichier XML. Le message d'erreur est enregistré en interne et peut être obtenu via libxml_get_errors () .
libxml_disable_entity_loader () est une autre fonction clé qui permet aux développeurs de désactiver la fonction de chargement de l'entité externe de l'analyseur XML, évitant ainsi efficacement les attaques XXE. Si le chargement des entités externes est désactivée, l'analyseur XML ne pourra pas charger des ressources distantes ou des fichiers système.
libxml_disable_entity_loader(true);
$xmlString = '<?xml version="1.0"?>
<!DOCTYPE foo [
<!ENTITY xxe SYSTEM "file:///etc/passwd">
]>
<root>
<data>&xxe;</data>
</root>';
$xml = simplexml_load_string($xmlString);
if ($xml === false) {
echo "XML charger失败,Les entités externes sont désactivées。\n";
}
Dans cet exemple, libxml_disable_entity_loadher (true) désactive le chargement des entités externes, ce qui rend impossible un attaquant de charger des ressources externes via un fichier XML, et que l'analyseur ne les exécutera pas même si le fichier XML contient une déclaration de l'entité externe.
Afin d'empêcher efficacement des attaques d'entités externes, nous pouvons utiliser ces deux fonctions en combinaison pour garantir que la sortie d'erreur peut être supprimée et que le chargement externe des entités peut être désactivé lors de l'analyse du XML.
libxml_use_internal_errors(true);
libxml_disable_entity_loader(true);
$xmlString = '<?xml version="1.0"?>
<!DOCTYPE foo [
<!ENTITY xxe SYSTEM "file:///etc/passwd">
]>
<root>
<data>&xxe;</data>
</root>';
$xml = simplexml_load_string($xmlString);
if ($xml === false) {
echo "XML charger失败。\n";
foreach(libxml_get_errors() as $error) {
echo $error->message . "\n";
}
}
Dans cet exemple, libxml_use_internal_errors (true) est utilisé pour masquer les messages d'erreur pendant l'analyse, tandis que libxml_disable_entity_loader (true) garantit que les entités externes sont désactivées. Même si le fichier XML contient des entités externes, elle ne provoquera pas la divulgation d'informations sensibles ou les opérations malveillantes.
L'attaque entité externe (XXE) est un type de vulnérabilité commun et dangereux qui peut entraîner de graves problèmes de sécurité en cas de manipulation incorrecte. Pour éviter efficacement ces attaques, PHP fournit deux fonctions: libxml_use_internal_errors () et libxml_disable_entity_loader () , qui peuvent aider les développeurs à contrôler la sortie d'erreur de l'analyse XML et désactiver le chargement des entités externes. En utilisant ces deux fonctions en combinaison, la sécurité des applications PHP peut être considérablement améliorée et les attaques d'entités externes peuvent être évitées.