[TryHackMe] File Inclusion - 2

코준·2025년 6월 4일

TryHackMe

목록 보기
9/32
post-thumbnail

Local File Inclusion

LFI 공격은 개발자의 보안인식 부족이 발생 이유인 경우가 많다.
PHP의 몇몇 함수는 애플리케이션이 취약해지는 경우가 종종 있는데, ASP, JSP, Node.js도 마찬가지이다. LFI는 경로 탐색과 유사한 콘셉을 가진다.

#1

<?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 함수가 바로 취약한 함수이기 때문이다.

#2

<?PHP 
	include("languages/". $_GET['lang']); 
?>

위 코드는 languages 디렉터리 안의 lang 파라미터를 통해서만 호출하도록 include함수를 수정했다.
입력값 검증이 없다면 공격자는 lang 입력을 /etc/passwd 같은 다른 파일로 URL을 조작할 수 있다. 경로탐색과 비슷해보이지만 PHP의 include 함수는 호출된 모든 파일을 현재 페이지에 포함할 수 있다.

includes//lab2.php?lang=../../../../etc/passwd 경로에 접근하려고 한 것을 나타낸다.

#3

소스코드를 사용한 공격을 넘어서 블랙박스 테스트를 수행한다. 소스코드가 없으므로 데이터의 전달이 어떻게 이루어지는지 파악할 수 없다.

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

또 하나는 /var/www/html/lab3.php 경로에 대한 정보가 나와있다.

../ 트릭으로 접근해도 같은 메세지가 나온다. passwd 파일의 끝에 .php가 첨부된 것으로 입력되는데, NULL 바이트로 빼고 입력할 수 있다.

고 했는데 %00 NULL 바이트 트릭은 PHP 5.3.4 버전에서 업데이트되어 사용할 수 없다.

#4

개발자는 민감한 정보를 유출하지 않기 위해서 키워드를 필터링할 수 있다.
/etc/passwd 파일은 필터링되고 있고, 필터를 우회하는 방법을 찾아야한다.
하나는 %00 NULL바이트 트릭이고, 하나는 필터링된 키워드 /.. 끝에 현재 디렉터리를 사용하는 것이다.

/etc/passwd 파일은 필터링되므로 /etc/passwd/.. 처럼 필터링을 우회할 수 있는데, 이는 /etc/로 인식된다.
그렇다면 현재 디렉토리로 표시하면 /etc/passwd/./etc/passwd로 인식되지 않을까?

놀랍게도 그렇다.

#5

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

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

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

매우 그렇다.

#6

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

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

profile
Hi !

0개의 댓글