| File Upload 취약점
공격자가 원하는 임의의 파일을 업로드할 수 있는 취약점
ex) 서버에서 실행시킬 수 있는 스크립트 파일
| File Upload 취약점이 발생할 수 있는 곳
파일 업로드를 할 수 있는 곳.
ex) 프로필 사진, 게시판, 서류 제출
취약점 발생 원인: 파일을 업로드 받을 때 별다른 검증, 검사를 하지 않기 때문에 발생 합니다.
| 공격 시나리오
- 서버 측 실행 파일
- 서버에서 사용하는 언어를 알아낸 뒤, 해당 언어로 우리가 원하는 코드를 실행할 수 있도록 할 수 있습니다.
- Phising
- HTML 파일을 올림으로써 피싱 공격을 유도할 수 있습니다.
- Deface
- 웹 사이트를 무단으로 변경하거나 변조하는 공격을 말합니다. 보안뉴스(링크참고) 에 따르면 화면을 마음대로 바꾸고 해킹에 성공했음을 알리는데 사용되는 공격을 말합니다.
- XSS
- 파일에 대한 검사를 하지 않아서 파일 업로드 취약점이 있을 때, 악성 스크립트 파일을 올릴 수 있게 되며 올린 파일의 경로로 접속하면 해당 스크립트가 실행됩니다.
- Dos (Denial of Service) - 서비스 거부 공격
- 파일 업로드로 서버에 매우 큰 파일을 올림으로써 서버가 재기능을 하지 못하도록 합니다.
❓ Web Shell 공격
파일 업로드 공격 중에 서버 측 실행 코드에 해당하는 Web Shell 공격에 대해서 설명하겠습니다.
Web Shell 공격은 간단하게 말해서 사용자가 웹서버에서 동작하는 스크립트를 이용하여 서버에 접근한 뒤, 불법적인 행위를 하는 공격을 말합니다. 이러한 Web Shell 공격은 웹 서버가 사용하고 있는 언어(php, jsp, asp 등등)가 사용된 스크립트 파일을 업로드 함으로써 서버에게 명령하게 됩니다. 서버에게 명령할 수 있기 때문에 악의적인 사용자들은 이를 악용하여 불법적인 행위를 저지를 수 있습니다.
- Web Shell 공격의 핵심
- 웹 서버 측 실행 코드를 업로드 합니다.
- 업로드된 파일의 경로를 알아야 합니다.
Web Shell 공격은 웹 서버 측 실행 코드를 이용하여 서버에 접근할 수 있습니다. 파일 업로드를 통해 Web Shell 파일을 업로드하면 해당 경로를 알아야 하는데 경로를 알아야 Web Shell 을 실행할 수 있기 때문입니다.
| File Upload 취약점(실습)
간단한 실습을 통해 File Upload(파일 업로드) 취약점이 무엇인지에 대해서 알아보겠습니다. 우선 게시판에 글을 쓸 수 있는 웹사이트가 있고 파일 업로드 기능이 있다고 가정합니다. 이때 웹 쉘(WebShell)파일을 업로드합니다. (웹 쉘 파일 내용은 게시판 사진 아래를 참고해 주세요.)


[🧐webshell.php 안에 내용]
// webshell.php
<?php
echo system($_GET['cmd']);
?>
webshell.php 코드를 보면 정말 간단한 웹 쉘 코드입니다. 해석을 해보면 php 내장 함수인 system 함수가 cmd 파라미터에 들어온 값을 서버의 명령어로 실행하게 됩니다. ex) webshell.php?cmd=___내용부분___ 내용부분에 입력된 값들이 서버의 운영체제 명령어로 실행된다는 의미입니다. 이를 이해하고 이제 파일을 업로드 해보겠습니다.

파일 업로드를 한 뒤의 해당 게시글에 접속해 보면 위와 같이 나오는 것을 볼 수 있습니다. 웹 쉘 공격에 핵심 중 하나는 '웹쉘 코드가 업로드된 경로를 알아야 한다'라고 했었습니다. 따라서 업로드 한 파일이 어디에 있는지를 찾아야 합니다. 찾는 방법은 파일 다운로드 또는 파일을 다운로드 할 수 있는 그런 버튼이 있다면 마우스 우클릭을 하여 링크 주소 복사를 해줍니다.

이제 복사한 주소를 주소창에 입력해서 접속을 해보면 다음과 같이 에러가 나오는데 이는 파라미터값이 전달되지 않았기 때문입니다.

아까 봤던 webshell 코드 내용을 보면 파라미터 이름은 cmd 였습니다. 이제 파라미터 값으로 사용자의 현재 경로를 알려주는 명령어인 pwd를 입력하여 서버에서 명령어가 실행되는지 확인해봅니다.

위 사진을 보면 사용자가 파라미터에 값(명령어)을 줬을 때 해당 명령어가 실행되어 화면에 출력되는 것을 볼 수 있습니다.
[🧐FileUpload 기능 구현 코드]
if (isset($_FILES['file']) && $_FILES['file']['error'] === 0) {
$file = $_FILES['file'];
$fileName = basename($file['name']);
$fileTmpName = $file['tmp_name'];
$fileSize = $file['size'];
}
위 코드는 실습 사이트에서 사용했던 파일 업로드 기능을 처리하는 코드입니다. 실습에서 .php 파일을 업로드 할 수 있었던 이유는 파일 확장자를 검사하는 로직이 없었기 때문입니다. 따라서 웹쉘 파일을 이용하여 악용하는 것을 방지하기 위해서는 파일 확장자를 검사하는 로직을 추가해야 합니다.
실습을 통해 파일 업로드 취약점에 대해서 알아봤는데 파일 업로드 취약점도 여러 우회 기법이 존재합니다. 다른 글에서 우회 기법들을 알아보면서 어떻게 대응할 수 있는지도 함께 알아보겠습니다.
'[WEB] 모의해킹 > File Upload' 카테고리의 다른 글
| File Upload(파일 업로드) 취약점을 이용한 XSS 공격 with .SVG (0) | 2026.01.25 |
|---|