이 글은 XXE Injection을 공부하기 위해 TCP School의 XML 강의를 정리한 글입니다.
http://www.tcpschool.com/xml/intro
XML
XML은 JSON과 같이 데이터를 전달하기 위한 목적으로 만들어졌다.
XML은 다른 마크업 언어를 만드는데 사용되는 다목적 마크업 언어이다.
또한 스키마를 가지고 있는데 스키마는 DTD(Document Type Definition)와 XML 스키마(XSD)로 작성할 수 있다.
XML의 content-type은 application/xml 이다.
DTD
DTD(문서 타입 정의)는 XML 문서의 구조 및 해당 문서에서 사용할 수 있는 적법한 요소와 속성을 정의한다.
DTD에서 엔티티(entity)는 특정 문자열을 손쉽게 사용할 수 있도록 해주는 상용구와 같은 역할을 한다.
DTD에서 엔티티는 일반 엔티티와 파랑미터 엔티티로 구분된다.
일반 엔티티는 XML 문서에만 확장될 수 있고 파싱되거나 파싱되지 않을 수 있다.
파라미터 엔티티는 DTD 내부에서만 확장될 수 있고 반드시 파싱된다.
DTD에서 엔티티는 XML 문서, DTD 내부, 파일 외부에 선언할 수 있다.
(참고로 엔티티가 DTD 외부에 있으면 외부 엔티티라고 하고 DTD 내부에 있으면 내부 엔티티라고 한다)
내부 엔티티는 아래와 같이 선언할 수 있다.
<!ENTITY 엔티티이름 "엔티티값">
이렇게 선언된 내부 엔티티는 XML 문서에서 &엔티티이름; 의 형식으로 사용한다.
외부 엔티티는 다른 DTD 문서에서 재사용할 수 있으며 아래와 같이 선언한다.
<!ENTITY 엔티티이름 SYSTEM "URI또는URL">
외부 엔티티도 내부 엔티티 처럼 XML 문서에서 &엔티티이름; 의 형식으로 사용한다.
DTD 문서에서만 사용하기 위해 선언한 엔티티를 파라미터 엔티티라고 한며 아래와 같이 선언한다.
<!ENTITY %엔티티이름 "엔티티값">
엔티티 이름 앞에 %가 들어가는 것을 제외하면 일반 엔티티와 동일하다.
(추가로 공부해서 작성할 예정)
'background > web' 카테고리의 다른 글
[NoSQL] CouchDB (0) | 2022.11.24 |
---|---|
SSTI(Server Side Template Injection) (0) | 2022.09.29 |
XXE(XML External Entity) Injection (0) | 2022.08.27 |
[MySQL] select 문의 where 절에서 문자열과 숫자의 비트 연산으로 테이블의 모든 데이터 출력되는 현상 (0) | 2022.08.09 |
Same Origin Policy(SOP) (0) | 2022.07.27 |