본문 바로가기

정보보안/애플리케이션 보안

[웹 애플리케이션 취약점] 파일 삽입 취약점

파일 삽입 취약점
File Inclusion

① 개념

  • 공격자가 악성 서버 스크립트를 서버에 전달하여 해당 페이지를 통해 악성코드가 실행되도록 하는 취약점
  • LFI(Local File Inclusion) : 삽입할 악성 서버 스크립트 파일의 위치가 로컬 서버에 위치
  • RFI(Remote File Inclusion) : 삽입할 악성 서버 스크립트 파일의 위치가 원격지에 위치

 

② 공격 절차

  1. include 함수를 이용한 페이지 확인
    if(..) {
    $target =$_REQUEST[fname];
    ...
    include($target) //외부로부터 입력받은 target파라미터를 이용해 include 수행
    }
    include 함수 : 지정한 파일(페이지)을 인수로 받아 현재 페이지에 포함해 실행시켜주는 함수. 만약 파일/페이지 정보를 외부로부터 입력받을 때 적절한 검증을 수행하지 않으면 악성 스크립트를 포함한 페이지가 include 되어 피해가 발생할 수 있음.
  2. RFI를 이용한 웹쉘 실행
    • include가 실행되는 파라미터(ex. 입력한 페이지가 현재 페이지에 뜨는 페이지의 입력값)에 webshell의 원격지 경로(ex. http://example.com/hacker/webshell.php)를 입력하면 원격지의 페이지가 include 되어 현재 페이지에서 실행되는 것을 확인 가능.

 

③ 대응책

  1. 관리자는 소스코드에 include,require 등의 구문/함수가 존재하는지 검증하고, 만약 사용자의 입력값을 통해 파일명이 결정된다면 외부의 악의적인 파일이 되어 실행되지 않도록 PHP 파일인 php.ini 파일에서 allow_url_fopen을 Off 설정한다.
    #php.ini 파일
    ...
    allow_url_fopen = Off
    allow_url_fopen 기능: PHP에서 include, require 등의 함수를 이용하여 외부 파일을 URL 형식으로 읽어올 수 있도록 해주는 기능으로 보안에 취약하여 허용하지 않는 것을 권장
    • include 함수 : 오류 발생 시 에러 메시지를 출력한 후 스크립트 계속 실행
    • require 함수 : 오류 발생 시 에러 메시지를 출력한 후 스크립트 실행 중지
  2. 에러 메시지를 출력하지 않기 위해 php.ini파일의 display_errors=Off 설정한다.
    #php.ini 파일
    ...
    allow_url_fopen = Off
    display_errors = Off
  3. 대규모 홈페이지 변조는 PHP의 외부 사이트 소스 실행 기능(allow_url_fopen)을 이용해 악의적인 스크립트를 로컬 서버에서 실행시킴으로써 발생하고 있으므로 주의가 필요하다.