최신 웹 개발에서 XML은 데이터 교환, 구성 파일 및 기타 여러 시나리오에 널리 사용됩니다. 그러나 XML 구문 분석 중에 방지되지 않으면 외부 엔티티 공격 (XXE, XML 외부 엔티티 공격)의 취약점이 될 수 있습니다. XXE 공격을 통해 공격자는 XML 파일을 통해 악의적 인 컨텐츠를 주입하여 정보 유출, 서비스 거부 (DOS) 또는 악의적 코드 실행이 발생할 수 있습니다.
이 문제를 해결하기 위해 PHP는 외부 엔터티 공격을 방지하기위한 몇 가지 내장 기능을 제공합니다. 그중에서도 libxml_use_internal_errors () 및 libxml_disable_entity_loader () 는 두 가지 매우 효과적인 보호 방법입니다. 이 기사는 외부 엔터티 공격을 방지하기 위해이 두 기능을 결합하는 방법을 자세히 설명합니다.
외부 엔티티 공격 (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 파서의 외부 엔티티로드 기능을 비활성화하여 XXE 공격을 효과적으로 피할 수있는 또 다른 핵심 기능입니다. 외부 엔티티로드가 비활성화되면 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 파일에 외부 엔터티 선언이 포함되어 있어도 구문 분석기가 실행되지 않습니다.
외부 엔티티 공격을 효과적으로 방지하기 위해 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는 Libxml_use_internal_errors () 및 libxml_disable_entity_loader () 의 두 가지 기능을 제공하여 개발자가 XML 구문 분석의 오류 출력을 제어하고 외부 엔티티로드를 비활성화하는 데 도움이 될 수 있습니다. 이 두 기능을 조합하여 사용함으로써 PHP 응용 프로그램의 보안을 크게 향상시킬 수 있으며 외부 엔티티의 공격을 피할 수 있습니다.