- 파일 인클루전은 PHP로 구현된 웹 서버의 취약점을 공격하는 기법으로 PHP의 include 기능을 악용하는 방식이다.
- PHP는 incude의 파라미터로 넘어온 PHP파일을 현재 웹 페이지에 삽입할 수 있다.
- 공격자는 악의적인 PHP파일을 생성하여 공격대상 웹 페이지에 include의 파라미터로 넘겨 공격을 수행하거나 현재 시스템의 로컬 파일에 접근한다.
- Local File Inclusion (LFI)
- 이미 같은 시스템 내에 존재하는 파일을 include시키는 방식이다.
- Remote FIle Inclusion (RFI)
- 외부에 있는 파일을 원격으로 include시키는 방식이다.
- 공격을 위한 간단한 PHP파일 작성
- 웹에서 접근 가능하도록 /opt/lampp/htdocs에 생성
- DVWA file inclusion탭의 첫 번째 파일 Open
- 사용자의 이름과 IP를 출력하는 간단한 웹 페이지이다.
- include로 앞서 작성한 PHP파일을 삽입
- 작성한 PHP파일에 삽입된 것을 확인
- include를 위한 PHP파일 수정
- php의 system명령어를 통해 cat /etc/passwd을 수행하도록 하였다.
- 공격이 성공된 모습
- 로컬 시스템의 파일에 접근하는 방식이다.
- 단순한 RFI 공격에 실패한 모습
- 소스코드
- 앞서 CSRF의 대응방법에서 보았던 거와 거의 동일한 방식이다.
- 문제가 될 수 있는 문자를 공백으로 치환하는 방식이다.
- http, https 등을 막아 다른 RFI공격에 대응하고, ../, ..\등으로 path Traversal공격에 대응한다.
- 우회방법
- http:/를 공백으로 치환하고 있다. http:/ 사이에 http:/를 삽입한다면 http:/를 공백으로 치환 후에도 http:/가 된다.
ex) hthttp:/tp:/에서 http:/를 공백으로 치환하면 http:/가 남게 된다.- 문제가 될 수 있는 문자를 한 번만 치환하는 것이 문제이다.
- 우회결과
- Path Traversal?
- 임의로 디렉토리 경로를 조작하여 권한 외의 파일에 접근 가능한 취약점이다.
- ../ : 상위 디렉토리로 이동
- ../를 충분히 입력하여 최상위 디렉토리로 이동하여, 최상위 디렉토리에서 /etc/passwd에 접근할 수 있다.
- Medium단계의 우회 방법이 불가능한 모습
- 소스코드
- fnmatch함수를 통해 파라미터의 이름이 file로 시작하지 않거나 include.php가 아닌 경우 에러를 발생시킨다.
- 위 대응 방법으로 RFI공격에 대해서는 대응이 되었다.
- 우회방법
- file을 디렉토리로 하여 상위 디렉토리로(../) 충분히 이동한 뒤 /etc/passwd파일을 include시켰다.
- 즉, Path Traversal공격에는 대응하지 못했다.
- High단계의 우회 방법이 불가능한 모습
- 소스코드
- 꼭 필요한 파일만 include될 수 있도록 완전히 정적으로 파일을 지정하였다.
WoW 좋은 내용 감사합니다