본문 바로가기

보안 이론/웹 보안

Web Shell 업로드 우회 실습

반응형

웹 쉘이 서버에 업로드되면 서버 파일 수정, 삭제, 파일 업로드, 다운로드 등 다양한 조작을 할 수 있어 아주 위험하다.

우리는 웹 쉘이 어떤 식으로 업로드 되어 악성행위를 하는 지 실습을 통해 알아보려고 한다.


 파일 업로드 취약점 공격

웹 서버의 첨부파일에 대한 필터링이 미흡함을 이용해 악의적인 파일을 서버에 침투시키는 공격이다.

웹쉘의 경우 서버 사이드 스크립트를 이용하기 때문에 PHP, JSP, ASP 와 관련된 파일은 업로드하지 못하게 하거나 업로드 되더라도 실행되지 못하도록 설정해야한다.

 

DVWA를 이용해 웹쉘을 업로드하는 실습을 진행한다.

DVWA - File Upload [Low]

해당 페이지는 다음과 같이 파일을 선택하고 업로드할 수 있도록 구성되어있다.

일단 안전한 이미지 파일 하나를 올려본다. 

"cat.jpg"파일을 업로드하니 다음과 같이 출력이 된다.  출력된 주소로 접속하면 고양이 사진 파일이 잘 업로드되어 있다. 

 

본격적으로 웹 쉘을 업로드해 볼 것이다. 확장자가 php인 웹 쉘을 업로드해 보았다.

그러자 업로드되지 않았다는 경고문이 나오게 된다.

이를 보고 필터링이 설정되어 있다고 생각할 수 있지만 사실은 업로드 크기제한이 걸려있는 것이었다.

개발자도구를 이용하여 value를 더 크게 설정한 뒤 다시 한번 업로드를 하게 되면 잘 업로드됨을 확인할 수 있다.

업로드 확인 주소로 접속해보면 실행 또한 잘 동작함을 알 수 있다.

 

DVWA - File Upload [medium]

역시 무작정 php 웹쉘 파일을 올려보는 것으로 시작한다.

이번에는 JPEG와 PNG 파일만을 올릴 수 있다고 문구가 출력된다.

확장자를 JPEG로 바꿔서 업로드해봐도 똑같은 결과가 나온다.

여기서부터는 프록시를 이용하여 진행할 것이며 BurpSuite를 이용한다.

 

먼저 정상 이미지를 전송한 패킷을 확인해본다.

많은 부분을 내용이 있으나 Content-Type에서 image/jpeg 즉 이미지임을 확인한다고 짐작할 수 있다.

 

웹 쉘을 업로드할 때 패킷을 살펴보자

웹 쉘은 application/octet-strem으로 전송됨을 알 수 있다. 이 부분을 image/jpeg로 수정해서 보내면 어떨까?

파일 자체가 아닌 http 헤더를 통해 필터링을 수행하기 때문에 전송해본 결과 업로드에 성공했음을 알 수 있다.

 

DVWA - File Upload [high]

HIGH 난이도는 다른 게시글에서 다루었다.

2022.09.19 - [보안 이론/웹 보안] - 파일 업로드 우회 - File Signature

 

파일 업로드 우회 - File Signature

파일 업로드 시 파일의 시그니처를 확인하는 필터링을 우회하여 업로드시키는 방법을 실습한다. File Signature (= File Magic Number) 파일 시그니쳐란 파일의 내용을 해석하기 위해 포함하고 있는 고유

taesam.tistory.com

 

HTTP PUT Method 취약점

HTTP에는 다양한 메소드가 존재하지만 그 중에서 PUT 메소드파일을 서버에 업로드하는 메소드이다.

통신을 통해 서버에 알 수 없는 파일이 업로드되는 것은 매우 위험하기에 대부분의 서버는 PUT 메소드를 금지하고 있으나

일부 취약한 웹 서버나 WebDav가 남아있으면 이를 악용할 수 있기 때문에 조치할 필요가 있다.

WebDAV : 웹 개발 시에 여러 개발자들이 서버에 저장된 문서나 파일을 손쉽게 읽고 쓸 수 있는 기능을 제공하여 협업의 도움을 주는 공간이다. 대다수의 권한이 풀려있기 때문에 외부에 공개시 큰 취약점으로 작용할 수 있다.

 

BWAPP - Insecure webdav Configureation 실습

해당 문제에서는 서버가 안전하지않은 webdav 설정을 가지고 있다고 한다. 

URL에 /webdav 를 입력하여 접속해보자

다음과 같은 페이지가 나오고 파일을 열고 닫을 수 있다.

하지만 문제에서 나왔듯이 취약한 webdav이기 때문에 더 다양한 기능이 숨어있음을 짐작할 수 있다.

 

우리는 해당 페이지를 이용하여 웹쉘을 업로드할 것이다.

 

프록시 이용해서 업로드

우선 해당 페이지를 Brup Suite를 이용하여 패킷을 잡아낼 것이다.

해당 페이지의 GET 요청 패킷을 잡아냈다. 

우리는 이 패킷을 PUT 패킷으로 변조하여 전송할 것이다.

메소드을 PUT으로 바꾸고 경로에 파일명을 설정해 준 뒤 바디부분에 프로그램의 내용 전체를 복사해서 입력 후 전송한다.

전송이 완료되면 다음과 같은 페이지가 보이고 새로고침하면 원하는 파일이 업로드된 것을 확인할 수 있다.

 

 

칼리 리눅스 Cadaver를 통한 업로드

우리는 칼리 리눅스의 cadaver라는 툴을 이용해서도 위와 같이 업로드 할 수 있다.

 

공식 문서에서 알 수 있는 이 툴은 "cadaver는 파일 업로드, 다운로드, 화면 표시, 내부 편집, 네임스페이스 작업(이동/복사), 컬렉션 생성 및 삭제, 속성 조작 및 리소스 잠금을 지원합니다."  라는 설명과 같이 WebDAV 관련 문제를 해결하기에 아주 용이하다.

 

현재 bee-box의 webDAV에 올라가있는 파일 목록이다. 이곳에 다른 웹쉘을 하나 더 업로드할 것이다. 

 

다음과 같이 cadaver 명령어를 통해 주소를 연결하고 PUT 메소드로 파일을 전송한다.

여기서는 r57shell.php 파일을 전송해 볼 것이다.

 

입력 후 webDAV에 접근하면 이와같이 손쉽게 파일이 업로드되어 실행까지 가능한 것을 확인할 수 있다.

 

이런 일이 가능한 이유는 webDAV 디렉토리에서는 다양한 메소드가 허용되어있기 때문이다. 고로 개발이 완료되었다면 반드시 일반 사용자의 접근을 차단하여야 한다.

반응형


Calendar
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Archives
Visits
Today
Yesterday