LFI(Local File Inclusion) 취약점 - WordPress Mail Masta 플러그인(1)

by Toff

   개요
이번 포스팅에서는 Mail Masta 플러그인을 사용해 LFI(Local File Inclusion) 취약점에 대해서 알아보자. LFI 취약점에 대한 설명은 다음 포스팅을 참고하도록 하자
> 추가 예정

해당 취약점은 /wordpress/mail-masta/inc/campaign/count_of_send.php 와 csvexport.php에서 발생하며 파일을 include 시키는 pl 파라미터에서 검증을 하지 않아 취약점이 발생한다.

해당 플러그인 실습은 총 세 번에 거쳐 진행하고 세 번의 포스팅으로 나눠서 실습한다. 해당 포스팅에서는 먼저 LFI 취약점을 이용해 내부 문서를 탈취해보도록 하자.


   환경 구성
환경 구성은 다음 그림 1-1 과 같다.
그림 1-1 환경 구성

Mail Masta 플러그인 설치 주소는 다음과 같다.
- 해당 플러그인은 취약점 패치 버전이 존재하지 않는다.


   실습 순서
이전 실습들을 잘 진행했다면 이번 포스팅의 실습은 굉장히 간단하므로 따로 영상은 추가하지 않는다.

먼저 그림 1-2 와 같이 Mail Masta 플러그인을 활성화 시킨다.
그림 1-2 Mail Masta 플러그인 활성화

실습 방법은 간단하다. 그림 1-3 과 같이 URL에 취약점이 발생한 파라미터 값에 얻고자 하는 파일 값을 삽입하면 된다.
 그림 1-3 LFI 취약점 코드 삽입 

다음으로는 워드프레스 데이터베이스 정보 값을 얻기 위해 파라미터에 wp-config.php 값을 삽입한다. 하지만 그림 1-4 와 같이 아무런 값도 출력되지 않는다. LFI 취약점은 해당 파일을 HTML 형태로 출력해주기 때문에 php 코드가 보이지 않는다. 해당 포스팅에서는 여기까지 실습을 진행하며 두번째 포스팅에서 php 코드를 출력하는 실습을 하도록 하자.
 그림 1-4 wp.config.php 


   결과 분석
취약점이 발생한 코드는 표 1-1 과 같다. include 를 사용하고 'pl' 파라미터 값을 받지만 특정 파일만을 참조할 수 있게하는 필터링, 검증 로직이 존재하지 않는다. 공격자는 이를 이용해 원하는 파일을 참조해 출력이 가능하다.
<?php 

include($_GET['pl']);

.... 중략 ....

?>
표 1-1 취약점 발생 코드

   대응 방안
해당 취약점은 패치 버전이 없으므로 직접 시큐어 코딩을 해 대응 방안을 세우도록 하자. LFI 취약점은 위에서도 설명했듯이 입력 값(파라미터)에 대한 필터링, 검증 로직이 존재하지 않아 발생했다. 특정 파일을 참조하는 기능을 사용해야 한다면 특정 파일을 직접 참조하거나 특정 파일의 확장자만을 허용하고 나머지는 필터링 하는 화이트리스트 방식을 사용해야 한다. 해당 실습에서는 표 1-2 와 같이 특정 파일만 직접 참조하는 방식의 시큐어코딩을 적용했다.
<?php

$cur_pl=$_get['pl'];
if($cur_pl == "onlythis.php")
{
           include($cur_pl);
}
else
{
           ?> <script>alert("LFI !!! GET OUT"); </script>}
표 1-2 시큐어 코딩

시큐어 코딩을 적용한 후 다시 실습한 결과 그림 1-5 와 같이 미리 지정해둔 파일(페이지)만을 접근할 수 있으며 그 이외의 파일(페이지)을 참조하려고 하면 그림 1-6 과 같이 경고문이 출력된다.
 그림 1-5 시큐어 코딩 > 특정 파일(페이지) 참조 성공

 그림 1-6 시큐어 코딩 > 특정 파일(페이지) 참조 실패