웹 해킹 & 시큐어 코딩

웹 해킹 & 시큐어 코딩 (26)

홍시뗄레 2025. 2. 15. 22:59

파일 업로드 취약점이란 무엇인가?

사용자가 파일 업로드할 때 (정상파일) 악의적인 사용자가 비정상 파일을 업로드한다. 

비정상 - 정상적인 경로를 벗어난 것. 

SSS로 작성된 웹셀 코드이냐 아니냐에 따라 정상과 비정상으로 나뉨 (서버 사이드 스크립트)

OS command 취약점과 동일한 취약점이 나타난다. (파급력 있는 취약점)

 

웹 방화벽, 웹쉘 모니터링 솔루션 등으로 방지할 수 있다. 

공격자가 웹 서버에 침투하여 제어권을 얻는다. 중요 정보, 설정 파일 등을 열람할 수 있다. 인근 동일 네트워크 서버의 정보 획득이 가능해진다. 

공격자가 원하는 행위를 할 수 있는 수단으로 이용하는 파일 업로드 취약점. 

공격 원리 분석

악성 스크립트 업로드를 시도. 업로드가 진행될 때 파일 명을 받는다. 기존의 경로와 합쳐진다. 이후에 파일 출력이 이루어진다. 사용자가 서버에 파일을 출력하는 것. (파일 쓰기)

이후에 공격자가 업로드된 경로로 접근한다. url을 필요로 하다. server side script로 작성되어야 한다. 웹 디렉터리여야 한다. 경로도 찾아야 한다. 

오늘날은 대부분 웹 디렉터리에 넣지 않는다. 경로 변조를 해서 올릴 수 있기 때문. 

파일 다운로드를 통해 웹 디렉터리 경로를 획득한 후 업로드해야 하는... 복잡한 과정이다. 

웹쉘이란 무엇인가?

web : 월드 와이드 웹

shell : 사용자와 커널 간의 대화를 하기 위한 인터페이스 

(cmd.exe, bash shell, 등등)

webshell : 웹 페이지 상에서 원격지 서버의 시스템 명령어를 실행할 수 있는 도구

원격으로 떨어진 상황에서도 웹에 접근할 수 있다. 

시스템 함수를 악용해서 웹 쉘로 만든다. (공격용 악성 스크립트)

 

언어별 시스템 함수가 정말 다양하다. php 웹쉘을 막는다는 것은 어려움. 너무 많아서.

시스템 함수를 통해 시스템 명령을 수행할 수 있다. 

 

웹쉘 종류도 정말 많다. 파일 브라우저 (파일을 볼 수 있는 기능), 삭제 수정 등도 가능하다. 시스템 명령 수행 외 다양한 기능이 있다. 

[실습8-1] 간단한 웹쉘 제작 및 파일 업로드 취약점 공격 실습

우선 특정 디렉터리에 웹쉘 파일을 만들자.

바탕화면에 그냥 임의로 추가해주었다. webshell.php 파일을 만든다.

이렇게 입력해준다.

그렇다고 합니다

대충 이해가 되는데 직접 확인해보는 게 더 좋을 것 같죠

admin 계정으로 로그인해서 방금 만들어둔 php 파일을 업로드해주자.

이제 경로를 찾아야 된다. 일반적으로 upload 디렉터리에 있다.

403 Forbidden이 나왔다. 있긴 한데 접근이 불가능하다는 뜻이다. 즉, upload 디렉터리 안에 있다는 뜻이다. (소규모 웹사이트일 경우에만 가능한 일)

만약에 upload가 아니라 uploads에 있는지 확인해본다면?

 404 Not Found가 뜬다. 이로써 uploads 디렉터리는 아예 없다는 것을 확인할 수 있다. 그럼 아까 403이 뜬 upload 디렉터리로 들어간다.

이렇게 url을 입력하면 아까 우리가 만들어뒀던 html 실행 화면이 나타난다.

ipconfig를 써보자.

이렇게 나온다. 그 외에도 dir를 치면 현재 경로가 나온다.

OS command injection과 비슷하다. 시스템 명령을 실행할 수 있다. 

내부 파일들을 전부 꼼꼼하게 열람할 수 있다. 경로의 파일들을 다 찾아서 정보들을 캘 수 있다. 

인근 네트워크 접속 정보도 파악할 수 있다! 데이터베이스 접속 정보를 통해 데이터베이스 침투까지 가능하다. 

[실습8-2] 파일 업로드 취약점 공격을 통한 Reverse-Shell 실습

먼저 공격자 pc에서 웹쉘을 업로드하자.

실제 해킹을 진행할 때에는 들키면 안되므로 대충 글을 이렇게 작성해줘야 한다. 실습이라 나는 대충 써보았다.

리버스 쉘을 하기 위해서 netcat을 이용한다.

서버에서 요청을 하고, 클라이언트에서 응답을 하고 서로 연결하는 방식. 연결 요청 부분만 다른 것이 리버스 쉘. 

 

이건 netcat을 다운로드 받아서 공격자 pc로 nc.exe를 업로드한 뒤 리버스 쉘을 시도해야 되는데, 현재 netcat에서 다운로드가 불가능하므로 만약 실습을 하고 싶다면 kali linux에서 실행해야 될 것 같다... chrome이나 엣지로 실행할 수 없다. 

아무튼 이렇게 디렉터리를 확인하고, 소스코드 열람도 할 수 있다. 

검증 로직 유형

업로드 파일이 비정상적인지 정상적인지 기준을 정해서 비정상적이라면 업로드를 중지시켜주는 행위를 해주는 검증 로직.

1) 확장자 검증

가장 일반적. 

2) 이미지 검증

이미지인지 아닌지 검증. 

3) 파일 사이즈 검증

정해진 파일 사이즈를 초과할 경우엔 업로드를 시키지 않음. 

확장자 검증 로직에 대한 이해

webshell.jsp 파일을 업로드하려고 시도를 한다면? 

이미지는 jpg, png, gif 등등. 확장자를 기준으로 파일 타입을 판단할 수 있다.

어플리케이션 서버 관점에서는 서버사이드스크립트 확장자를 인식한다. 컴파일을 해서 문제가 발생할 수 있다.

jsp 파일 업로드를 하려고 할 때, 거부를 해야 한다! 비정상 파일로 분류되기 때문이다.

test.png를 업로드할 경우엔 png는 정상적인 파일로 판단하여 업로드할 것이다. 

 

블랙 리스트 방식

파일 업로드할 때 악의적인 확장자를 갖고 있는 파일은 업로드하지 않는다. 

화이트 리스트 방식

허용할 확장자만 선언해둔다. 이미지 업로드가 대표적이다. 

파일명만 받아들이고 파싱 작업을 한다. 확장자 검증을 하고 파일 업로드 여부를 결정한다.