EYEN
[드림핵 웹 해킹] STAGE 8: File Vulnerability- upload 본문
#1 서론
파일을 업로드하고 업로드된 파일을 다운로드 받을 때 발생하는 취약점이다
이용자가 업로드한 파일을 데이터베이스에 저장하는 것보다 서버의 파일 시스템에 저장하는 것이 개발하기 쉽고, 관리 효율도 높으나 파일 업로드 취약점을 일으킬 수 있다.
#2 Path Traversal
1) 취약점: File Upload Vulnerability
- 의미: 공격자의 파일을 웹 서비스의 파일 시스템에 업로드하는 과정에서 발생하는 보안 취약점
- 조건
: 이용자가 업로드될 파일의 이름을 임의로 정할 수 있어서 파일 시스템 상 임의 경로에 원하는 파일을 업로드하거나 악성 확장자를 갖는 파일을 업로드할 수 있을 때
원하는 시스템 커맨드를 실행하는 ‘원격 코드 실행 취약점’을 유발할 수 있을 때
- 취약점
: 파일 이름에 이용자가 입력한 문자열을 그대로 사용하거나 이용자의 이메일,닉네임 등을 포함시키는 등의 소스 패턴
- 공격
: CGI로 실행되는 파일을 업로드해 시스템에 임의 명령어를 실행하거나, HTML로 해석되는 파일을 업로드하여 Cross-Site-Scripting(XSS) 공격을 수행할 수 있음. Path Traversal 취약점과 연계하여 업로드 폴더를 벗어난 곳에 공격자의 파일을 저장하는 공격도 있음.
2) Path Traversal 예시
대부분의 서비스는 웹 서버의 소스코드나 서버에 있는 중요 시스템 파일을 덮어 쓸 위험에 방지하여 특정 디렉토리에만 업로드를 허용한다.
이를 우회하여 임의 디렉토리에 파일을 업로드할 수 있는 취약점을 말한다.
파일 업로드 기능에 Path Traversal 취약점이 있는 코드
from flask import Flask, request
app = Flask(__name__)
@app.route('/fileUpload', methods = ['GET', 'POST'])
def upload_file():
if request.method == 'POST':
f = request.files['file']
f.save("./uploads/" + f.filename)
return 'Upload Success'
else:
return """
<form action="/fileUpload" method="POST"
enctype="multipart/form-data">
<input type="file" name="file" />
<input type="submit"/>
</form>
"""
if __name__ == '__main__':
app.run()
/fileUpload:POST 요청을 받으면, 클라이언트가 전송한 파일을 ./uploads에 저장.
그런데 이용자가 입력한 파일 이름 f.filename을 검증하지 않고 그대로 사용
⇒Path Traversal 취약점
예를 들어, 공격자가 ../와 같은 메타문자를 사용하면 uploads를 벗어나 상위 디렉토리에도 파일을 업로드할 수 있다.
- 정상적으로 요청했을 때
정상적인 파일 업로드 HTTP 요청
POST /fileUpload HTTP/1.1
Host: storage.dreamhack.io
Origin: <https://storage.dreamhack.io>
Content-Type: multipart/form-data; boundary=----
WebKitFormBoundary20y3eoLVSNf9Ns5i
------WebKitFormBoundary20y3eoLVSNf9Ns5i
Content-Disposition: form-data; name="file";
filename="test.txt"
Content-Type: text/plainupload test !
------WebKitFormBoundary20y3eoLVSNf9Ns5i--
요청의 filename 필드의 값이 취약점 코드 내 f.filename 변수의 값이 된다.
이처럼 요청을 보내면, 다음과 같이 uploads 폴더에 test.txt가 생성된다.
서버 파일 시스템 확인
$ ls -lR
-rw-r--r-- 1 dreamhack staff 461 1 30 21:52 app.py
drwxr-xr-x 3 dreamhack staff 96 1 30 21:31 uploads
./uploads:
total 8
-rw-r--r-- 1 dreamhack staff 13 1 30 21:31 test.txt
- 악의적으로 요청했을 때
****filename 필드를 변조해서 Path Traversal을 ****수행하는 HTTP 요청
POST /fileUpload HTTP/1.1
Host: storage.dreamhack.io
Origin: <https://storage.dreamhack.io>
Content-Type: multipart/form-data; boundary=----
WebKitFormBoundary20y3eoLVSNf9Ns5i
------WebKitFormBoundary20y3eoLVSNf9Ns5i
Content-Disposition: form-data; name="file";
filename="../hack.py"
Content-Type: text/plain
[malicious file content]
------WebKitFormBoundary20y3eoLVSNf9Ns5i--
filename에 ..이 포함됨: 상위 디렉토리에 파일이 저장
요청을 전송하면, 다음과 같이 app.py와 같은 디렉토리에 hack.py가 생성된다.
여기서 만약 app.py를 덮는다면, 서버가 재실행될 때 임의 파이썬 코드를 실행할 것이다.
공격을 당한 서버 파일 시스템 확인
$ ls -lR
-rw-r--r-- 1 dreamhack staff 461 1 30 21:52 app.py
-rw-r--r-- 1 dreamhack staff 431 1 30 22:12 hack.py
drwxr-xr-x 3 dreamhack staff 96 1 30 21:31 uploads
./uploads:
total 8
-rw-r--r-- 1 dreamhack staff 13 1 30 21:31 test.txt
#3 악성 파일 업로드
- 악성 파일 업로드 취약점
이용자가 파일을 업로드할 때, 이를 제대로 검사하지 않아서 발생하는 취약점을 말합니다.
- **웹 셸(**임의 시스템 명령어를 실행해주는 웹 리소스)
(1)웹 서버는 .php, .jsp, .asp와 같은 확장자의 파일을 **Common Gateway Interface(CGI)**로 실행하고, 그 결과를 이용자에게 반환
(2) 많은 웹 서버들이 php파일에 대한 확장자만 검증한 뒤, 요청한 파일을 실행하고 결과를 반환하는 핸들링을 지원하고 있다
⇒ 공격자가 임의의 php 소스 파일을 .php 확장자로 업로드하여 GET 요청을 보낼 수 있다면 CGI에 의해 해당 코드가 실행되도록 할 수 있다.
Apache 설정 파일
<FilesMatch ".+\\.ph(p[3457]?|t|tml)$">
SetHandler application/x-httpd-php
</FilesMatch>
이용자가 요청한 파일의 확장자가 정규표현식 ".+\\.ph(p[3457]?|t|tml)$"를 만족하면, x-httpd-php로 핸들링하게 하는 Apache 설정 파일
x-httpd-php : PHP 엔진이며 요청한 파일을 실행하고, 그 결과를 반환
정규표현식 ".+\\.ph(p[3457]?|t|tml)$"를 만족하는 확장자: .php, .php3, .phtml
2. 악의적인 웹 리소스
웹 브라우저는 파일의 확장자나 응답의 Content-Type에 따라 요청을 다양하게 처리한다.
(1) 요청한 파일의 확장자가 .html or 반환된 Content-Type 헤더가 text/html일 경우
응답→ HTML 엔진
(2) 요청한 파일의 확장자가 .png, .jpg등의 이미지 확장자 or Content-Type이 image/png일 경우
응답→이미지로 렌더링
⇒공격법
- 공격자가 서버에 exploit.html을 업로드하고, 이에 접근하는 URL이 https://dreamhack.io/uploads/exploit.html
- xss공격 html을 업로드하는데 내용이 <script>alert(1)</script> 이런거
이렇게 되면 브라우저는 이를 HTML로 해석하여 exploit.html에 악의적인 스크립트를 삽입하면, Cross-Site-Scripting (XSS) 공격으로 이어질 수 있다.
- 예방법
- 개발자가 업로드 디렉토리를 웹 서버에서 직접 접근할 수 없거나 업로드 디렉토리에서는 CGI가 실행되지 않도록 한다.
- 업로드된 파일 이름을 그대로 사용하지 않고 basepath와 같은 함수를 통해 파일 이름을 검증한 후 사용한다.
- 허용할 확장자를 명시해 그 외 확장자는 업로드될 수 없도록 해야 합니다.
'Wargame > Web' 카테고리의 다른 글
웹 1234 (0) | 2023.01.28 |
---|---|
[드림핵 웹 해킹] STAGE 8: File Vulnerability- download (0) | 2022.10.31 |
[드림핵 웹 해킹] STAGE 7 : COMMAND INJECTION (0) | 2022.10.31 |
[드림핵 웹해킹] STAGE 6 : NO SQL INJECTION(Blind SQL Injection) (0) | 2022.10.31 |
[드림핵 웹해킹] STAGE 6 : SQL INJECTION (0) | 2022.10.31 |