개요)
이번에 우리 학교 소모임배 자체 CTF을 개최하면서 처음으로 문제를 출제하게 되었는데, 그 주제가 XXE였다. 저 주제를 정하면서, 듣기만 했지 정확히 어떻게 돌아가는지 모르는 저 취약점과 저거에 관련된 지식을 채우고자 저 주제를 선택하게 되었다.
그래서, 지금 기초부터 차근차근 밟고 이해해서 직접 서비스를 대강 구축해서 직접 서비스 하는것을 목표로 미니 프로젝트를 하고자 한다.(--> 군대로 인하여 무기한 연기)
그 전에, XXE에 대해 이해도를 높히기 위해서 저 XXE가 일어나는 환경의 기초가 되는 요소를 먼저 공부하고자 이 글을 남긴다.
아직도 이런 요소에 대해 문외한이기에, 많은 관심과 지적과 훈수는 언제나 환영입니다..! 아무쪼록 잘 부탁드립니다 :)
XML(eXtensible Markup Language)?
XML은 HTML과 같은 마크업 언어라고 한다.
먼저, 여러 사이트에서 종합해서 정의한 XML은 다음과 같았다.
XML(eXtensible Markup Language)은 데이터를 저장하고 전송하는 데 사용되는 마크업 언어다.
HTML과 유사하게 태그를 사용하지만, XML은 데이터의 "표현"보다는 데이터의 구조와 의미, 그리고 전달에 중점을 두는 언어다.
즉, 마크업 언어로써, 태그를 사용하는 것은 같다고 한다.
그러나, HTML처럼 뭔가 보여주는 그런 것보단, 사전 정의되어있는 태그가 없으며, 여러 데이터를 정리하고 그 데이터를 주고 받기 편하게 하기 위한 점에 초점을 둔 언어라고 사료된다.
XML의 기본 구조.
XML과 XML 기반의 언어들은 태그를 기반으로 이뤄져 있다.
그 태그들은 트리구조로 이뤄지며, 다음과 같은 구조로 이뤄져 있음을 확인할 수 있다.
1. 프롤로그(Prologue)
- 먼저, XML이란 것을 알리기 위해서 선언을 먼저 해줘야 한다고 한다.
<?xml version="1.0" encoding="UTF-8"?> <!-- encoding은 굳이 안남겨도, ?xml version만 남겨도 된다고 함.-->
2. 루트 엘리먼트 (Root Element)
- 프롤로그를 선언해줬으면 그에 맞게 루트 엘리먼트가 있어야 한다. 이 루트 엘리먼트 안에 그 루트 엘리먼트에 맞는 엘리먼트들이 다 들어가있다.
<root>
<!--엘리먼트들 -->
</root>
3. 엘리먼트 (Elements)
- 시작태그 - 종료태그로 구조를 이루며, 그 사이에 데이터를 담는 요소다. 다음과 같은 구조로 이뤄져 있고, 이름을 다르게 해서 여러가지 요소(데이터)를 넣을 수 있다.
<RootElement>
<Element1>데이터의 내용</Element1>
<Element2>(정말 대단한 데이터를 담은 내용)</Element2>
</RootElement>
4. 속성 (Attributes)
- 저 위에 엘리먼트들에 추가적인 정보를 담는 역할이다. 마치, html에서는 class나 id또는 style로 뭔가 넣는 느낌으로 이해하면 좋을 듯 하다.
<RootElement>
<test1 id="1">
<Element1>text1</Element1>
<Element2>this is first post from me!</Element2>
</test1>
<test2 id="2">
<Element1>text2</Element1>
<Element2>Now, you see the second post things@</Element2>
</test2>
<RootElement>
⇒ 위와 같이 엘리먼트에 들어가기도 하고, "루트 엘리먼트"에도 들어가기도 한다.
- 저렇게 넣을 수 있기도 하고, 아예 다른 스키마를 사용(참조)한다거나, 같은 이름의 태그가 "서로 다른 의미"로 사용 될 경우 네임 스페이스를 통해서 구분할 수 있다고 한다.
다른 스키마 참조 (w.속성)
속성을 통해서 스키마를 참조해서 넣을 수 있다고 한다. 다음은 그 예시다.<CAT xmlns="http://bulletproofyuri.kr/cat-schema">
<NAME>yaonge</NAME>
<BREED>Siamese</BREED>
<AGE>6</AGE>
</CAT>
저렇게 스키마를 참조하도록 넣어줘서 검증을 하게끔 하는것도 가능하다고 한다. 자세한건 아래에서 다룰 예정.
∴ 속성은 즉, 문서의 버전, 데이터 타입, 언어, 네임스페이스 등등을 나타내는 요소로 쓰이는 듯 하다.
XML의 특징?
XML의 특징으로는 다음과 같았다.
- 태그 기반 : 모든 XML 요소를 보면 다 태그로 둘러싸여있다. 이는 아래에 다룰 기본 구조에서 보면 알 수 있다.
- 계층 구조 : XML 문서는 "트리 구조"로 표현된다. 이는 데이터 간의 관계를 명확하게 표현할 수 있게 해준다.
- 태그의 이름자체에도 그 데이터에 대한 설명이 어렴풋이 들어가 있다는 것을 알 수 있다.
- 확장 가능성(Extensible) : 사용자는 필요에 따라 태그를 자유롭게 추가하거나 변경 가능함.
- 유효성 검증(Validation): DTD나 XML 스키마를 사용해서 문서의 구조와 내용을 검증할 수도 있다고 함.
등등의 여러 특징이 있었다.
이러한 XML을 간단하게 나타내자면 다음과 같다고 한다.
<?xml version="1.0"?>
<CAT>
<NAME>yaonge</NAME>
<BREED>Siamese</BREED>
<AGE>6</AGE>
<ALTERED>yes</ALTERED>
<DECLAWED>no</DECLAWED>
<OWNER id="2">Ahmuge</OWNER>
</CAT>
위의 XML 코드 스니펫을 보면, XML로 고양이를 정의하는 것을 볼 수 있다.
HTML같았으면, 따로 정의되어 있는 태그를 사용했을테지만, 저 코드를 보면, 서버의 파서의 양식에 맞춰서 저렇게 데이터를 저장한다.
구조를 보자면 다음과 같다.
- <?xml version="1.0"> == 프롤로그
- <CAT> ~ </CAT> == 루트 엘리먼트
- <NAME>yaonge</NAME> ... <OWNER id="2">Ahmuge></OWNER> == 엘리먼트들.
- <OWNER id="2">~빨간줄 부분 == 속성.
그리고, 저 태그같은 경우는, 각자 서비스하는 서버측에서 저 xml파서를 가지고 있으며, 그 서버에서 정의한 태그에 맞춰서 xml은 짜여지고 만들어진다.
서버측 xml 파서 예시)
저 예시에서 나온 태그를 기반으로, 만약 고양이를 소개하는 사이트라고 가정한 뒤, xml파일을 업로드 해서 처리하는 로직이 있다고 가정하에 나온 코드다.
JSP
<%@ page import="javax.xml.parsers.DocumentBuilderFactory,javax.xml.parsers.DocumentBuilder" %>
<%@ page import="org.w3c.dom.Document,org.w3c.dom.Element,org.w3c.dom.Node,org.w3c.dom.NodeList" %>
<%@ page import="java.io.File" %>
<%
try {
// 파일 경로 설정
String filePath = application.getRealPath("cat.xml");
// DocumentBuilderFactory 생성
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
// XML 문서 파싱
Document document = builder.parse(new File(filePath));
document.getDocumentElement().normalize();
// 루트 엘리먼트
Element root = document.getDocumentElement();
// 데이터 추출
String name = root.getElementsByTagName("NAME").item(0).getTextContent();
String breed = root.getElementsByTagName("BREED").item(0).getTextContent();
String age = root.getElementsByTagName("AGE").item(0).getTextContent();
String altered = root.getElementsByTagName("ALTERED").item(0).getTextContent();
String declawed = root.getElementsByTagName("DECLAWED").item(0).getTextContent();
String owner = root.getElementsByTagName("OWNER").item(0).getTextContent();
// 출력
out.println("Name: " + name + "<br>");
out.println("Breed: " + breed + "<br>");
out.println("Age: " + age + "<br>");
out.println("Altered: " + altered + "<br>");
out.println("Declawed: " + declawed + "<br>");
out.println("Owner: " + owner + "<br>");
} catch (Exception e) {
e.printStackTrace();
}
%>
python - Flask 사용 가정 下
@app.route('/upload', methods=['POST'])
def upload_file():
# 파일이 요청에 포함되어 있는지 확인
if 'file' not in request.files:
return "No file part", 400
file = request.files['file']
if file.filename == '':
return "No selected file", 400
# 파일을 읽고 XML 파싱
if file:
# 파일 내용을 메모리에서 바로 읽기
file_stream = io.StringIO(file.read().decode('utf-8'))
tree = ET.parse(file_stream)
root = tree.getroot()
# XML 내용을 딕셔너리로 변환
cat_info = {
'name': root.find('NAME').text,
'breed': root.find('BREED').text,
'age': root.find('AGE').text,
'altered': root.find('ALTERED').text,
'declawed': root.find('DECLAWED').text,
'owner': root.find('OWNER').text
}
return jsonify(cat_info)
return "Error processing file", 400
ETC....
위와 같이 데이터를 파싱한 뒤, print하게끔 하던지, json으로 저장하게 하는 로직이 있다면 저 태그를 사용해도 되지 않을까..?
또한, 프로그램에서도 XML을 사용하는 경우도 있는데, 예를들어 Execl이나 word 등등에서 사용되는 것을 알 수 있다.
Execl에서의 XML?
(나중에 정리 예정. 대강 (시트 이름).xml로 관리가 되는 듯 하다.)
근데, XML을 무작정 받으면 취약점이 생기기 마련이다. 그래서, 이를 검증하기 위해서 여러가지 "기술"을 사용한다.
XML 검증 도구
XML을 파싱할때 제대로 된 XML형식으로 받아들여졌는지 검증하는 도구도 존재한다.
XML 스키마(XSD)에 대한 짧막한 설명.
- XML 스키마(XSD == XML Schema Definition)은 XML 문서의 구조, 요소, 속성, 데이터 타입 등을 정의하는데 사용되는 "언어"다.
- 그렇다고, 막 완전히 다른 언어라는건 아니고, XML기반 언어라서, XML문서로 표현이된다.
- 이는 XML문서가 일정한 구조와 규칙을 따르도록 하는 가이드라인인 셈이다. ( or 검증기?)
https://chatgpt.com/share/66ea76f1-4bb8-8007-84f9-40553adf9bb7
XSD의 특징
- 일단, 앞에의 "접두어"는 따로 정해진 틀 없이 내가 사용하는대로 사용해도 된다. 물론 관례로는 xs를 사용한다고 한다. 물론, 다른 사람이 알아보기 쉽게 이름을 바꿔도 되는거기도 하다.
<xsd:element name="CAT">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="NAME" type="xsd:string"/>
<xsd:element name="BREED" type="xsd:string"/>
<xsd:element name="AGE" type="xsd:positiveInteger"/>
<xsd:element name="ALTERED" type="xsd:boolean"/>
<xsd:element name="DECLAWED" type="xsd:boolean"/>
<xsd:element name="LICENSE" type="xsd:string"/>
<xsd:element name="OWNER" type="xsd:string"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
- 저기에 적힌 type을 통해 저기에 들어오는 값이 boolean타입인지, string인지 검증하는 그런 형태로 이뤄짐.
xcpt) XML기반 언어들
- 물론 XML을 기반으로 사용되는 언어들이 몇몇개 있기도 하다. 그 종류는 아래와 같다.
- XHTML
- MathML
- SVG
- RSS
- RDF
etc....
++ 이 xml을 통해서 나만의 언어를 직접 정의할 수 있다고도 한다. --> 위에 접은글 예시 참고. (고양이와 xml 파서)
XML기반 언어 간략한 설명zip )
XHTML
- XML 구문 규칙을 준수하도록 작성된 HTML문서라고 한다.
다음구조는 HTML이랑, XHTML이다. 둘의 차이점을 보자.
HTML의 구조.
<!-- Content-Type: text/html -->
<!doctype html>
<html lang="en-US">
<head>
<meta charset="utf-8" />
<title>HTML</title>
</head>
<body>
<p>저는 HTML 문서입니다</p>
</body>
</html>
XHTML의 구조.
<!-- Content-Type: application/xhtml+xml -->
<?xml version="1.0" encoding="UTF-8"?>
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
<head>
<title>XHTML</title>
</head>
<body>
<p>저는 XHTML 문서입니다</p>
</body>
</html>
일단, HTML이랑 다른게, 문서의 메타데이터를 보내준 뒤, html태그를 직접 정의하여, 아래의 노드로 이어나가는 형식으로 이뤄진다.
게다가, Content-Type: application/xhtml+xml헤더를 이용해서 웹에 제공하지 않는다고 한다.
-> 저 헤더가 아니라, text/html헤더와 함께 제공이 되서, HTML파서를 사용해서 해당 문서를 구문분석하게 된다고 한다.
MathML
- 이름에서부터 알 수 있다싶히, 수학표기를 기술하고, 그 구조와 내용을 모두 담고있는 XML언어라고 한다.
자세한건 아래 링크에서 참조하자. 이건 미리 정의되어있는 태그가 몇몇개가 있다.
- https://developer.mozilla.org/en-US/docs/Web/MathML/Element
- https://developer.mozilla.org/en-US/docs/Web/MathML/Attribute
MDN만만세...
정리하자면, 수식을 더 보기 쉽게 하려고 만든 xml 형식의 수식생성기라고 이해하면 될 듯 하다.
SVG(Scalable Vector Graphics)
- 기존의 JPG,PNG와 같이 비트맵 이미지로써가 아니라, Vector이미지로써, 더욱 선명하게 보이게 해주는 XML 기반 마크업 언어.
- 1999년에 W3C의 주도하에 개발된 오픈 표준 벡터 그래픽 파일 형식이라고 한다.

예제 코드)
<svg version="1.1"
baseProfile="full"
width="300" height="200"
xmlns="http://www.w3.org/2000/svg">
<rect width="100%" height="100%" fill="red" />
<circle cx="150" cy="100" r="80" fill="green" />
<text x="150" y="125" font-size="60" text-anchor="middle" fill="white">SVG</text>
</svg>
- 근데 저거 만드는데 엄청 힘들다고 한다. 그래서, 간단한 아이콘 만드는데에만 쓰인다고 한다.
RDF (XML 기반)
- RDF(Resource Description Framework)란건 웹 상의 정보를 문장처럼 표현하는 표준 방법이라고 한다.
- W3C 에서 제안했으며, "웹 상의 자원(리소스)" 와 "그들 사이의 관계" 를 주어-술어-객체(트리플) 형태로 표현해주는 데이터 모델임.
- 주어(subject) : 설명하고자 하는 대상 (일반적으로는 URI를 사용)
- 술어(Predicate) : 주어가 가진 속성 또는 다른 자원과의 관계 (URI로 표현)
- 객체(Object) : 주어에 대한 값이나 다른 자원 (URI 또는 리터럴 사용)
- RDF가 쓰이는 곳
- 시맨틱 웹
- 링크드 데이터
- 데이터 통합
- 지식 그래프 구축
- 등등..
- 저 RDF가 XML기반으로 만들어진 요소인데, 코드로 보면 다음과 같이 나타나진다.
<?xml version="1.0">
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:ex="http://example.org/"> <!-- 보기 편하게 이렇게 만들었슴다-->
<!-- 4den0ma라는 자원에 대한 설명-->
<rdf:Description rdf:about="http://example.org/4den0ma">
<!-- 4den0ma가 bulletproofyuri를 알고 있음을 표현-->
<ex:knows rdf:resource="http://example.org/bulletproofyuri"/>
<!--4den0ma의 나이를 표현해줌-->
<ex:age>21</ex:age>
</rdf:Description>
</rdf:RDF>
<!-- 결국, rdf에 대한 선언과, 사용자 정의 namespace (xmlns:ex / 저 ex를 다른 이름으로도 바꿔도됨.)
를 지정해주고, 그거에 대한 설명을 문장형식으로 하는것으로 보임. -->
XML로 일어날 수 있는 취약점
- XXE(XML eXternal entity attack)
- XPath injection
- XML 폭탄
- XML signature Wrapping
- 잘못된 검증으로 인한 취약점. (SOAP 메시지, SAML토큰 등등..)
- (나중에 자세히 정리 예정.)
보안 대책
repo)
https://aws.amazon.com/ko/what-is/xml/
XML이란 무엇인가요? - Extensible Markup Language(XML) 설명 - AWS
XML(Extensible Markup Language) 구문 분석기는 XML 문서를 처리하거나 읽어 그 안에 있는 데이터를 추출할 수 있는 소프트웨어입니다. XML 구문 분석기는 또한 XML 파일의 구문이나 규칙을 확인하고 특정 X
aws.amazon.com
https://www.tcpschool.com/xml/xml_intro_basic
코딩교육 티씨피스쿨
4차산업혁명, 코딩교육, 소프트웨어교육, 코딩기초, SW코딩, 기초코딩부터 자바 파이썬 등
tcpschool.com
https://developer.mozilla.org/ko/docs/Web/XML/XML_introduction
XML 소개 - XML: 확장가능한 마크업 언어 | MDN
XML(확장 가능한 마크업 언어)은 HTML과 유사하지만, 미리 정의된 태그가 없는 마크업 언어입니다. 대신 필요에 맞게 특별히 설계된 태그를 직접 정의합니다. 이는 데이터를 저장, 검색, 공유할 수
developer.mozilla.org
초보자를 위한 XML 설명 - Microsoft 지원
구독 혜택을 살펴보고, 교육 과정을 찾아보고, 디바이스를 보호하는 방법 등을 알아봅니다. 커뮤니티를 통해 질문하고 답변하고, 피드백을 제공하고, 풍부한 지식을 갖춘 전문가의 의견을 들을
support.microsoft.com
RSS 피드란? - Microsoft 지원
구독 혜택을 살펴보고, 교육 과정을 찾아보고, 디바이스를 보호하는 방법 등을 알아봅니다. 커뮤니티를 통해 질문하고 답변하고, 피드백을 제공하고, 풍부한 지식을 갖춘 전문가의 의견을 들을
support.microsoft.com
'WEB' 카테고리의 다른 글
Web이란 무엇인가에 대한 간단한 고찰. (0) | 2024.03.23 |
---|---|
XXE injection에 대한 간단한 고찰. (0) | 2024.02.29 |
API가 대체 뭘까? 에 대한 간단한 고찰. (0) | 2024.01.31 |
데이터베이스와 SQL 명령어에 대한 고찰(미완성) (0) | 2023.04.23 |