워게임/Root Me

[Root Me] File upload - Double extensions - 웹해킹 / WebShell

SecurityMan 2022. 5. 27. 11:00

 

20점 짜리 웹해킹 문제

 

파일 업로드 취약점과 관련이 있따.

 

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

 

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

 

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

 

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

 

아주 위험한 취약점이다.

 

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

 

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

 

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

 

 

문제 페이지에 접속하면 이런 화면이 나온다.

 

emotes, apps, devices, categories, actions 이런 주제의 이모티콘을 모아놓은 사이트이다.

 

 

중간에 보면 upload 페이지가 있어서 

 

사용자가 직접 사진을 업도르 할 수도 있다.

 

일단 파일 업로드 취약점을 이용해 공격을 해야하니

 

간단한 웹쉘을 만들어서 업로드를 해 본다.

 

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

 

php 언어를 이용해 웹쉘을 아주 간단하게 만들 수 있다.

 

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

 

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

 

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

 

 

업로드를 하려고 보니

 

.gif, .jpeg, .png 와 같이 사진 파일 확장자만 업로드 가능하다고 안내를 하고 있다.

 

 

당연하겠지만 아까 만든 webshell.php 를 업로드 시도하면

 

이렇게 파일 확장자가 잘못됐다면서 거절이 된다.

 

문제 제목을 다시한번 보자.

 

File upload - Double Extensions 라고 되어있다.

 

Double Extensions 라는건 말 그대로 확장자를 두번 쓰라는 것이다.

 

 

아까 만든 webshell.php 에 이름바꾸기를 한 다음

 

서버에 업로드 가능한 확장자 중 하나인 .png를 붙여준다.

 

 

이렇게 만들어진 webshell.php.png 파일을 선택하고 업로드 버튼을 눌러주면

 

 

파일이 정상적으로 업로드 되고

 

친절하게 업로드 된 경로까지 알려준다.

 

 

해당 경로로 찾아들어가 보면 에러가 나는걸 볼 수 있는데

 

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

 

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

 

 

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

 

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

 

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

 

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

 

 

이제 목표는 문제 설명에 나와있던것 처럼 .passwd 파일의 내용을 읽는것이다.

 

 

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

 

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

 

 

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

 

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

 

그 안에 플래그가 적혀있다.

 

이렇게 서버에 파일 업로드를 구현할 때는 이번 문제와 같이 단순히 확장자만 필터링 하는게 아니라

 

파일타입, 파일 시그니처 등을 복합적으로 확인해서 필터링을 해야 안전하다.

반응형