TeamH4C

[빡공팟 5기] W5 : DVWA 실습 - File Inclusion

이유갬 2022. 10. 23. 02:20

[File Inclusion 의 정의]

File Inclusion 은 파일 삽입 취약점이라고 한다.

이는, 악성 스크립트를 삽입한다면 해당 페이지가 악성 코드를 실행하게된다.

 

[File Inclusion 의 종류]

1. LFI(Local File Iclusion) : 공격자가 공격 대상 서버에 업로드 되어 있는 파일을 실행하여 공격에 활용하는 취약점이다. -> include, require 등의 함수가 활성화 된 페이지 확인

2. RFI(Remote File Inclusion) : 공격자가 외부 서버에 있는 원격 파일을 URL 파라미터에 포함시키고 전달하여 실행한다.

-> 공격할 대상 페이지 URL 에 파라미터에 원격지 웹 쉘 경로를 삽입한다.

3. 경로 제한, 파라미터 변조, 경로 접근, 파일 실행 등의 다양한 공격으로 활용이 가능하다.


[초기 화면]

- 3개의 파일이 올라와있다. 한번 다 클릭해보자.

- 내 계정과 IP 주소, user-agent 정보와 지금 내가 어디서 왔는지를 알려준다.

- 파일 경로를 그냥 알려줘버리는 연약한 친구이다.

- 내가 해커라고 생각하고 한번 연약한 친구를 공격해보자!

- 일단, include 라는 키워드가 눈에 딱 들어온다! LFI 공격이 생각나는 시점이다.

- 혹시 모르니 소스 코드를 확인해보았다. 별 다른 문제는 없어 보인다. 그저 파라미터로 페이지를 불러오는 것?

- 파라미터로 불러오는 것도 매우 연약하다.

- 그래서 한번 file 4 를 쳐보았다.

- 숨겨진 파일인데 알아서 잘 찾았다고 칭찬해주는 것 같다. 감사합니당 ^_^

- LFI 공격은 include 함수가 활성화 된 페이지에서 발생시킬 수 있다는데 아마 include.php 가 해당 페이지인 것 같다.

- 그래서 URL 에 /etc/passwd 를 입력했더니 모든 정보가 나왔다. 내 계정도 저기 있네 ㅎㅅㅎ

- 원래 저렇게 하면 안될거라고 생각했는데 ../../ 를 적지 않아도 나왔다. 

- 이때, View Help 를 보면 뭘 해야하는지 알려준다. 여기서 뭘 더 하라는 건가 답답했는데 아주 좋았다^_^

- Read all five famous quotes from '../hackable/flags/fi.php' using only the file inclusion.

- 5개의 유명한 인용문을 읽으라고 한다. 그래서 file2 에 영문 모를 문장들이 적혀있었나보다!

- 메타문자는 기본적으로 많이 적으라는 말에 따라 열심히 디렉토리를 탈출한다음 읽어야 할 경로를 입력해주었다.

- 아무것도 뜨지 않았다. 대체 기본적으로 많이 적으라는 말은 난 어디서 본걸까..?

- 결국 순서대로 ../ 를 1개씩 추가했다.

- ../../ 를 입력하니 이런 내용이 나왔다.

- 5문장 중 3문장을 볼 수 있었다.

- 숨겨놓은 문장을 찾아보자.

- 개발자 도구를 이용하여 소스 코드를 보니 5번 문장은 주석처리가 되어있었다. 그럼 3번 문장만 찾으면 된다.

- 이때, LFI 공격을 PHP wrapper 를 많이 이용하는데 특히 base64 인코딩 방식을 많이 사용한다고 한다.

127.0.0.1/vulnerabilities/fi/?page=php://filter/convert.base64-encode/resource=../../hackable/flags/fi.php

- 따라서 위와 같은 URL 을 삽입해보았다.

- 응답들이 모두 base64 로 인코딩되어 출력되었다. 이를 base64 로 디코딩해보았다.

- 디코딩 결과를 보니 3번 문장은 로미오와 줄리엣에 나오는 대사인듯하다!

- 이제 RFI 공격을 실습해보자.

- 위와 같은 내용의 php 문법을 사용한 파일을 만들어서 서버에 올렸다.

- 먼저 내 웹 서버에 shell 파일을 올려서 내용이 출력되는지 확인해봤다.

- 이렇게 뜬다.

- 그래서 명령어를 입력해보았는데 아무일도 일어나지 않았다..

- 몇 번을 반복해도 먹히지 않아서 아래와 같이 그냥 미리 정보를 알아낼 수 있는 명령어를 입력했다.

- 그리고 LFI, RFI 는 확장자를 구분하지 않으므로 .txt 해도 상관이 없다고 한다.

<pre><?php system('uname -a; id'); ?></pre>

- 드디어 출력에 성공했다!

- 이렇듯 원격 서버에 올라와 있는 파일을 삽입하여 정보를 탈취할 수도 있다!