File Inclusion 공격
(악의적인 행위의 책임은 사용자 본인에게 있습니다.)
File Inclusion취약점이란 PHP로 이루어진 웹페이지에서 파라미터 값을 정확하게 검사하지 않는 경우에 발생한다.
일반적으로 RFI(Remote File Inclusion)와 LFI(Local File Inclusion)로 나뉜다.
RFI는 공격자 서버에 존재하는 파일을 가져와 공격을 하는 기법이며,
LFI는 공격 대상 서버의 내부에 존재하는 파일을 이용하여 공격하는 방법이다.
다음 예제를 보자.
위와같이 한 페이지에서 파일을 page의 파라미터로 넘겨줌으로써 다른 페이지로 이동하는 예제가 있다고 생각해보자.
그렇다면 page의 /etc/passwd와 같은 경로를 주게되면 대상 서버의 존재하는 패스워드 파일을 읽을 수 있으며
공격자의 서버에 존재하는 파일 또한 include 시켜 공격을 시도할 수 있다.
(공격자의 서버의 ip는 127.0.0.1이라고 가정한다.)
하지만 위의 방법처럼 쉽게 공격이 성공하지 못할 경우가 있다.
다음의 코드를 보자.
이 코드를 보면 위에서 사용했던 방법이 차단되었음을 볼수있다.
http://와 https://를 지워줌으로써 RFI를 공격을 방어하였으며, ../와 ..\를 통하여 LFI공격을 차단하였다.
하지만 코드를 자세히 보면 str_replace함수가 해당 문자열을 검사하여 한번만 제거해주기 때문에
hhttp://ttp:// 와 같은 명령어를 넣어주면 가운데의 http://가 사라지면서 남은 문자열이 http://가 완성이 된다.
또한 ..././와 같은 방법으로도 이전 디렉터리로 이동해서 원하는 파일을 실행시킬수도 있다.
이러한 공격 방법을 Path Traversal이라고 한다.
또 다음의 코드를 보자
이 코드를 보면 파일 이름이 file~~이 존재하거나 include.php가 아니면 에러를 출력하게 해놨다.
fnmatch함수를 자세히 알아보면 첫번째 파라미터값이 두번째 파라미터에 속해있기만 하면 참을 리턴하기 때문에
처음에 시작을 file로 시작하고 위에서 시도해봤던 Path Traversal를 이용해서 공격을 성공 시킬 수 있다.
File Inclusion 공격에 대비하기 위해서는 다음과 같이 코드를 작성해야한다.
현재 페이지에서 불러들일 수 있는 파일이름을 정확하게 명시하여 그 이외에 모든 경우를 차단하는 것이 안전하다.