상세 컨텐츠

본문 제목

DVWA : File Upload - Medium level

Vulnerability Assessment/Web Application

by DarkSoul.Story 2025. 1. 5. 14:49

본문

반응형
이 문서에 포함된 어떠한 내용도 불법적이거나 비윤리적인 목적으로 보안 도구나 방법론을 사용하도록 가르치거나 장려하지 않습니다. 항상 책임감 있는 태도로 행동하세요. 여기에 설명된 도구나 기법을 사용하기 전에 개인 테스트 환경 또는 허가를 받았는지 확인하세요.

 

[ 환경 ]

DVWA v1.9
Burp Suite Community Edition v2024.11.2

1.  Source code analysis

[그림 1] Medium level Source code

 

이 코드는 사용자가 업로드한 파일이 JPEG 또는 PNG 이미지인지 확인한 후, 파일 크기가 100KB 미만이면 서버의 특정 디렉터리로 저장하는 간단한 파일 업로드 기능을 제공한다.

업로드된 파일 정보 확인

$uploaded_name = $_FILES[ 'uploaded' ][ 'name' ];
$uploaded_type = $_FILES[ 'uploaded' ][ 'type' ];
$uploaded_size = $_FILES[ 'uploaded' ][ 'size' ];
  • $_FILES'uploaded' ] 배열을 통해 업로드된 파일의 속성을 가져온다.
  • name: 사용자가 업로드한 파일 이름
  • type: 업로드된 파일의 MIME 타입(예: image/jpeg, image/png)
  • size: 업로드된 파일의 크기(바이트 단위)

파일 유형 및 크기 검증

if( ( $uploaded_type == "image/jpeg" || $uploaded_type == "image/png" ) &&
    ( $uploaded_size < 100000 ) ) {
  • MIME 타입이 JPEG(image/jpeg) 또는 PNG(image/png)인 파일만 허용
  • 파일 크기가 100KB(100,000 바이트) 미만이어야 함
  • MIME 타입이나 파일 크기 조건을 만족하지 못하면 업로드를 차단

보안상의 문제점

MIME 타입 신뢰성 부족

  • 업로드된 파일의 type 속성은 클라이언트 측에서 조작 가능
  • 공격자가 PHP 스크립트를 업로드하면서 type을 image/jpeg로 변경할 수 있음

파일 이름 검증 부족

  • 사용자가 업로드한 파일 이름을 그대로 사용하여 저장
  • 경로 조작(../) 공격이 가능하며, 기존 파일을 덮어쓸 위험 존재

업로드 디렉터리 보호 부족

  • 업로드된 파일이 실행 가능한 상태라면 악성 스크립트가 실행될 위험
  • 디렉터리에 대한 접근 권한이 제한되지 않음

확장자 검증 부족

  • 파일 이름의 확장자를 검증하지 않음.
  • PHP 파일이 image.jpeg로 이름만 변경되어 업로드될 가능성

파일 크기 제한의 하드코딩

  • 파일 크기 제한이 하드코딩되어 있어 유지보수가 어려움

 

2. Practical exercises

Low level에서 사용한 WebShell을 업로드하면 [그림 2]와 같이 오류가 발생하며, 애플리케이션이 파일의 유효성을 검사한다.

[그림 2] 파일 유효성 체크

 

WebShell 파일을 업로드하기 전에 Burp Suite로 Intercept 하여 전송되는 Request를 살펴보면,  [그림 3]과 같이 Content-Type이 application/octet-stream으로 되어 있는 것을 확인할 수 있다.

[그림 3] 파일 업로드 전 Request

 

HTTP Content-Type은 클라이언트(브라우저 또는 기타 HTTP 클라이언트)와 서버 간의 통신에서 데이터의 MIME 타입을 지정하는 HTTP 헤더로, 서버는 이 헤더를 사용하여 클라이언트에게 전달되는 데이터가 어떤 형식인지 알린다. 클라이언트는 이 정보를 바탕으로 데이터를 적절히 처리하고 렌더링할 수 있다. 

 

주요 구성 요소

  • MIME 타입 : 데이터의 주된 유형을 나타낸다. 예: text, image, application, audio, video 등
  • 서브타입 : MIME 타입의 세부 유형을 지정한다. 예: html, jpeg, png, json 등
  • 옵션 파라미터 : 데이터의 추가 속성(예: 문자 인코딩)을 지정한다. charset=UTF-8처럼 문자 데이터를 위한 인코딩 정보를 포함할 수 있다.
예시 설명
Content-Type: text/html; charset=UTF-8 브라우저가 HTML 문서를 렌더링하도록 지시
Content-Type: application/json 클라이언트가 JSON 형식의 데이터를 파싱하도록 알림
Content-Type: image/jpeg 브라우저나 이미지 뷰어가 JPEG 이미지를 처리하도록 지시

 

주요 MIME 타입 목록

MIME 타입 설명
text/plain 일반 텍스트 파일
text/html HTML 문서
application/json JSON 데이터
application/xml XML 데이터
application/pdf PDF 문서
image/jpeg JPEG 이미지
image/png PNG 이미지
video/mp4 MP4 비디오 파일
audio/mpeg MP3 오디오 파일

 

Content-Type가 중요한 이유

  • 데이터 처리 방식 정의 : 클라이언트는 Content-Type에 따라 데이터를 렌더링, 저장, 또는 처리한다.
  • 인터페이스 호환성: API에서 JSON이나 XML 데이터 등을 주고받을 때 형식을 명확히 지정하여 오류를 방지한다.
  • 보안: Content-Type을 올바르게 설정하지 않으면 클라이언트가 데이터를 잘못 처리할 수 있으며, 이는 보안 취약점으로 이어질 수 있다.

앞서 소스코드를에 살펴보았듯이 MIME 타입과 파일 크기를 검증하지만, 클라이언트 측에서 조작 가능한 정보를 신뢰하고 있어 보안상 취약하다. 검증을 우회하기 위해 Content-Type을 기존 application/octet-stream을 image/jpeg 또는 image/png 등 이미지 형태로 변경해서 전송한다.

[그림 4] Content-Type 변경 후 전송

 

Response 내용을 살펴보면 [그림 5]와 같이 파일검증을 우회하여, WebShell이 Low level에서 확인한 동일한 디렉터리에 업로드되는 것을 확인할 수 있다. 

[그림 5] 파일 검증 우회 후 업로드 성공

 

확인한 업로드 경로를 이용하여 URL을 입력하여 직접 접근하면 업로드한 WebShell을 실행할 수 있다.

[그림 6] 업로드한 WebShell 실행

 

반응형

관련글 더보기