XXE와 XML
XXE: XML Exeternal Entity(XML 외부 개체 주입)
XML: 데이터를 효율적으로 주고 받기 위한 마크업 언어(요즘은 json을 많이 사용)
XXE를 통해 서버 내 자원 무단 열람 가능
공격 대상
- XML을 파싱하는 기능이 있는 어플을 공격(XML 형태로 데이터 전송할 때)
기존의 시스템(레거시 시스템) 중 XML을 주고 받는 것이 많음
원리
- 앱에서 파서 기능을 수행하는데 xml이 외부 파일을 참조하도록 하여 어플에 뿌림
여기서 외부 파일을 참조 가능하도록 하는게 DTD(Document Type Definition, 문서 타입 정의)
- DTD란?
: XML 문서의 구조 및 해당 문서에서 사용할 수 있는 적법한 요소와 속성을 정의
<!DOCTYPE ROOT DTD식별자[선언1, 선언2...]>
• <!DOCTYPE 으로 시작
• Root: XML 파서(parser)에 명시된 루트 요소부터 파싱을 시작하라고 알려줌
• DTD 식별자: 프로그램 외부에 존재하는 DTD 파일을 위한 식별자
• 외부 서브셋: DTD 식별자가 외부 주소를 가리키는 것
• 내부 서브셋: 괄호([]) 안의 추가로 선언한 엔티티(entity)의 리스트
• !Entity: 특정 문자를 사용할 수 있게 하는 상용구
- 외부로 참조하기 때문에 문제가 발생
- 특징: SYSTEM이라는 지시어 사용
개체 참조
1. 내부 개체 참조
<!DOCTYPE a[
<!ENTITY str "jayde">
]>
<print>&str;</print>
2. 외부 개체 참조
<!DOCTYPE a[
<!ENTITY str SYSTEM "file:///information/secret_info.txt">
]>
<print>&str;</print>
(맥의 경우 simplexml_load_string에 'SimpleXMLElement', LIBXML_NOENT 옵션을 줘야 함)
[실습4-1] XXE Injection 공격 실습 - 인프런
[실습4-1] XXE Injection 공격 실습 편에서 아래와 같이 외부 개체 참조 테스트를 위해 XML을 입력하면 [사진] secret_info.txt 파일 내용이 보이지 않는 경우가 있습니다.PHP5 에서는 문제가 없는 것 같고 PHP
www.inflearn.com
3. 외부 소스코드 참조
<!DOCTYPE a[
<!ENTITY str SYSTEM "php://filter/read=convert.base64-encode/resource=file:///information/secret_info.txt">
]>
<print>&str;</print>
※ xml에서 <>는 메타 문자라 잘못쓰면 에러가 난다.
대응방안
1. 변경이 가능하다면 json 형태로 기능 구현
2. dtd 및 외부 엔티티 비활성화
java) factory.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);
php) libxml_disable_entity_loader(true);
3. xmlparser 기능 없애기
'Security > 취약점분석' 카테고리의 다른 글
| [BackDoor] 섹션6. CSRF(XSRF) (0) | 2024.05.23 |
|---|---|
| [BackDoor] 섹션5. XSS (0) | 2024.05.23 |
| [BackDoor] 섹션3. OS Command Injection (0) | 2024.05.23 |
| [BackDoor] 섹션 2. SQL Injection (0) | 2024.04.06 |
| [BackDoor] 섹션 0. 프롤로그 & 섹션 1. 웹 해킹에 대한 이해 (0) | 2024.04.04 |