본문 바로가기
Web hacking/Nomaltic) 웹 해킹 수업 노트 👩‍💻

[복습] 파일 업로드 취약점 실습(1)

by m_.9m 2021. 12. 14.

파일 업로드 취약점 실습

 

1. 파일 업로드 취약점 아무런 검증이 없는 경우

https://portswigger.net/web-security/file-upload/lab-file-upload-remote-code-execution-via-web-shell-upload

 

Lab: Remote code execution via web shell upload | Web Security Academy

This lab contains a vulnerable image upload function. It doesn't perform any validation on the files users upload before storing them on the server's ...

portswigger.net

 

 

(1) php 파일을 올려본다. 정상적으로 작동하는 것을 볼 수 있다.

 

 

정상 작동 화면

 

(2) Back to My account에서 이전 페이지로 돌아간 다음 사진 아이콘을 우클릭해서 이미지 주소 복사를 눌러 URL을 얻은 후 새 창에 해당 URL 주소를 연다.

 

우클릭해 이미지 주소 복사를 클릭한다.

 

 

실행 시 코드가 적상 작동해 플래그 값이 나온 것을 볼 수있다.

 

 

플래그 값이 나온것을 확인한다.

 

 

** 웹셀 대신 해당 코드를 업로드하는 이유는 웹셀이 안전상의 이유로 가상머신이 아닌 일반 컴퓨터 등에서 실행이 안되고, 버프스윗 자체에는 웹셀이 안올라가기 때문이다.

 

웹셀을 열거나 업로드 시도를 할 시 볼수있는 화면

 

 

대안으로 사용하는 코드는 이렇다.

<?php
echo file_get_content('/home/carlos/secret');
?>

 

이외에도 print문이나 실행을 증명할 수있는 스크립트 코드를 사용하기도 한다.

 

 

 

2. Content-Type 변경 우회

https://portswigger.net/web-security/file-upload/lab-file-upload-remote-code-execution-via-web-shell-upload

 

Lab: Remote code execution via web shell upload | Web Security Academy

This lab contains a vulnerable image upload function. It doesn't perform any validation on the files users upload before storing them on the server's ...

portswigger.net

 

 

(1) Content-Type을 변경해 우회해야하는 경우는 중간에 패킷을 가로채서 수행해야하기때문에 버프스윗의 intercept is on 을 킨다. 사실 그냥 HTTP History에서 바로 Repeater로 보내도 된다.

 

Intercept를 켜준다.

 

(2) 파일 업로드에서 php 파일을 선택해 올린 후 업로드를 눌러준다.

 

php 파일 선택 후 업로드

 

(3) 패킷이 오면 바로 우클릭해서 Repeater로 넘겨준다. 커서로 잡혀있는 해당 부분을 수정할것이다.

 

repeater로 패킷을 넘겨준 모습

 

(4) Content-Type을 application/octet-stream에서 image/jpeg로 바꿔준 후 Send를 눌러 실행시켜준다.

 

application/octet-stream를 image/jpeg로 수정

 

(5) 여기서 Copy URL이 안돼서 이것저것 해봤는데 Show response in browser를 눌러주면 우리가 Repeater내에서 요청채서 받은 Response를 브라우저에서 바로 열수있다.

 

수정후 200 ok로 실행에 성공하면 Show response in browser를 눌러준다.

 

(6) 그러면 이렇게 업로드가 성공한 페이지가 새 창에 뜨게된다.

 

업로드 성공

 

(7) Back to My account에서 이전 페이지로 돌아간 다음 사진 아이콘을 우클릭해서 이미지 주소 복사를 눌러 URL을 얻은 후 새 창에 해당 URL 주소를 연다.

 

우클릭해 이미지 주소 복사를 클릭한다.

 

 

(8) 정상 실행 페이지를 확인한다.

 

 

코드가 정상적으로 실행된 모습

 

 

3. Directory Traversal 실습

https://portswigger.net/web-security/file-upload/lab-file-upload-web-shell-upload-via-path-traversal

 

Lab: Web shell upload via path traversal | Web Security Academy

This lab contains a vulnerable image upload function. The server is configured to prevent execution of user-supplied files, but this restriction can be ...

portswigger.net

 

 

(1) php 파일을 업로드 했을 때 정상적으로 업로드 되고, 파일을 우클릭해 URL을 타고 들어갔을 때 실행이 되지 않고 PHP문이 그대로 노출되는 것을 볼 수있다. 여기서 Directory Traversal을 사용하는 이유는 상위폴더로 이동해 실행권한이 없는 해당 폴더가 아닌 상위 폴더로 가서 실행을 하기 위함이다.

 

Directory Traversal가 할수있는 것들

-> Override, Deface
-> ../../../../../etc/passwd
-> 권한 획득: 웹쉘시 root 웹쉘일수 있음.

 

php문이 그대로 실행되는 것을 볼수있다.

 

(2 해당 패킷을 Repeater로 보내서 File name부분을 찾아 수정할것이다. 커서에 잡힌 부분을 찾는다.

 

repeater로 보내진 모습

 

(3) 파일 이름 앞에 ../를 붙여본다.

 

우측 Response를 보면 200 ok 응답을 받았지만 업로드 경로는 여전히 avatars/test.php임을 확인할 수있다.

 

 

(4) ../를 ..%2f로 수정해서 다시 요청해본다. /는 인코딩시 %2F이다.

해당 %2F가 안될시 %252F도 요청해본다. (%252F -> %2F)

요청을 보냈을때 파일 경로가 avatars/../test.php로 정상 반영되었음을 확인할 수있다.

 

파일 경로가 정상 반영된 모습

 

(5) 그럼 여전히 Copy URL로는 페이지를 찾을 수없다는 요청이 뜨니 Show response in browser에 URL 주소를 카피한 후 새 창에 띄운다. 경로가 반영되어 정상 업로드된것을 확인할 수있다.

 

상위 폴더로 위치 정상 반영 확인

 

 

(6) 내 계정 페이지로 돌아가서 이미지파일의 주소를 복사해 새창에 띄운다.

 

이미지 주소 복사

 

(7) 정상적으로 플래그가 뜬 것을 볼수있다. 주소를 카피해 붙여넣기했을 때 실행되는 경우가 두가지이다.

 

https://acc41f0b1e9097b0c0fe4ea5002700a0.web-security-academy.net/files/test.php

-> avatars/..%2F가 생략되어 실제 경로로 접속하는 경우

https://acc41f0b1e9097b0c0fe4ea5002700a0.web-security-academy.net/files/avatars/..%2Ftest.php

-> avatars/..%2F가 생략되지 않고 avatars의 상위폴더의 경로로 file내에 test.php가 실행되는 경우

 

 

https://acc41f0b1e9097b0c0fe4ea5002700a0.web-security-academy.net/files/test.php
https://acc41f0b1e9097b0c0fe4ea5002700a0.web-security-academy.net/files/ avatars/..%2Ftest.php

 

 

4. 블랙리스트 기반 파일업로드 우회 실습

https://portswigger.net/web-security/file-upload/lab-file-upload-web-shell-upload-via-extension-blacklist-bypass

 

Lab: Web shell upload via extension blacklist bypass | Web Security Academy

This lab contains a vulnerable image upload function. Certain file extensions are blacklisted, but this defense can be bypassed due to a fundamental flaw in ...

portswigger.net

 

 

실패의 흔적들(업로드는 되는데 실행이 안된다)

더보기
더보기
더보기

 

pphphp로 확장자를 쓰니까 업로드 성공

 

그러나 실행이 안됨

 

%2F로 상위 폴더로 올려봄

 

파일 이름이 유효하지 않다고 한다. (오ㅐ..?)

 

확장자 덮어봄.

 

실행시 이런 화면. 버프스윗 확인시 코드는 정상 작동한듯하다.

 

 

 (1) 일단 php 파일을 올려보고 어떤식으로 오류메세지가 뜨는지 확인한다. PHP 파일은 업로드가 되지 않는다고 뜨는 것을 확인할 수있다.

 

php 파일이 거부되는 모습

 

 

(2) 그럼 .htaccess를 사용해볼텐데, 확장자를 아무단어로 만들어서 파일명만 바꿔 저장해준다. 코드는 그대로  file_get_content('/home/carlos/secret')를 사용하고 파일명만 파일명(test).아무말확장자(myungju) 생성한 후 보낸다. 그고 버프스윗을 통해 패킷을 repeater로 보낸다.

 

 

파일을 업로드한 화면.=

 

(3) 그럼 이제 파일이름과 해당 커서로 잡힌 부분을 수정해줄텐데 파일이름은 .htaccess로 <?php ?> 문은

AddType application/x-httpd-php .myungju 로 수정해준다. AddType application/x-httpd-php .내가 만든 아무말확장자(myungju) 는 myungju 확장자도 php 확장자처럼 대해라. 라는 명령어이다.

 

커서로 잡힌 이 부분을 수정한다.
성공화면을 확인한다.

 

(4) 위와 마찬가지로 Show response in browser 해서 들어가보면 확장자가 숨겨진 채 업로드 된 파일을 볼 수있다. 이제 파일을 실행시키킬텐데 My account 페이지에서 Copy URL을 한 후 붙여넣기 하면 아래와 같은 URL을 볼 수있다.

 

확장자를 숨기고 정상업로드 된 화면

 

주소 복사시 뜨는 주소

https://ac631f421fc2fdddc0319228000a00ec.web-security-academy.net/files/avatars/.htaccess

---> 변경해주어야 할 주소

https://ac631f421fc2fdddc0319228000a00ec.web-security-academy.net/files/avatars/test.myungju

 

 

(5) 파일의 이름을 .htaccess가 아닌 내가 처음에 설정한 파일이름으로 바꾸어주소에 접속한다.

패킷을 보낼때, 프로그램상에서는 확장자가 숨겨졌지만 실행은 원래 파일이름으로 해야 정상적으로 파일을 불러와 실행시킬 수있다. 해당 파일이 정상적으로 실행된 패킷을 볼수있다.

 

정상적인 실행 확인