본문 바로가기

해킹-보안

파일 업로드 취약점 Challenge

반응형



파일 업로드 취약점을 이용하여 웹서버에 php 셸파일을 업로드한다.

실습 구성은 APMSetup, 도구는 burpsuite를 사용한다.



Challenge 1




jpg 파일 업로드를 시도한다.
php여야 웹셸이 실행이 가능하기 때문에
Content-Disposition filename에서 title.jpg를 title.php,
Content-Type을 jpg로 속이기 위해 image/jpeg,
이미지 바이너리의 바디부분을 웹셸 코드로 바꿔준다.
업로드 경로를 확인하니 php 파일 이름이 의미없는 숫자들로 채워져있다.
이는 파일 업로드 취약점을 보완하기 위한 방법이지만
업로드된 파일명이 그대로 노출되어 크게 의미가 없다.
해당 경로를 그대로 복사하여 주소창에 붙여넣으면 된다.



Challenge 2



이번 문제는 전 문제와 다르게 바이너리의 바디부분까지 유효성을 검사하기 때문에
jpg파일 업로드 시도 후, 이미지 바이너리 끝에서 웹셸 코드를 추가한다.



Challenge 3


파일이 업로드 되면 upload/image/title.php로 저장된다.
웹셸은 업로드하였지만 image 폴더에 실행권한이 없어서
title.php가 실행이 안된다. 저장경로를 지정해주는
image를 ../로 바꿔서 upload 폴더에 저장하면 실행이 가능하다.



Challenge 4



확장자(php)를 필터링 중이다. 하지만 첫번째 . 부터 3번째 문자열 까지만
필터링중이므로, `success.php `로 우회 가능하다.
그러나 웹셸이 실행되지 않는다.
그래서 이전 문제처럼 상위 폴더에 업로드를 시도하기 위해 ../ 을 입력했지만 필터링됐다.
php서버는 .htaccess 파일을 통해 실행권한을 제어하는데,
해당 폴더에 실행권한이 없는 듯 하다.
하지만 폴더 생성은 되므로 임의 폴더에 ./htaccess 파일을 생성하고
그 폴더에 웹쉘을 업로드하면 실행할 수 있다.

upload 폴더에 임의로 지정한 testx 라는 폴더를 만들고 .htaccess를 만든다.
그리고 FilesMatch를 통해 php 실행 권한을 부여한다.

SetHandler application/x-httpd-php




Challenge 5



업로드는 되나, 실행경로를 찾을 수 없다. 
그런데 이 게시판은 다운로드를 받을 수 있는 페이지(download.php)가 별도로 존재한다.
이 페이지를 다운받아서 분석하면 단서가 나올 수 있다.

정상적인 다운로드 시도 후 download.php 파일의 경로를 찾기 위해
인자에 ../를 여러 번 대입하여 파일을 다운받는다.
파일 내용 중에서 inc/common.php에 단서가 있을것 같다.


file=../../inc/common.php을 다운로드 받아서 열어본다.
filepath 가 attach/contact 인것을 알 수 있다.
따라서 웹셸 경로는 /attach/concat/web_shell.php이다.



Challenge 6


# 버프스위트에서 서버 응답값 까지 intercept 하도록 체크한다.


업로드/다운로드 페이지를 육안으로는 찾을 수 없는 상태였다.

메인페이지의 응답을 확인해보니 js/common.js 파일에 파일 업로드 페이지가 들어있었다.

이제 아까와 똑같은 방식으로 셸 파일을 업로드 하면 된다.



Challenge 7


이전 문제와 비슷하다.
이번에는 글쓰기 페이지의 응답 패킷에서 업로드가 주석처리 된 것을 확인했다.
프론트엔드에서 사용하지 않는 기능을 주석처리한들 어차피 수정이 가능하다.

응답패킷에 있는 업로드 주석 <!-- -->을 삭제한다.
이후 웹셸을 업로드 했는데 어떤 경로에 저장됐는지 출력되지 않았다.


게시글을 클릭하여 파일 다운로드 시도 후 download= 경로에 특수문자(.)을 넣으면
오류 메시지로 파일 다운로드 경로를 알려준다.
빨간 상자 위에 readfile을 보면 upload 폴더가 보인다.
파일을 읽어들이는 곳이 저 폴더라는 것을 알 수 있으므로
셸 경로는 upload/webshell.php이다.



Challenge 8


회원가입(Signup)의 사진 업로드 기능을 이용한다.


확장자 필터링은 하지 않으며 사진 바이너리의
끝부분 까지만 검사한다. 따라서 사진 바이너리 다음줄 부터 웹셀을 입력하면 업로드 가능하다.

파일을 다운로드 할 수 있는 별도 페이지는 없다.
하지만 client에 올라와있는 사진의 속성을 보면 이미지가 저장된 경로를 추측할 수 있다.

attach/data/profile_img/web_shell.php




Challenge 9



uploadForm.php를 찾았는데 직접 접속하면 접속이 안된다.
응답에 referer 가 null이면 안된다는 힌트가 있다.
referer는 해당 페이지가 어느 사이트에서 왔다는 것을 확인하는 요청패킷의 헤더이다.
업로드 페이지는 직접접속이 아닌, 특정 페이지에서 접속해야지만 확인 가능하다.
따라서 요청패킷 헤더에 Referer: http://192.168.0.100을 추가하면 접속 가능하다.



Challenge 10


억지스럽긴 하지만 문제풀이 흐름으로 봤을 때
download.php 파일이 있는것으로 봐서 upload.php 파일이 있을것으로 추측 가능하다.
존재여부 확인을 위해 common/upload.php 를 입력해본다.
다운로드 페이지를 통해 upload.php 파일을 다운받아본다.

?filename=../../common/upload.php


upload.php에서 include하고 있는 common.php 파일을 다운받아 분석한다
?filename=../../common/common.php


파일 확장자별 type 변수의 조건을 보여준다.
이미지는 1이고 php는 else에 정의되어 있으므로 type=4 이상의 숫자를 지정하면
php파일을 업로드 할 수 있다.
코드 의미는  image upload/image에, others는 upload/others에 저장한다는 뜻이다.
그런데 업로드 페이지는 있지만 그 페이지를 호출할 수 있는 부분이 없다. 
따라서 그 부분을 다음과 같이 만들어 준다.
<html>
<form action="http://ip/file_upload13/common/upload.php?type=" 
method="POST" enctype="multipart/form-data">
<input type="file" name="userfile" id="exampleInputFile">
<input type="submit">
</form>
</html>
만들어진 페이지를 통해 이미지 파일을 업로드 하고 type=4, 확장자와 바디를 변경,
확장자 필터링을 하고 있으므로 phP 와 같이 바꿔서 시도한다.
이후 upload/others/webshell.phP를 입력해서 웹쉘을 실행한다.



Challenge 11


/file_upload/download.php 가 존재하며 업로드 페이지는 찾을 수 없는 상태다.
download.php 파일에 관련 단서가 있는지 확인해본다.
download.php?filename=.을 넣고 요청하니
오류값으로 download.php 파일의 위치를 반환하였다.


해당 파일을 다운해보니 common.php가 존재한다.


common.php를 확인해보니 upload_path upload 폴더라고 지정하였다.

이를 통해 upload/filename가 파일 업로드 경로인 것을 알 수 있다.
이외 단서가 될 만한 추가적인 php를 찾는다.
파일 업로드 기능은 흔히 게시판에 많이 추가하므로
글이 작성된 내용을 처리해주는 action.php를 의심해볼 수 있다.
?filename=../action.php
확인해보니 action.php에 파일 업로드 기능이 구현되어 있다.
따라서 게시글 쓰기 페이지(write.php)에서
파일 업로드 하는 기능을 추가로 구현해주면 업로드가 가능할 것 같다.


<form action="action.php" method="POST" enctype="multipart/form-data">
<input type="file" class="form-control" name="userfile">
파일이 업로드되면 action.php 파일에서 확인한 업로드 경로(upload)를 확인해
웹쉘을 실행한다.
file_upload14/upload/webshell.php



반응형

'해킹-보안' 카테고리의 다른 글

CVE 찾는 과정  (0) 2020.07.28
버프스위트(Burpsuite) 기능 활용  (0) 2020.07.26
sqlmap 사용법  (0) 2020.07.20
hydra 패스워드 크랙툴 사용법  (3) 2020.07.13
파일 업로드/다운로드 취약점 공격  (0) 2020.07.05