본문 바로가기
Security

[Kail Linux] 파일 인클루젼 공격 알아보기 (file inclusion)

by Kyn 2020. 2. 5.

파일 인클루젼 공격은 주로 php 페이지에서 발생합니다

파일 인크로젼 공격은 두 가지로 분류됩니다.

 

1.  로컬 파일 인클루젼(LFI) - 이미 시스템에 존재하는 파일을 인클루드
2. 리모트 파일 인클루젼(RFI) - 외부에 있는 파일을 원격으로 인클루드

 

실습 환경을 DVWA를 활용해 보겠습니다.

 

파일 인클루젼 공격은 요청하는 페이지의 경로를 변경해 줌으로써 정보를 탈취하는 방식입니다. 

www.tistory.com/page=incloud.php

저런 식으로 tistory 페이지에서 incloud.php라는 페이지를 호출하는 상황이라고 가정합니다.

외부에 있는 파일을 원격으로 인클루드 하는 경우라면 

www.tistory.com/page=http://127.x.x.x/../../change.php

다음과 같은 형태로 외부로부터 요청된 php 페이지를 전달하는 것입니다.

내부에 있는 파일을 원격으로 인클루드 한다면

 

www.tistory.com/../../../../../../../../../etc/passwd/

위와 같은 방식으로 최 상위 경로로 이동하여 원하는 정보를 탈취할 수 있습니다.

 

 

DVWA에서 파일 인클루젼 공격을 막기 위해 어떤 방법을 사용했을까요?

<?php
	
    $file = $_GET[ 'page' ];
    
    $file = str_replace( array( "http://", "https://), "",$file);
    $file = str_replace( array( "../", "..\""), "", $file);
?>

처음 단계에서는

단순히 http:// , https:// 와 같은 부분을 "" 삭재하고 읽거나, 디렉터리의 상위로 이동할 수 있는 ../ , ..\ 와같은

명령이 들어오면 공백 처리로 막으려는 모습을 보여줍니다.

 

그렇다면?

htthttp://p://www.tistory.com/~~

http:// 속 http://를 넣어준다면??

속에 있는 http://를 삭재시키면서 http://www.tistory.com/~~ 항목이 그대로 전달되게 됩니다.

이와 같은 경우는 한 번만 처리를 해주기에 이러한 취약점이 발생하였습니다.

 

보안 레벨을 올려서 파일 인클로젼 공격을 막기 위한 코드를 살펴봅시다

<?php
	
    $file = $_GET['page'];
    
    if(!fnmatch("file*", $file) && $file != "include.php")
    	echo "ERROR: File not found!";
        exit;
     }
 ?>

이번에는

입력값 검증 방식이 달라진 것을 확인할 수 있습니다.

fnmatch를 이용하여 뒤에 있는 파일 이름과 매치가 안된다면 에러를 출력하는 방식이네요

 

 

하지만

 

이 코드의 문제점은 파일 이름에서 살펴볼 수 있습니다.

예제에서 제공하는 php 페이지는 include.php , file1,php , file2.php , file3.php 등 4가지의 페이를 제공합니다.

 

그럼 file4.php를 입력하면 어떻게 될까요??

 

file4.php Hidden page

 

 

숨겨진 파일이라고 해서 file4.php에 일반 사용자는 접근할 수 없는 숨겨진 페이지가 나오게 됩니다.

 

이처럼

 

파일명을 file*.php로 file 뒤에 올 수 있는 숫자를 정확히 명시하지 않았기 때문에 이러한 문제가 생기는 것을 알 수 있습니다.

 

파일 인클루젼 공격을 대응하기 위해서는 불필요한 정보를 최소화하고 정확히 명시함으로써 파일 인클루젼 공격을 대응할 수 있습니다.

 

댓글