업로드 파일의 확장자를 화이트리스트 기반으로 제한 php가 동작하는 서버에서 .php를 업로드 하여 실행 하게 될 시 웹 셸을 업로드 할 가능성이 많다. 이를 방지하기 위해 특정 확장자를 제외한 파일들을 업로드가 불가능하도록 코드를 작성한다.
파일 명 및 경로의 노출제한 파일을 실행하기 위해서는 서버에서의 파일 위치와 파일명을 알고 있어야한다. 이를 공격자가 알 수 없게하기 위해 업로드 한 파일명 및 경로를 DB에 저장하고 파일명은 난독화 하여 서버에 저장한다. 파일을 다운로드 시 게시판의 key를 통해 파일이 저장된 경로와 파일명을가져와 다운로드 할 수 있도록한다.
NAS의 활용 php가 설치되지 않은 NAS에 파일을 업로드 하는 방식으로 구현이 되어 있다면 .php파일을 읽더라도 실행을 할 수 없다.
File include 취약점 (LFI, RFI)
일반적으로 개발 시 공통적으로 사용하는 부분을 따로 개발하고 requre, import 와 같은 구문을 사용하여 해당 코드들을 재사용한다. 이를 이용한 공격 기법이 File include 취약점 이다.
홈페이지가 한국어, 영어 등 다른 언어로 작성된 php가 있다고 가정한다.
Ex) ko.php: 한국어 Navigation bar( Navigation bar는 상단 혹은 좌우측들에 있는 목록을 말한다.)
en.php: 영어 Navigation bar
nav bar의 예시
이를 request의 파라미터로 파일 명을 받게 된다면 File Include 취약점이 존재 할 수 있다.
fileIncludeTest.php
<?php
include($_GET['page']);
echo "wow";
?>
위와 같은 구문으로 작성된 페이지가 있다면 ip:port/ fileIncludeTest .php?page=../../../../../etc/passwd로 요청을 하게 된다면
passwd 파일을 불러올 수 있다.
서버 로컬 파일을 include한다면 Local File Include(LFI), 외부의 파일을 include한다면 Remote File Include(RFI)라고 한다.