티스토리 뷰

SERVER

파일 업로드 취약점 - 웹쉘 업로드

비용러브 2016. 2. 4. 12:41

웹쉘이란?
웹쉘(Webshell)이란 클라이언트의 명령을 서버에서 실행시켜주는 프로그램 이며... 웹쉘을 업로드하게되면?
일단, 공격자가 만든 웹쉘이 성공적으로 서버에 업로드가 된다면, 공격자는 자신이 서버에서 실행시키고자 하는 명령어를 전송하여, 서버에서 실행이 되게 합니다. 즉, 공격자는 해당 서버의 모든 제어권을 장악하고, 정보탈취, 변조, 악성스크립트 삽입등 각종 악성행위를 합니다.


웹쉘 공격을 하는 이유는?  앞서 말한것처럼 공격을 하는 최종 목적은 해당 서버를 장악 하기 위해서 입니다.
웹쉘 업로드는 어떻게?  게시판에 웹쉘을 업로드 할 것입니다.



웹쉘은 공격자가 악의적인 목적을 가지고 만든 프로그램으로, 주로 주로 SSS(Server Side Script)언어 (ASP, PHP, JSP등)를 사용하여 제작합니다
웹쉘공격은 HTTP서비스를 통하여 통신을 하기 때문에 탐지가 매우 어려우며, 제작이 비교적 쉽고 서버제어 및 관리가 용이하기 때문에 흔히 사용되는 공격방법 이기 때문입니다. 하지만 무엇보다도 자주 사용되는 이유는 보통은 파일업로드 취약점을 이용해서 업로드를 하게 됩니다.

파일 업로드 취약점이란 보통은 php,jsp,asp등의 확장자를 가진 파일은 변조 위험성때문에 업로드를 못하게 막아놓지만, 간혹 에디터의 오류
로 인해 업로드 되는 곳이 존재합니다. 그렇기에 보통은 이런식으로 업로드를 하게 됩니다.


게시판은 파일을 검사하는 부분에 취약점이 존재 합니다.
왜 이미지를 다운 받을까? 이미지를 다운 받은 이유 그 이유는 다음 소스에 있습니다.


if($_POST['mode']==1){
$aturl = $_FILES['upfile']['name'];
$tmp_file = @getimagesize($_FILES['upfile']['tmp_name'],&$type);
// (1) = gif, (2) = jpg, (3) = png, (4) = swf, (5) = psd, (6) = bmp
if(($tmp_file[2] != 1) && ($tmp_file[2] != 2) && ($tmp_file[2] != 3) && ($tmp_file[2] != 6)) {
ECHO "<script>window.alert(editor_lang[74]);</script>";
exit;
}
}


위에서 가장 큰 문제는 바로 이미지일 경우에 파일 확장자를 검사하지 않는다는 것입니다.
php의 getimagesize 함수와 리눅스의 파일 형식을 검사 할 수 있는 file 명령어에도 같은 문제점을 가지고 있습니다.
결국 정상적인 이미지 파일이 아님에도 불구하고 이미지 파일로 체크를 한다는 헛점이 생기게 되고 결국 위의 소스에서 파일 확장자 검사를 하지않고
getimagesize로 파일 종류만 구분하기 때문에 확장자가 php인 파일도 쉽게 업로드가 가능하게 됩니다.


준비 - 다운로드 받은 gif 파일과 웹쉘 파일을 합쳐줍니다.
이모티콘 - 웹쉘


이 처럼 합치면 gif 확장자를 php 파일로 변경해도 정상적으로 업로드 할 수 있게됩니다.

MAC OS 상에서는 PHP파일처럼 보이지만, 웹상에 올리게되면 정상적인 이모티콘으로 출력이 됩니다.

손쉽게 업로드 된 웹쉘 업로드한 웹쉘을 이제 실행시켜보겠습니다.

이처럼 웹쉘은 쉽게 파일업로드 취약점을 가진 게시판에서 업로드가 되버립니다.


그럼 어떻게 해야 안전할까요?
웹쉘을 예방하기 위해서는 아까 올렸던 소스코드처럼 오류가 있는지 없는지 자세히 확인을해야됩니다.


흔히 이런한것을 "시큐어 코딩" 이라합니다. 즉 시큐어 코딩을 통해 해킹을 예방하는 것입니다.

두번째로는 취약점 패치를 하는것입니다. 방금과 같이 취약점이 생기게되면, 1초라도 빨리 패치를 해야됩니다.

세번째로는 업로드 파일의 확장자 및 실행권한 제한 을 하는것입니다. 

실행권한을 제한함으로써, 권한이 없으면 실행 자체를 불가능하게 만드는것도 좋은 방법입니다.


댓글