프롤로그
웹개발 하면서 가장 많이 애먹었던 것은 CORS 부분이랑 여기 파일 올릴때 보안 정책이었다. 그것에 대해 배우는 것 같아서 이제 웹개발할때 조금 더 편하지 않을까 싶다.
서론
파일 공유 서비스를 개발할때, 이용자가 업로드한 파일을 데이터베이스에 저장하는 것보다는 서버의 파일 시스템에 저장하는 것이 개발하기 쉽고, 관리 효율도 높으나 임의 파일이 다운로드 되는 취약점이나, 악성 웹셸 파일을 업로드 하여 임의 코드를 실행할 수 있는 취약점이 발생되기도 한다.
파일 업로드와 관련해서 발생하는 취약점은 파일 업로드 취약점(File Upload Vulnerability)이다. 파일 시스템상 임의 경로에 원하는 파일을 업로드 하거나 악성 확장자를 갖는 파일을 업로드할 수 있을 때 발생한다. 원하는 시스템 커멘트를 실행하는 원격 코드 실행 취약점을 유발할 수 있다.
반대로 파일 다운 받을 때 발생하는 취약점은 파일 다운로드 취약점(File Download Vulnearability) 라고 한다. 공격자는 웹 서비스의 파일 시스템에 존재하는 임의 파일을 다운로드 받을 수 있다. 민감한 정보 탈취하고 2차 공격 수행할 수 있다.
File Upload Vulnerability(파일 업로드 취약점)
웹 서비스를 통해 이용자의 파일을 서버의 파일 시스템에 업로드하는 과정에서 발생하는 보안 취약점.
이용자가 업로드될 파일의 이름을 임의로 정할 수 있을 때 발생. 소스코드 패턴이 이러한 취약점 발생 가능
(1) 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()
이런 코드에서 파일을 업로드하면 ./uploads/ 라는 디렉터리에 저장이 되는데, 파일명을 그대로 사용하기에 파일명에 ../ 같은 메타문자 사용하면 다른 곳으로 저장이 된다.
(2) 악성 파일 업로드
이용자가 파일을 업로드할 때, 이를 제대로 검사하지 않아서 발생하는 취약점도 있다.
웹 서버는 .php, .jsp, .asp 와 같은 확장자의 파일을 Common Gateway Interface(CGI)로 실쟁하고, 그 결과를 이용자에게 반환한다.
이때 Common Gateway Interface(CGI)란 동적인 컨텐츠를 처리하기 위해서 웹 서버와 php같은 외부의 프로그램에 사이에서 인터페이스를 제공하는 프로토콜이다.
<FilesMatch ".+\.ph(p[3457]?|t|tml)$">
SetHandler application/x-httpd-php
</FilesMatch>
파일의 확장자가
".+\.ph(p[3457]?|t|tml)$">
를 만족하면 x-httpd-php로 핸들링하게 하는 Apache 설정 파일이다. php, php3, phtml 이 정규표현식을 만족한다.
많은 웹 서버들이 php 파일에 대해 위와 같은 핸들링을 지원하는데, 임의의 php 소스 파일을 .php 확장자로 업로드 하고 GET 요청을 보내면 CGI에 의해 해당 코드가 실행되도록 할 수 있다.
File Download Vulnerability(파일 다운로드 취약점)
웹 서비스를 통해 서버의 파일 시스템에 존재하는 파일을 내려받는 과정에서 발생하는 보안 취약점..
이용자가 다운로드할 파일의 이름을 임의로 정할 수 있을 때 발생한다.
웹 서비스는 이용자가 업로드한 파일을 다운로드 받거나 이미지를 불러올 때 특정 디렉터리에 있는 파일만 접근하도록 해야한다.
https://vulnerable-web.dreamhack.io/download/?filename=notes.txt
https://vulnerable-web.dreamhack.io/download/?filename=../../../../../../etc/passwd
https://vulnerable-web.dreamhack.io/images.php?fn=6ed0dd02806fa89e233b84f4.png
위 세가지 경우에 자주 파일 다운로드 취약점이 자주 발생한다.
에필로그
딱히 어려운 것은 없었는데 리눅스 명령어를 모른다면 좀 헷갈릴 거 같다. 그리고 내가 모르기에 헷갈린다. 시스템 해킹쪽과 리눅스 쪽 문제를 많이 풀어봐야 할 것 같다.
'보안 스터디 > 웹 해킹' 카테고리의 다른 글
[드림핵/워게임] image-storage (웹 해킹) (1) | 2024.01.15 |
---|---|
[드림핵/워게임] file-download-1 (웹해킹) (0) | 2024.01.15 |
[드림핵/워게임] command-injection-1 (웹 해킹) (0) | 2024.01.15 |
[드림핵/웹해킹] ServerSide: Command Injection (1) | 2024.01.15 |
[드림핵/워게임] Mango (웹 해킹) (0) | 2024.01.12 |