最新のWeb開発では、XMLはデータ交換、構成ファイル、その他多くのシナリオで広く使用されています。ただし、XML解析中に防止されない場合、外部エンティティ攻撃(XXE、XML外部エンティティ攻撃)の脆弱性の原因になる可能性があります。 XXE攻撃により、攻撃者はXMLファイルを介して悪意のあるコンテンツを注入することで、情報の漏れ、サービス攻撃の拒否(DO)、または悪意のあるコードの実行が得られます。
この問題を解決するために、PHPは外部のエンティティ攻撃を防ぐためのいくつかの組み込み関数を提供します。その中で、 libxml_use_internal_errors()およびlibxml_disable_entity_loader()は、2つの非常に効果的な保護方法です。この記事では、外部のエンティティ攻撃を防ぐためにこれら2つの機能を組み合わせる方法について詳しく説明します。
外部エンティティ攻撃(XXE)は、XMLファイルの外部エンティティ宣言によって実行される攻撃です。 XMLファイルは、システムファイル、URL、またはその他の外部リソースなどの外部リソースを参照できます。攻撃者は、ファイルのコンテンツを機密情報に指したり、悪意のある構築されたXMLファイルを介してサーバーに不安定な操作を実行させることができます。
たとえば、攻撃者はXMLファイルを次の形式に作成できます。
<!DOCTYPE foo [
<!ENTITY xxe SYSTEM "file:///etc/passwd">
]>
<root>
<data>&xxe;</data>
</root>
この時点で、XMLパーサーはシステムの/etc /passwdファイルの読み取りを試み、その内容をデータ要素に挿入しようとします。このような攻撃は、デリケートなデータ侵害につながる可能性があります。
XMLデータを処理するとき、PHPはデフォルトでエラーを解析するときに警告またはエラーをスローします。これにより、エラーメッセージが多すぎる可能性があります。 libxml_use_internal_errors()を使用して、これらのデフォルトエラー出力をオフにし、内部エラー処理メカニズムを使用します。これにより、XMLデータが正しくない場合、または潜在的な脆弱性がある場合でも、プログラムは詳細なエラー情報を公開しません。
libxml_use_internal_errors(true);
$xmlString = '<root><data>&xxe;</data></root>';
$xml = simplexml_load_string($xmlString);
if ($xml === false) {
echo "負荷 XML その間にエラーが発生しました。\n";
foreach(libxml_get_errors() as $error) {
echo $error->message . "\n";
}
}
この例では、 LIBXML_USE_INTERNAL_ERRORS(TRUE)は、XMLファイルに問題がある場合、プログラムが直接警告を投げることを保証します。エラーメッセージは内部的に保存され、 libxml_get_errors()を介して取得できます。
libxml_disable_entity_loader()は、開発者がXMLパーサーの外部エンティティロード関数を無効にすることを可能にするもう1つの重要な関数です。外部エンティティの読み込みが無効になっている場合、XMLパーサーはリモートリソースまたはシステムファイルをロードできません。
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 負荷失败,外部エンティティは無効になっています。\n";
}
この例では、 libxml_disable_entity_loader(true)が外部エンティティの読み込みを無効にするため、攻撃者がXMLファイルを介して外部リソースをロードすることは不可能であり、パーサーはXMLファイルに外部エンティティ宣言が含まれていても実行されません。
外部エンティティ攻撃を効果的に防ぐために、これら2つの機能を組み合わせて使用して、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 負荷失败。\n";
foreach(libxml_get_errors() as $error) {
echo $error->message . "\n";
}
}
この例では、 libxml_use_internal_errors(true)を使用して解析中にエラーメッセージを非表示にしますが、 libxml_disable_entity_loader(true)は、外部エンティティが無効になることを保証します。 XMLファイルに外部エンティティが含まれていても、機密情報が漏れたり悪意のある操作を引き起こしたりしません。
外部エンティティ攻撃(XXE)は、不適切な取り扱いの場合に深刻なセキュリティの問題につながる可能性のある一般的で危険なタイプの脆弱性です。このような攻撃を効果的に防ぐために、PHPは2つの機能を提供します: libxml_use_internal_errors()とlibxml_disable_entity_loader() 。これら2つの機能を組み合わせて使用することにより、PHPアプリケーションのセキュリティを大幅に改善し、外部エンティティの攻撃を回避できます。