Almon Dev

파일 업로드 / 다운로드 취약점 (feat. LFI) 본문

모의해킹/모의해킹

파일 업로드 / 다운로드 취약점 (feat. LFI)

Almon 2025. 2. 15. 22:31

 파일 업로드 취약점 (File Upload)

공격자가 원하는 임의의 파일을 업로드할 수 있는 취약점입니다.

 

원인

파일을 업로드할 때 파일검사를 제대로 하지 않아서 발생합니다.

 

발생하는 위치

파일을 업로드하는 모든 곳에서 발생할 수 있습니다.

(burp를 이용해서 확인)

 

공격에 활용

Fishing, DeFace, XSS, Dos, WebShell 등 여러 가지 공격으로 활용이 가능합니다.

 

 Fishing

웹서버에 HTML 파일을 업로드하여 도메인의 신뢰성을 이용해 피싱이 가능합니다.

 

 DeFace

index.html과 같은 html 파일을 덮어 씌워 변조가 가능합니다.

ex) 뉴스 사이트에서 가짜뉴스로 변조하기, 정치적인 발언 삽입하기

 

 XSS

HTML을 변조할 때 JavaScript를 삽입하여 Stored XSS 공격에 활용이 가능합니다.

ex) 로그인 페이지에 키로거를 삽입하여 ID, PW 탈취

 

 Dos

서버에 대용량 파일을 업로드하여 서버의 리소스를 소진시킬 수 있습니다.

ex) GB단위의 파일을 계속 업로드하여 디스크 공간을 모두 차지하기

 

 WebShell

서버 측 실행코드를 업로드하여 실행합니다.

ex) php 파일을 업로드하여 실행 => 시스템 명령 실행 가능


 WebShell

File Upload 취약점은 주로 WebShell로 활용됩니다. WebShell웹서버 측의 실행코드를 의미합니다.

ex) php, jsp

 

웹쉘 공격 방법

1. 웹서버 측 실행 코드를 서버에 업로드합니다.

2. 해당 파일이 저장된 경로에 접근해 실행시킵니다.

ex) http://attack.com/upload/webshell.php

 

대응 방법

 

 확장자 검사

파일 업로드 시 확장자를 검사하여 서버 측 코드의 업로드를 방지합니다.

ex) php, jsp 등

 

 MIME 검사

MIME란 데이터를 주고받을 때 파일의 종류를 구분하기 위해 정해진 규칙입니다.

Content-Type 헤더를 확인하여 MIME와 확장자가 일치하는지 검사할 수 있습니다.

ex) text/html, image/jpeg, video/mp4 등

 

파일 시그니처 검사

파일은 생성될 때 각 포맷에 맞게 시작 부분에 고유한 패턴을 담고 있습니다.

이 부분을 검사하여 시그니처와 확장자와 일치하는지 확인할 수 있습니다.

 

 서버 설정

서버 측의 설정으로 특정 폴더(upload)에 있는 php파일을 실행하지 않도록 설정이 가능합니다.

ex) 아파치의 .htaccess 파일로 설정

 

 파일 이름 난독화

업로드된 파일의 이름을 변경하여 경로에 접근을 막는 방법이 있습니다.

ex) 파일 업로드 시 랜덤 한 숫자로 이름을 변환 => 원래 이름과 같이 DB에 저장

 

 파일 다운로드를 위한 스크립트 생성

파일 다운로드를 위한 스크립트를 생성하여 파일의 경로를 숨길 수 있습니다.

ex) download.php?filename=test

 

 DB에 파일 저장

DB파일자체를 저장할 수 있습니다. 사용자가 접근 자체가 불가능하기 때문에 매우 안전합니다.

ex) BLOB, CLOB

 

 NAS 사용

파일 저장용 서버를 이용하면 php가 저장돼도 실행이 되지 않기 때문에 안전합니다.

 

우회 방법

대응 방법 중 많은 것이 우회가 가능할 가능성이 있습니다.

 

 확장자 검사 우회

php를 제외하고도 php3, php4, phtml 등 많은 확장자가 아파치에서 실행 가능합니다.

화이트리스트 기반 필터링일 경우 (jpg, png) %00(NULL)을 이용해 우회될 여지가 있습니다.

ex) test.php%00.jpg => 검사에서는 jpg지만 실제로는 php로 저장됩니다.

 

 MIME 검사 우회

MIME는 클라이언트 측의 요청 헤더에 담기기 때문에 사용자가 쉽게 우회할 수 있습니다.

 

 파일 시그니처 검사 우회

파일 시그니처의 경우 정상적인 파일의 시그니처에 내용 부분만 악의적인 php코드를 삽입하는 것으로 우회가 가능합니다.

 

 서버 설정(.htaccess) 우회

서버 측 설정으로 php를 업로드해도 실행이 되지 않는 경우 ../를 파일 이름에 포함시켜 경로를 이동시키거나, 이동이 되지 않는다면 .htaccess 파일을 업로드시켜 해당 폴더의 설정을 덮어씌울 수 있는지 확인해봐야 합니다.

 

 파일 이름 난독화 우회

파일 이름이 난독화되고 본래 이름이 DB에 저장되어 있는 경우 sql injection이 가능한지 확인해야 합니다.

SQLI로 난독화된 파일의 이름과 경로를 확인하면 WebShell이 가능합니다. => 우회 여지가 존재합니다.

 

 파일 다운로드 스크립트 문제점

파일 다운로드 스크립트가 파라미터로 파일 이름 or 경로를 받고 있을 때 이것을 이용하여 의도치 않은 파일을 다운로드하는 파일 다운로드 취약점이 존재할 수 있습니다.

ex)

download.php?filename=test.png => filename=../../../../../../etc/passwd

download.php?fileId=1 => fileId=[idx] => 권한이 없는 파일 다운로드 (인증 인가 취약점)

 

 DB / NAS

원천적으로 우회 불가능

ex) 관리를 위해 NAS웹서버를 설치했다면 접근 가능


 LFI (Local File Inclusion)

서버에 존재하는 임의의 파일을 가져올 수 있는 취약점입니다.

 

원인

사용자의 입력(파라미터)을 파일의 경로로 사용하여 발생하는 취약점입니다.

 

발생하는 위치

파라미터에 따라 다른 페이지가 출력되는 곳에서 발생합니다.

ex)

index.html?lang=ko.php => 한국어 페이지

index.html?lang=jp.php => 일본어 페이지

 

공격에 활용

LFI는 확장자가 php가 아니어도 코드를 실행할 수 있기 때문에 매우 위험합니다.

 

 설정 파일 가져오기

서버(Local)에 존재하는 파일을 가져올 수 있습니다.

ex) DB 설정 파일, php 설정 파일, /etc/passwd

 

 서버 측 코드 실행 (File Upload 연계)

include와 같은 포함 기능은 파일의 텍스트를 가져와 그 자리에 붙여 넣습니다.

그렇기 때문에 파일 내부에 <?php ?>가 있다면 그 파일의 확장자가 .php가 아니더라도 코드가 실행됩니다.

ex) test.php에서 include('text.png') => text.png 안에 있던 php 코드가 test.php에 붙여 넣어서 실행됨

시나리오 ex) 

<?php system($_GET['cmd']) ?>를 webshell.jpg로 업로드 => jpg이기 때문에 확장자 우회

http://test.com/LFI.php?lang=/var/www/html/upload/webshell.jpg&cmd=pwd => pwd 명령 실행


 파일 다운로드 취약점

서버에서 공격자가 원하는 임의의 파일을 다운로드 받을 수 있는 취약점입니다.

 

원인

사용자의 파라미터를 파일 다운로드 경로로 사용하여 발생하는 취약점입니다.ex) download.php?filename=test.png

 

공격에 활용

LFI와 비슷하지만 php 파일이 코드로 실행되지 않고 다운로드된다는 차이점이 있습니다.

 

 소스 코드 다운로드

php가 실행되지 않고 다운로드되기 때문에 소스코드를 그대로 다운로드할 수 있습니다.

ex) login.php를 다운로드하여서 DB의 ID/PW 확인, 소스 코드를 확인하여 취약점 분석

download.php?filename=/var/www/html/login.php


 모의해킹 시 주의사항

모의해킹을 할 때 고객사에 피해를 주지 않기 위해서 주의해야 할 사항입니다.

 

파일 업로드 취약점

WebShell은 절대 업로드하지 않습니다.POC용으로 echo 'hello' 정도의 코드만 실행한 뒤 담당자에 문의합니다.

 

 담당자가 WebShell을 원할 경우 주의사항

만일 담당자가 WebShell을 이용한 테스트를 원할 경우에 지켜야 할 주의사항입니다.

 

1. 웹쉘 파일의 이름을 알아내기 힘들게 합니다.ex) webshell.php X => xptmxmdyddnpqtnpf.php O

 

2. 웹쉘에 비밀번호를 설정합니다.=> 혹시라도 웹쉘에 누군가 접근하더라도 비밀번호를 알아야만 사용할 수 있도록 합니다.

 

3. 테스트가 끝나면 당일 바로 삭제합니다.

=> 웹쉘을 업로드한 당일 바로 삭제합니다.

 

4. 담당자에게 삭제가 됐는지 확인 요청을 합니다.

=> 다음날 본인이 확인까지 해야합니다.

 

파일 다운로드 취약점

POC용 다운로드만 받도록 합니다.

 

 리눅스 POC

/etc/passwd

 

 윈도우 POC

/boot.ini

/winnt/win.ini


 

'모의해킹 > 모의해킹' 카테고리의 다른 글

ctf 풀이 (Get Flag File)  (0) 2025.02.17
ctf 풀이 (WebShell 3)  (0) 2025.02.17
CSRF 정리 (feat. SOP/CORS)  (0) 2025.01.16
ctf 풀이 (GET Admin 3)  (0) 2025.01.13
ctf 풀이 (GET Admin 2)  (0) 2025.01.13