- DreamhackWeb Hacking_File Vulnerability2024년 09월 29일 03시 03분 06초에 업로드 된 글입니다.작성자: sonootri
1. 서론
많은 현대 웹 서비스에는 글 만으로 전달하기 힘든 정보를 전달할 수 있도록 이미지나 문서 등의 파일 업로드 기능이 존재한다. 예를 들어, 이용자 간에 사진을 공유할 수 있는 이미지 공유 서비스들은 이미지 파일을 업로드할 수 있는 기능과 업로드 된 이미지를 다른 이용자들이 다운로드 받을 수 있도록 하는 기능을 갖추고 있다.
이러한 파일 공유 서비스를 개발할 때, 이용자가 업로드한 파일을 DB에 저장하는 것보다는, 서버의 파일 시스템에 저장하는 것이 개발하기 쉽고 관리 효율도 높다. 그러나 임의 파일이 다운로드 되는 취약점이나, 악성 웹셸 파일을 업로드하여 임의 코드를 실행할 수 있는 취약점을 발생시키기도 한다.
File Upload Vulnerability는 파일 업로드와 관련해서 발생하는 취약점으로, 공격자의 파일을 웹 서비스의 파일 시스템에 업로드하는 과정에서 발생하는 보안 취약점이다. 파일 시스템 상 임의 경로에 원하는 파일을 업로드하거나 악성 확장자를 갖는 파일을 업로드할 수 있을 경우 발생한다. 원하는 시스템 커맨드를 실행하는 원격 코드 실행 취약점을 유발할 수 있다.
File Download Vulnerability는 파일을 내려받을떄 발생하는 취약점으로, 웹 서비스의 파일 시스템에 존재하는 파일을 다운로드하는 과정에서 발생하는 보안 취약점이다. 공격자는 웹 서비스의 파일 시스템에 존재하는 임의 파일을 다운로드 받을 수 있다. DB 백업본 등을 다운로드하여 민감한 정보를 탈취할 수 있고, 2차 공격을 수행할 수 있다.
2. File Upload Vulnerability
파일 업로드 취약점은 웹 서비스를 통해 이용자의 파일을 서버의 파일 시스템에 업로드하는 과정에서 발생하는 보안 취약점이다. 이용자가 업로드될 파일의 이름을 임의로 정할 수 있을 때 발생한다. 파일 업로드 취약점은 크게 1) Path Traversal과 2) 악성 파일 업로드로 분류된다.
2.1. Path Traversal
파일 업로드를 허용하는 대개의 서비스는 보안을 위해 특정 디렉토리에만 업로드를 허용한다. 만약 이러한 제한이 없다면, 악의적인 이용자가 웹 서버의 소스 코드나 서버에 있는 중요 시스템 파일을 덮어 쓸 위험이 있다. 예를 들어, 주요 실행 코드가 있는 디렉토리로 이동해 해당 코드를 공격자가 작성한 코드로 덮어 쓴다든지....
Path Traversal 취약점은 업로드에 존재하는 이러한 제약을 우회하여, 임의 디렉토리에 파일을 업로드할 수 있는 취약점을 의미한다.
아래는 파일 업로드 기능에 Path Traversal 취약점이 있는 코드이다.
POST 요청일 경우, 클라이언트가 전송한 파일을 ./uploads에 저장한다.
@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> """
그런데 이용자가 입력한 파일 이름 f.filename을 그대로 사용하기 때문에 Path Traversal에 취약하다. 만약 공격자가 파일 이름에 상위 디렉토리로 이동하는 ../와 같은 메타문자를 사용하여uploads 디렉토리를 벗어나면? upload 상위 디렉터리에 파일을 저장할 수도 있게 된다.
f.save("./uploads/" + f.filename)
아래는 filename 필드를 변조해서 Path Traversal을 수행하는 HTTP 요청이다. filename에 ..이 포함되어있어, 상위 디렉토리에 파일이 저장되게 된다.
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--
요청을 전송하면, 아래와 같이 hack.py가 app.py와 같은 디렉토리에 위치하게 된다. 만약 app.py를 hack.py가 덮어 쓴다면, 서버가 재실행될 때 공격자가 작성한 Python 코드가 실행될 수도 있는거다.
$ 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
2.2. 악성 파일 업로드
<웹 셸>
악성 파일 업로드 취약점은, 이용자가 파일을 업로드할 때 이를 제대로 검사하지 않아서 발생하는 취약점을 말한다.
웹 셸(Web Shell)이란, 웹 + 셸의 합성어로 웹 페이지에서 해당 웹 서버의 다양한 명령을 실행시킬 수 있는 스크립트 파일을 의미한다. 웹 셸을 이용하면 관리자 권한을 획들한 후, 웹 페이지의 소스 코드를 열람하거나 서버 내 자료 유출 및 백도어 설치 등 다양한 공격들을 수행할 수 있어, 보통 공격자가 웹 서버의 제어권을 뢱득하기 위해 사용한다.
웹 서버는 .php .jsp .asp와 같은 확장자 파일을 Common Gateway Interface(CGI)로 실행하고, 그 결과를 이용자에게 반환한다. 많은 웹 서버들이 php 파일에 대해 핸들링을 지원한다. 따라서 임의의 php 소스 파일을 .php 확장자로 업로드하고, GET 요청을 보낼 수 있다면 CGI에 의해 해당 코드가 실행되도록 할 수 있다.
+) CGI는 동적인 컨텐츠를 처리하기 위해서 웹 서버와 php 같은 외부의 프로그램의 사이에서 인터페이스를 제공하는 프로토콜이다.
<악의적인 웹 리소스>
웹 브라우저는 파일의 확장자나 응답의 Content-type에 따라 요청을 다양하게 처리한다. 만약 요청한 파일의 확장자가 .html이거나, 반환된 Content-Type 헤더가 text/html일 경우 응담은 HTML 엔진으로 처리된다.
만약 공격자가 서버에 exploit.html을 업로드하고, 이에 접근하는 URL이 https://dreamhcak.io/uploads/exploit.html 이라면, 브라우저는 이를 HTML로 해석한다. 둘 다 Content-type이 html이기 때문이다.
공격자가 exploit.html에 악의적인 스크립트를 삽입하면 XSS 공격으로 이어질 수도 있다.
3. File Download Vulnerability
파일 다운로드 취약점은 웹 서비스를 통해 서버의 파일 시스템에 존재하는 파일을 내겨 받는 과정에서 발생하는 보안 취약점이며, 이용자가 다운로드할 파일의 이름을 임의로 정할 수 있을 때 발생한다.
웹 서비스는 이용자가 업로드한 파일을 다운로드 받거나 이미지를 불러올 때 특정 디렉토리에 있는 파일에만 접근하도록 해야한다. 생각해보면 당연하다. 파일 업로드 취약점과 같이 Path Traversal을 이용한 파일 다운로드 취약점은, 파일의 이름을 직접 입력 받아 임의 디렉토리에 있는 파일을 다운로드 받을 수 있다.
//예시. 파일 다운로드 취약점이 자주 발생하는 URL 패턴 https://vulnerable-web.dreamhack.io/download/?filename=../../../../../../etc/passwd https://vulnerable-web.dreamhack.io/download/?filename=notes.txt
4. File Vulnerability 실습
5. 취약점 방어 방법
업로드 취약점을 막으려면, 개발자는 웹 서버에서 업로드 디렉토리를 직접 접근할 수 없게 하거나, 업로드 디렉토리에서는 CGI가 실행되지 않도록 해야한다. 또한 업로드된 파일 이름을 그대로 사용하지 않고 basepath와 같은 함수를 통해 파일 이름을 검증한 후 사용해야 한다. 그리고 허용할 확장자를 미리 명시해서 그 외의 확장자는 업로드될 수 없도록 해야한다.
다운로드 취약점을 막으려면, 요청된 파일 이름을 basepath와 같은 함수를 통해 검증하거나 파일 이름과 1:1 맵핑되는 키를 만들어 이용자로부터 파일 이름이 아닌 키를 요청하도록 해야한다.
6. Quiz
1) php 확장자를 가진 파일이 정상적으로 php 스크립트 엔진에 실행되고자 한다. (A)와 (B)에 들어갈 말로 올바른 것은?
<FilesMatch ".+\.ph(p[3457]?|t|tml)$"> (A) (B) </FilesMatch>
1. ExecuteWith, application/x-httpd-php
2. SetHandler, application/x-httpd-php O
3. RunPHP, *.php
4. ExecuteWith, PHPHandler
5. GetHandler, application/html
2) 파일 다운로드 취약점이 발생하는 코드이다. "filename" 인자에 어떠한 값을 넣어야 현재 실행중인 프로세스의 메모리 정보를 볼 수 있는가? 해당하는 답안을 모두 고르시오
@app.route("/download") def download(): filename = request.args.get("filename") content = open("/data/uploads/" + filename, "rb").read() return content
1. ../../../etc/memory
2. ../../etc/passwd
3. ../../../proc/self/maps O
4. ../root/memory_information
5. ../../proc/self/maps O
6. ../../etc/memory
7. ../proc/self/maps
3) 악성 파일 업로드를 통해 할 수 있는 행위를 모두 고르시오.
1. Remote Code Execution O
2. Cookie Hijacking O
3. Cross Site Scripting O
4. Cross Site Request Forgery O
4) 파일 다운로드 취약저믜 설명으로 올바른 것은?
1. 웹 서비스를 통해 이용자의 파일을 서버의 파일 시스템에 업로드하는 과정에서 발생하는 보안 취약점이며, 이용자가 업로드될 파일의 이름을 임의로 정할 수 있을 때 발생한다.
2. 웹 서비스를 통해 서버의 파일 시스템에 존재하는 파일을 내려 받는 과정에서 발생하는 보안 취약점이며, 이용자가 다운로드할 파일의 이름을 임의로 정할 수 있을 때 발생한다. O
'Dreamhack > Web Hacking' 카테고리의 다른 글
Web Hacking_Command Injection (1) 2024.09.28 Web Hacking_Realational DBMS (2) 2024.09.26 Web Hacking_csrf-2🚩 (0) 2024.09.24 Web Hacking_csrf-1🚩 (1) 2024.09.24 Web Hacking_ClientSide: CSRF (0) 2024.09.22 다음글이 없습니다.이전글이 없습니다.댓글