728x90

정의

지정한 파일을 include 함수로 소스코드에 삽입

include 함수는 PHP의 함수이기에 주로 PHP 어플리케이션에서 공격 발생

LFI(Local File Inclusion) : 웹 서버의 시스템에 존재하는 파일을 포함

RFI(Remote File Inclusion) : 외부에 있는 파일을 원격으로 포함

실습

Low 단계

File Inclusion 페이지에 접속 후 file1.php를 클릭해보면 URL의 page 파라미터에 file1.php가 보인다.

File Inclusion 페이지의 소스코드의 35번째 줄을 보면 $file 변수에 저장된 페이지를 include 하고 있음을 알 수 있다. 현재 $file 변수엔 file1.php가 저장된 것이다.

/opt/lampp/htdocs 디렉토리 하위에 test.php 파일을 만든다. /etc/passwd 명령을 실행하는 파일이다. 테스트 환경이 로컬이긴 하지만 RFI 공격을 위해 해커의 사이트에 업로드된 파일이라고 가정하자. htdocs 디렉토리 하위에 만들어야 URL을 통한 접근이 가능하다.

http://localhost/test.php 파일을 인자로 주면 /etc/passwd 파일의 내용이 보인다. RFI 공격이 성공했다.

LFI는 웹 서버 시스템 내부에 존재하는 파일을 이용하기에 RFI보다는 제한적이다. page 파라미터의 값으로 /etc/passwd나 ../../../../../../etc/passwd를 준다면 LFI 공격도 쉽게 성공할 수 있다. 후자의 방식은 Path Traversal 공격을 이용한 것이다.

Medium 단계

소스 코드를 보자.

str_replace 함수는 $file 변수의 내용 중에 http:// 와 https://와 ../와 ..\\를 빈값으로 대체하고 있다.

이 경우 ?page=hthttp://tp://localhost/test.php 와 같이 전달하면 우회가능하다. 처음에 검증할 때 http:// 부분을 없애고 나서 남은 문자열을 또 검증하진 않기 때문이다.

High 단계

소스코드를 보면 file로 시작하는 문자열이거나 include.php인 경우만 허용된다.

이 경우 file/../../../../../../../etc/passwd 방식으로 LFI 공격이 가능하다.

단, http://를 사용할 수 없기에 RFI 공격은 불가능하다.

대응 방안

가장 좋은 방법은 외부 사용자가 입력한 파일 이름을 include() 함수 인자로 사용하지 않는 것이다.

어쩔 수 없이 파일의 이름을 외부에서 입력받아야 한다면 입력값 검증을 해야한다.

Impossible 단계의 소스코드를 보자.

Impossible 단계의 소스코드를 보면 include.php와 file.php와 file2.php와 file3.php만 허용하고 있다. 이를 화이트 리스트 방식이라고 한다. 반대로 블랙리스트 방식은 금지할 목록을 명시하는 것이다. 화이트리스트 검증 방식이 권장된다.

정리하자면 include 함수의 인자로 사용자의 입력값이 전달되지 않는 것이 가장 좋지만 어쩔 수 없는 경우엔 반드시 필요한 파일만 허용하는 화이트 리스트 방식을 적용해야한다.

728x90

'dvwa' 카테고리의 다른 글

SQL Injection  (0) 2023.05.16
File Upload  (0) 2023.05.06
CSRF  (0) 2023.05.05
Command Injection  (0) 2023.05.02
Brute Force  (0) 2023.05.02

+ Recent posts