LFI 공격은 개발자의 보안인식 부족이 발생 이유인 경우가 많다.
PHP의 몇몇 함수는 애플리케이션이 취약해지는 경우가 종종 있는데, ASP, JSP, Node.js도 마찬가지이다. LFI는 경로 탐색과 유사한 콘셉을 가진다.
<?PHP
include($_GET["lang"]);
?>
위 PHP 코드는 URL 파라미터인 lang을 통해서 GET요청을 보내는데, http://webapp.thm/index.php?lang=EN.php과 같이 영어로된 페이지, http://webapp.thm/index.php?lang=AR.php아랍어로 된 페이지를 요청할 수 있고, EN.php와 AR.php는 같은 디렉터리 안에 존재한다.
입력값 검증이 없다면 위 코드로 모든 읽기가 가능한 파일에 접근할 수 있다.
http://webapp.thm/get.php?file=/etc/passwd같은 민감정보에도 접근할 수 있을 것이다.
해당 include 함수가 바로 취약한 함수이기 때문이다.
<?PHP
include("languages/". $_GET['lang']);
?>
위 코드는 languages 디렉터리 안의 lang 파라미터를 통해서만 호출하도록 include함수를 수정했다.
입력값 검증이 없다면 공격자는 lang 입력을 /etc/passwd 같은 다른 파일로 URL을 조작할 수 있다. 경로탐색과 비슷해보이지만 PHP의 include 함수는 호출된 모든 파일을 현재 페이지에 포함할 수 있다.

includes//lab2.php?lang=../../../../etc/passwd 경로에 접근하려고 한 것을 나타낸다.
소스코드를 사용한 공격을 넘어서 블랙박스 테스트를 수행한다. 소스코드가 없으므로 데이터의 전달이 어떻게 이루어지는지 파악할 수 없다.

EN과 같은 검증되지 않은 입력을 하면 볼 수 있는데, include(includes/EN.php)라는 include 함수의 형식을 보여준다. 함수가 includes 디렉터리의 파일을 include하고 .php를 마지막에 첨부하고 있다.
또 하나는 /var/www/html/lab3.php 경로에 대한 정보가 나와있다.

../ 트릭으로 접근해도 같은 메세지가 나온다. passwd 파일의 끝에 .php가 첨부된 것으로 입력되는데, NULL 바이트로 빼고 입력할 수 있다.
개발자는 민감한 정보를 유출하지 않기 위해서 키워드를 필터링할 수 있다.
/etc/passwd 파일은 필터링되고 있고, 필터를 우회하는 방법을 찾아야한다.
하나는 %00 NULL바이트 트릭이고, 하나는 필터링된 키워드 /.. 끝에 현재 디렉터리를 사용하는 것이다.
/etc/passwd 파일은 필터링되므로 /etc/passwd/.. 처럼 필터링을 우회할 수 있는데, 이는 /etc/로 인식된다.
그렇다면 현재 디렉토리로 표시하면 /etc/passwd/.가 /etc/passwd로 인식되지 않을까?

다음 시나리오는 이제 개발자가 키워드 필터링으로 입력값 검증을 하기 시작했다.

../ 문자열이 에러메세지에 출력되지 않는 것을 보면 빈 문자열로 인식되는 것 같다.
그렇다면 필터링을 우회하기 위해서 ....//처럼 입력한다면

위 이미지처럼 입력이 될 수 있지 않을까?

마지막은 include 함수가 정의된 디렉터리에서 읽도록 강제하는 경우이다.
입력에 http://webapp.thm/index.php?lang=languages/EN.php와 같은 디렉터리를 포함해야하는 경우 ../페이로드에 디렉터리를 포함하는 방법이 있다.

langueges가 아니라 THM-profile 폴더라고 한다.
