파일 인클루전(file inclusion)
공격자가 악성 서버 스크립트를 서버에 전달하여 해당 페이지를 통해 악성 코드를 실행시키는 공격
주로 php 애플리케이션에서 발생한다. php의 include()를 이용해 파일을 직접 소스 코드에 삽입할 수 있기 때문이다.
삽입할 악성 서버 스크립트 파일의 위치가 로컬 서버에 위치하는지 원격지에 위치하는지에 따라 LFI(Local File Inclusion)와 RFI(Remote File Inclusion)로 나뉜다.
- LFI
- : 이미 시스템에 존재하는 파일을 인클루드
- RFI
- : 외부에 있는 파일을 원격으로 인클루드하는 것으로, LFI보다 강력한 공격이다.
공격 개요
웹api는 file.php를 인클루드하고 있는데, 이 file.php가 웹요청에 의해 지정되고 있는 상황이다.
이 때
해커가 file.php 대신, hacker.com이라는 서버를 구축한 후 hacker.com에 있는 bad.php를 인클루드 할 것을 지정한다고 하자.
여기서 웹api가 입력값을 검사하지 않는다면?
bad.php를 받아와서 인클루드 한다음에 bad.php를 실행하게 된다.
실습
※ "화이트 해커를 위한 웹 해킹의 기술" 강의 및 책에 수록된 실습이다.
※ 허가 받지 않은 웹사이트에 해킹을 시도 하는 것은 불법.
※ dvwa 등 테스트 가능하게 만들어진 곳에서만 모의해킹을 해야한다.
low 단계
dvwa security를 low로 설정한 뒤, 터미널을 열어 /opt/lampp/htdocs에 다음과 같은 php파일을 만들었다.
이후 dvwa에 파일인클루젼 탭으로 가서, 주소창에 bad.php 파일의 주소를 붙여 입력해주면
파일인클루전 공격이 성공한 것을 볼 수 있다. 이건 dvwa 서버 외부에 있는 내 파일을 인클루드한 것이므로, RFI 공격이다.
bad.php 파일 내용에 cat /etc/passwd 명령을 추가하면
페이지 새로고침했을 때 계정정보까지 알 수 있게된다.
LFI 공격도 해보자. 파일 인클루전 탭의 주소창에 page=/etc/passwd 를 쓰고 새로고침하면
똑같이 공격이 잘 실행된다.
이 때, page= 옆에 ../를 충분히 많이 쓰게 되면 최상위 디렉토리(/)로 갈 수 있다.
이런 방식으로 최상위 디렉토리로 접근하는 공격을 패스 트래버설(Path Traversal)이라고 한다.
medium 단계
security를 medium으로 변경 후 파일 인클루전 페이지로 가서 현재 주소page=에 http://127.0.0.1/bad.php를 입력했다.
소스코드를 보면,
page에 GET으로 받은 입력값에서
http:// 또는 https:// 와 같은 원격 사이트로 접속할 때 필요한 프로토콜을 지워버리고 있고,
../ 와 ..\(윈도우에선 역슬래쉬를 씀)도 지워버림으로써 패스 트래버설 공격을 막고 있다.
그런데 http://나 https://, ../, ..\ 를 한 번씩만 지우고 있으므로 두 번 중첩해서 쓰면 공격이 잘 성공할 것이다.
따라서 주소창에 다음과 같이 입력하면 된다.
page=hthttp://tp://127.0.0.1/bad.php
high 단계
security를 high로 올린 후, 파일인클루전 탭에서 midium 난이도에서 했던 공격 그대로 해봤다.
LFI 공격도 해봤는데,
소스 코드를 살펴보자.
fnmatch 라는 함수를 쓰고 있는데, page에 GET으로 받은 입력값이 file로 시작하는지 확인하고 있다.
fnmath() : 파일 이름이 패턴과 일치하는지 확인하는데 사용되는 PHP 내장 함수. 파일 시스템에 의존하지 않으며, 단순히 문자열을 비교.
즉, page 파라미터의 값이 file로 시작하지 않거나 include.php 가 아니라면 에러문구를 출력하고 있다.
그러면 일단 file을 먼저 입력하고, 패스 트래버설 공격을 막는 코드는 없으니 ../을 충분히 입력해서 /etc/passwd 를 확인할 수 있을 것이다.
파일 인클루전 공격 대응_impossible 단계
security를 impossible로 바꾸고 파일 인클루전 탭에서 high 단계에서 했던 패스 트래버설 공격을 똑같이 시도했다.
소스 코드를 보면,
file 파라미터의 값이 include.php, file1.php, file2.php, file3.php 인지 정확하게 검사하고 있다.
입력값이 이 php파일들이 아니라면 에러가 뜨게 해놨다.
이렇게 파일 하나하나 맞는지 확인하는 철저한 코드를 짜서, 꼭 필요한 파일만 인클루드 할 수 있도록 대응하면 된다.
또한
사용자의 입력값을 통해 파일명이 결정될 때 외부의 악의적인 파일이 포함되어 실행되지 않도록 PHP 설정 파일인 php.ini 파일에서 allow_url_fopen을 off 설정하여 대응할 수 있다.
'Web hacking > 기법' 카테고리의 다른 글
SQL injection_(2) WHERE문 우회 (0) | 2023.04.18 |
---|---|
SQL injection_(1) 공격 개요 (0) | 2023.04.18 |
CSRF(2) (0) | 2023.03.23 |
CSRF(1) (0) | 2023.03.23 |
커맨드 인젝션(command injection) (1) | 2023.02.23 |