
1) File Upload 공격이란?
File Upload: 공격자가 원하는 임의의 파일을 업로드 할수 있는 공격
2) 발생 원인
3) 발생 위치
4) 공격 시나리오
① 서버측 실행 파일 업로드
② 피싱(Phising) 유도
③ Deface 공격
④ Stored XSS
⑤ DoS (Denial Of Service)
1) Web Shell 이란?
<?php
echo system($_GET['cmd']);
?>
2) 파일 업로드 공격 절차
1. 웹쉘 파일 작성
| web_shell.php 작성 |
|---|
![]() |
2. 해당 웹쉘 파일 업로드
| (1) Fild Upload 취약점이 있는 페이지 |
|---|
![]() |
| (2) 작성한 Web Shell 파일 업로드 |
|---|
![]() |
![]() |
3. 업로드된 파일 요청
| URL을 통해 파일 요청 |
|---|
![]() |
| ○ 아직 cmd 파라미터를 전달하지 않아 오류 발생 |
4. 명령어 전달
| Burp - Repeater 를 통해 cmd 파라미터에 명령어 전달 |
|---|
![]() |
3) Web Shell 공격의 핵심
웹 서버에서 실행할 수 있는 파일을 업로드할 수 있어야 한다.
▶ php · jsp ·asp · exe · .sh · .bat
업로드 된 파일의 경로를 알아야 한다.
▶ 해당 파일을 요청(실행)하기 위함이다.
▶ 업로드 된 파일이 출력되는 위치 확인 / 이미지의 경우 이미지 주소 복사
1. MIME 타입을 검사하는 경우
| (1) web_shell.php 의 MIME 타입 |
|---|
![]() |
| (2) MIME 타입 검사 결과, image 파일만 업로드 가능 |
|---|
![]() |
| (3) Proxy를 통해 업로드 되는 web_shell.php 파일의 Content-Type 변조 |
|---|
![]() |
| (4) Content-Type 우회로 웹 쉘 업로드 성공 |
|---|
![]() |
2. 파일이 업로드 되는 경로의 실행권한이 없는 경우
| (1) Burp Suite 의 Intercept 상태에서 웹셀 파일 업로드 |
|---|
![]() |
| (2) file name에 경로(../) 를 추가하여 파일이 저장되는 경로 변조하여 업로드 |
|---|
![]() |
3. 블랙리스트 기반의 필터링이 적용되어 있는 경우
| 다른 확장자 예시 |
|---|
![]() |
4. 특정 확장자를 사용할 수 없도록 설정한 경우
1) test.png.php
파일이름(test) 바로 뒷부분으 png 이므로 파일이 업로드 되는 경우가 존재한다.
그러나, 실제로는 php 파일이므로 실행이 가능하게 된다.
2) test.php%00.png
업로드할때 png로 인식되지만, 시스템에 등록될때는 %00(NULL) 바이트에 의해 뒷부분이 없어져 test.php로 반응되게 된다.
3) test.php.png의 경우?
1) 과 2)의 경우처럼 뒷부분이 php로 끝나야만 php 확장자로 생각되고 실행가능하다.
따라서 이 경우가 가능하려면 htaccess 파일이 먼저 업로드되어야 한다.
▶ htaccess : 웹 서버에 사용되는 구성파일로서, 특정 확장자에 따른 실행 동작을 설정한 뒤, 이를 Directory Traversal 취약점을 이용하여 기존 파일을 덮어씌우면 실행가능하게 된다.
5. 파일 시그니처로 탐색하는 경우
| 파일 시그니처 |
|---|
![]() |
File name에서 확장자를 php로 변경
▶ 그림 파일 안의 웹쉘 코드도 php파일로서 인식이 되어야하기 때문에 확장자를 변경하여 업로드 되는지 확인
시그니처 맨아래에 웹쉘 코드 작성
▶ 업로드 되어 실행되게 되면, 시그니처 맨 뒤의 웹셀 코드에 의해 실행된 명령어 결과가 같이 출력된다.
1) BLOB / CLOB 방식으로 업로드 파일을 DB에 저장
▶ 기존은 업로드 되는 파일이 웹서버에 저장되었기 때문에 실행될 수 있었다.
그러나, DB테이블 안에 Binary 형태로 존재하는 경우 실행할 수 없게 된다.
2) NAS
: 웹서버와 파일이 저장되는 서버를 분리하는 방식
▶ 분리되어 있는 서버에 실행엔진이 적용되어있어서는 안된다.
3) 파일 검증 방법