STAGE 8 File Vulnerability
-ServerSide: File Vulnerability
파일 공유 서비스를 개발할 때, 이용자가 업로드한 파일을 데이터베이스에 저장하는 것보다는 서버의 파일 시스템에 저장하는 것이 개발하기 쉽고 관리 효율도 높다.
그러나 임의 파일이 다운로드 되는 취약점이나, 악성 웹셸 파일을 업로드하여 임의 코드를 실행할 수 있는 취약점을 발생시키기도 한다.
파일 취약점 (File Vulnerability): 파일을 업로드하거나 다운로드 할 때 발생하는 취약점 업로드와 다운로드 과정에서 발생하는 취약점으로 구분된다.
파일 업로드 취약점(File Upload Vulnerability):파일 업로드와 관련해서 발생하는 취약점
공격자의 파일을 웹 서비스의 파일 시스템에 업로드하는 과정에서 발생하는 보안 취약점
파일 시스템 상 임의 경로에 원하는 파일을 업로드하거나 악성 확장자를 갖는 파일을 업로드할 수 있을 때 발생
원하는 시스템 커맨드를 실행하는 원격 코드 실행 취약점을 유발할 수 있다.
파일 업로드 취약점은 크게 Path Traversal과 악성 파일 업로드로 분류
파일 업로드를 허용하는 대개의 서비스는 보안을 위해 특정 디렉토리에만 업로드를 허용
만약 이러한 제한이 없다면, 악의적인 이용자가 웹 서버의 소스 코드나 서버에 있는 중요 시스템 파일을 덮어 쓸 위험이 있다.
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/plain
upload test !
------WebKitFormBoundary20y3eoLVSNf9Ns5i--
요청의 filename 필드의 값이 코드 내 f.filename 변수의 값이 된다.
서버 파일 시스템 확인
$ 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
요청을 보내면, uploads 폴더에 test.txt가 생성
악의적인 파일 업로드 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 필드를 변조해서 Path Traversal을 수행하는 HTTP 요청
filename에 ..이 포함되어 있으므로 상위 디렉토리에 파일이 저장된다.
공격을 당한 서버 파일 시스템 확인
$ 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
요청을 전송하면, app.py와 같은 디렉토리에 hack.py가 생성
app.py를 덮는다면, 서버가 재실행될 때 임의 파이썬 코드를 실행할 수 있다.
악성 파일 업로드 취약점 : 이용자가 파일을 업로드할 때 이를 제대로 검사하지 않아서 발생하는 취약점
웹 셸
웹 서버는 .php, .jsp, .asp와 같은 확장자의 파일을 Common Gateway Interface(CGI)로 실행하고, 그 결과를 이용자에게 반환
공격자가 임의의 php 소스 파일을 .php 확장자로 업로드하고, GET 요청을 보낼 수 있다면 CGI에 의해 해당 코드가 실행되도록 할 수 있다.
악의적인 웹 리소스
웹 브라우저는 파일의 확장자나 응답의 Content-Type에 따라 요청을 다양하게 처리한다.
요청한 파일의 확장자가 .html 이거나, 반환된 Content-Type 헤더가 text/html일 경우 응답은 HTML 엔진으로 처리
파일의 확장자가 .png, .jpg등의 이미지 확장자이거나, Content-Type이 image/png일 경우에는 이미지로 렌더링된다.
공격자가 서버에 exploit.html을 업로드하고, 이에 접근하는 URL이 https://dreamhack.io/uploads/exploit.html이라면, 브라우저는 이를 HTML로 해석
exploit.html에 악의적인 스크립트를 삽입하면, Cross-Site-Scripting (XSS) 공격으로 이어질 수 있다.
파일 다운로드 취약점(File Download Vulnerability) : 웹 서비스를 통해 서버의 파일 시스템에 존재하는 파일을 내려 받는 과정에서 발생하는 보안 취약점
이용자가 다운로드할 파일의 이름을 임의로 정할 수 있을 때 발생
공격자는 서버 파일 시스템에 존재하는 임의 파일을 다운로드하여 민감 정보가 포함된 파일을 탈취할 수 있다.
웹 서비스는 이용자가 업로드한 파일을 다운로드 받거나 이미지를 불러올 때 특정 디렉토리에 있는 파일만 접근하도록 해야 한다.
Path Traversal을 이용한 파일 다운로드 취약점 : 파일 이름을 직접 입력 받아 임의 디렉토리에 있는 파일을 다운로드 받을 수 있는 취약점
업로드 취약점을 막으려면 개발자는 업로드 디렉토리를 웹 서버에서 직접 접근할 수 없도록 하거나, 업로드 디렉토리에서는 CGI가 실행되지 않도록 해야 하고 업로드된 파일 이름을 그대로 사용하지 않고 basepath와 같은 함수를 통해 파일 이름을 검증한 후 사용해야 하고, 허용할 확장자를 명시해 그 외 확장자는 업로드될 수 없도록 해야 한다.
다운로드 취약점을 막으려면 요청된 파일 이름을 basepath과 같은 함수를 통해 검증하거나 파일 이름과 1:1 맵핑되는 키를 만들어 이용자로부터 파일 이름이 아닌 키를 요청하도록 해야 한다.
'빡공팟(P4C)' 카테고리의 다른 글
웹해킹트랙 5주차 과제 - DVWA 환경 구축 (0) | 2022.10.22 |
---|---|
웹해킹트랙 4주차 과제 - 드림핵 웹해킹1 #Server Side Request Forgery(SSRF) (0) | 2022.10.19 |
웹해킹트랙 4주차 과제 - 드림핵 웹해킹1 #Command Injection (0) | 2022.10.19 |
웹해킹트랙 4주차 과제 - 드림핵 웹해킹1 #SQL Injection (0) | 2022.10.19 |
웹해킹트랙 4주차 과제 - 드림핵 웹해킹1 #Cross-Site-Request-Forgery(CSRF) (0) | 2022.10.19 |