본문 바로가기
보안 공부/Web

LFI(Local File Inclusion) 취약점

by 그적 2020. 9. 1.

LFI(Local File Inclusion)
 : 공격 대상 서버에 위치한 파일을 포함시켜 읽어오는 공격
   쉽게 이야기해서, 공격 대상 서버에 있는 디렉터리로 접근하여 원하는 파일을 열어볼 수 있다는 것이다.


예를 들어, 아래와 같이 파일 이름을 url 파라미터로 넘겨주어 파일을 불러오는 코드가 있다고 하자.

<?php include(./$_GET['filename']); ?>

이러한 부분에서 특수문자 필터링 혹은 적절한 디렉터리 권한 설정을 안 해줄 경우에 LFI 취약점이 발생할 수 있는데,          filename을 ../../../../etc/passwd와 같이 넘겨주면 파일을 include 하는데 아무런 제약이 없기 때문에 서버 내에 있는 계정의 모든 패스워드를 훔칠 수 있다.

include() 함수 이외에도, include_once(), require(), require_once(), file_get_contents() 함수에도 LFI 취약점이 발생할 수 있다.

 

(대응 방안)
 1. 특수문자 필터링

str_replace('.', '', $filename); 
str_replace('/', '', $filename);

  (개인적으로 ../ 자체를 필터링하는 것보다 특수문자를 각각 필터링하는 게 좋다고 생각된다.)

 2. 원격지 파일을 열지 못하도록 php.ini 환경설정 수정(RFI 취약점 방어)
  allow_url_fopen = OFF
  allow_url_include = OFF

 3. include 관련한 에러를 출력하지 않음
  display_errors = OFF

 4. 파일이 존재하는 지 확인하는 코드 삽입

<?php
$filename = $_GET(['filename']);

if(file_exists(./$filename){
	include(./$filename);
}
else{
	echo "no hack";
}
?>

댓글