본문 바로가기
컴퓨터보안/웹서버

파일 취약성 관련 백그라운드

by 데이빗제이2 2024. 5. 28.
Q1. php 확장자를 가진 파일이 정상적으로 php 스크립트 엔진에 실행되고자 한다. (A)와 (B)에 들어갈 말로 올바른 것은?
<FilesMatch ".+\.ph(p[3457]?|t|tml)$">
    (A) (B)
</FilesMatch>
 
RunPHP, *.php
ExecuteWith, PHPHandler
SetHandler, application/x-httpd-php
ExecuteWith, application/x-httpd-php
GetHandler, application/html

 

1. Apache 웹 서버 기본 개념

Apache HTTP Server는 전 세계에서 널리 사용되는 오픈 소스 웹 서버입니다. Apache는 HTTP 요청을 처리하고, 웹 페이지 및 리소스를 클라이언트(주로 웹 브라우저)에게 제공하는 역할을 합니다.

2. 웹 서버의 동작 방식

웹 서버는 클라이언트로부터 HTTP 요청을 받아들여, 해당 요청에 대한 응답을 반환합니다. 이 과정에서 웹 서버는 정적 파일(HTML, CSS, 이미지 등)을 제공하거나, PHP와 같은 서버 사이드 스크립트 언어를 사용하여 동적 콘텐츠를 생성할 수 있습니다.

3. PHP 기본 개념

**PHP (Hypertext Preprocessor)**는 서버 사이드 스크립트 언어로, 주로 동적 웹 페이지를 생성하는 데 사용됩니다. PHP 파일은 .php 확장자를 가지며, PHP 코드가 포함된 파일은 서버에서 실행되어 HTML 등의 콘텐츠를 생성합니다.

4. Apache와 PHP 통합

Apache 웹 서버가 PHP 스크립트를 실행하기 위해서는 PHP를 핸들러로 설정해야 합니다. 이를 위해 Apache는 SetHandler 지시어를 사용하여 특정 파일 확장자를 PHP 엔진으로 처리할 수 있도록 설정합니다.

5. Apache 설정 파일

Apache의 설정 파일은 주로 httpd.conf 또는 apache2.conf로 불리며, 이 파일을 통해 서버의 동작을 제어할 수 있습니다. 설정 파일에는 서버의 전반적인 설정, 가상 호스트 설정, 디렉토리 설정, 모듈 로드 설정 등이 포함됩니다.

6. <FilesMatch> 디렉티브

<FilesMatch> 디렉티브는 정규 표현식을 사용하여 특정 파일 패턴에 설정을 적용할 수 있게 합니다. 예를 들어, .php 확장자를 가진 모든 파일에 대해 특정 처리를 하려면 <FilesMatch> 디렉티브를 사용하여 해당 파일들을 매칭할 수 있습니다.

7. SetHandler 지시어

SetHandler 지시어는 Apache가 특정 파일 타입을 처리하는 방식을 지정합니다. PHP 파일을 PHP 엔진으로 처리하도록 설정할 때 사용됩니다.

예시 설정:

apache

<FilesMatch ".+\.ph(p[3457]?|t|tml)$"> SetHandler application/x-httpd-php </FilesMatch>
  • .ph(p[3457]?|t|tml)$: 정규 표현식을 사용하여 .php, .php3, .php4, .php5, .php7, .pht, .phtml 등의 확장자를 가진 파일을 매칭합니다.
  • SetHandler application/x-httpd-php: 매칭된 파일에 대해 PHP 핸들러(application/x-httpd-php)를 사용하여 PHP 엔진으로 처리합니다.

기타 관련 지식

8. 정규 표현식

정규 표현식(Regular Expression)은 문자열 패턴을 매칭하기 위한 강력한 도구입니다. Apache 설정 파일에서 파일 이름 패턴을 지정할 때 자주 사용됩니다. 예를 들어, .+\.php$는 .php로 끝나는 모든 파일을 매칭합니다.

9. 핸들러(Handler)

핸들러는 Apache가 요청된 리소스를 처리하는 방식을 정의합니다. PHP 파일의 경우, application/x-httpd-php 핸들러를 사용하여 PHP 엔진이 해당 파일을 처리하도록 합니다.

10. 모듈

Apache는 모듈을 사용하여 기능을 확장합니다. PHP를 Apache에서 실행하기 위해서는 PHP 모듈(mod_php)을 로드해야 합니다. 이는 PHP 코드를 처리하고 실행하는 데 필요한 기능을 제공합니다.

 

Q2. 악성 파일 업로드를 통해 할 수 있는 행위를 모두 고르시오
Cross Site Scripting
Cookie Hijacking
Remote Code Execution
Cross Site Request Forgery

 

다음은 악성 파일 업로드를 통해 수행할 수 있는 행위들입니다:

  1. Cross Site Scripting (XSS)
  2. Remote Code Execution (RCE)
  3. Cross Site Request Forgery (CSRF)
  4. Cookie Hijacking

각 항목 설명:

  1. Cross Site Scripting (XSS)
    • 악성 파일 업로드를 통해 XSS 공격이 가능합니다. 공격자가 악의적인 스크립트를 포함한 파일(예: HTML 파일)을 업로드하고, 다른 사용자가 이를 열람할 때 스크립트가 실행되도록 할 수 있습니다. 이를 통해 세션 하이재킹, 크로스 사이트 스크립팅 등의 공격을 수행할 수 있습니다.
  2. Cookie Hijacking
    • 악성 파일 업로드 그 자체로는 직접적으로 Cookie Hijacking을 수행하지는 않지만, XSS를 통해 쿠키 탈취를 할 수 있습니다. XSS를 통해 사용자의 쿠키 정보를 훔쳐내어 세션 하이재킹을 수행할 수 있습니다.
  3. Remote Code Execution (RCE)
    • 악성 파일 업로드를 통해 RCE 공격이 가능합니다. 예를 들어, PHP 파일을 업로드하여 서버에서 임의의 코드를 실행하도록 할 수 있습니다. 이를 통해 서버에 대한 완전한 제어권을 획득할 수 있습니다.
  4. Cross Site Request Forgery (CSRF)
    • 악성 파일 업로드 그 자체로는 CSRF 공격을 직접 수행하지는 않지만, 업로드된 파일이 사용자에게 표시되거나 실행되는 경우, XSS 등을 통해 CSRF 공격을 유도할 수 있습니다.

정답:

악성 파일 업로드를 통해 할 수 있는 행위는 다음과 같습니다:

  • Cross Site Scripting (XSS)
  • Remote Code Execution (RCE)
  • Cross Site Request Forgery (CSRF)
  • Cookie Hijacking

Cookie Hijacking은 악성 파일 업로드로 직접 수행되는 것은 아니지만, XSS 공격을 통해 간접적으로 수행될 수 있습니다.

 

Q4. 파일 다운로드 취약점이 발생하는 코드이다, "filename" 인자에 어떠한 값을 넣어야 현재 실행중인 프로세스의 메모리 정보를 볼 수 있는가?
@app.route("/download")
def download():
    filename = request.args.get("filename")
    content = open("/data/uploads/" + filename, "rb").read()
    return content
  1. @app.route("/download"):
    • 이 줄은 "/download" 경로로 들어오는 HTTP 요청을 download 함수로 연결합니다.
    • 예를 들어, 클라이언트가 http://localhost:5000/download?filename=test.txt로 요청을 보내면, Flask는 /download 경로에 매핑된 download 함수를 실행합니다.
  2. def download()::
    • 이 함수는 /download 경로에 대한 요청을 처리합니다.
    • 함수 내부에서 request.args.get("filename")를 사용하여 쿼리 문자열에서 filename 인자를 가져옵니다. 예를 들어, URL이 http://localhost:5000/download?filename=test.txt인 경우, filename은 test.txt가 됩니다.
  3. content = open("/data/uploads/" + filename, "rb").read():
    • filename 변수에 저장된 파일명을 사용하여 /data/uploads/ 디렉토리에서 해당 파일을 엽니다.
    • 파일을 읽어서 content 변수에 저장합니다.
  4. return content:
    • 파일의 내용을 클라이언트에게 응답으로 반환합니다.
    • Flask는 이 반환값을 HTTP 응답으로 전송합니다.
정답으로 생각되는 답안을 모두 선택해 주세요.
../../proc/self/maps
../proc/self/maps
../root/memory_information
../../../proc/self/maps
../../../etc/memory
../../etc/memory
../../etc/passwd

 

정답:

  1. ../../proc/self/maps:
    • /data/uploads/에서 두 번 상위 디렉토리로 이동하여 루트 디렉토리에 도달한 후, /proc/self/maps 파일에 접근합니다.
    /data/uploads/../../proc/self/maps -> /proc/self/maps
  2. ../../../proc/self/maps:
    • /data/uploads/에서 세 번 상위 디렉토리로 이동하여 루트 디렉토리에 도달한 후, /proc/self/maps 파일에 접근합니다. 세 번 올라가는 경우도 루트 디렉토리에 도달할 수 있지만, 두 번 올라가도 충분합니다.
    /data/uploads/../../../proc/self/maps -> /proc/self/maps

 

 

 

'컴퓨터보안 > 웹서버' 카테고리의 다른 글

Server-side Request Forgery (SSRF)  (0) 2024.05.29
File Vulnerability  (0) 2024.05.28
파일 취약성  (0) 2024.05.24
서버 관련 정리(간단히)  (0) 2024.05.23
서버 관련 정리(자세히)  (0) 2024.05.23