인터넷은 일상에서 뗄 수 없는 존재입니다. 인터넷으로 물건을 구매하고 업무를 처리하며, 게임/영상 시청과 같은 여가 생활을 즐겨야 하기 때문입니다. 웹 서비스는 이러한 활동들, 인터넷으로 제공받는 서비스들을 말합니다.
인터넷 보급이 확대되면서 보안 시장의 판도도 확연히 달라졌습니다. 오늘날 발견되는 보안 취약점과 해킹 사고의 대부분이 웹 서비스와 관여되어 있기 때문이죠.
해커들은 웹사이트를 장악하여 데이터 변조/삭제, 그리고 웹 서버 측 내부 네트워크에 더 깊게 침투하여 시스템을 통제하는 등의 행위로부터 웹사이트 운영에 차질을 빚게 만들 수 있습니다.
웹 서비스 제공자 뿐만 아니라, 불특정 사용자(Client)에게도 피해를 줄 수 있는데요. 공인 인증서나 사용자 패스워드를 빼돌리거나, 악성 링크에 강제적으로 노출시켜 사용자 PC를 랜섬웨어에 감염시킨 뒤 금전적인 요구를 하기도 합니다.
웹 해킹이 늘어나는 원인
비단 웹사이트 쪽만 취약점이 많아서 공격이 많이 들어오는 거냐, 꼭 그렇지 만은 않습니다.
1. 누구에게나 공개되어 있는 특징
대부분의 웹 사이트들은 임의의 사용자가 접근할 수 있도록 공개되어 있습니다. 이는 공격자가 웹사이트의 구조와 취약점을 이해하는 데 큰 도움을 줍니다. 흔히, 이러한 웹 사이트 분석 작업을 보안 업계에서는 Scanning 또는 Information Gathering이라는 용어로 표현합니다.
나아가 발견한 취약점을 일차적으로 검증하는 일도 별다른 무리가 아니라는 것이죠. 웹 서버의 로직도 결국엔 프로그래밍 언어(ex., jsp
, php
)로 개발되기에, 공격자는 사용자 입력 값 및 페이로드 변조 등의 몇 번의 시도로 서버 측 소스 코드 취약점을 알아낼 수 있습니다.
2. HTTP 필터링이 사실상 불가능
보안에 있어 특정 프로토콜을 차단 또는 예외적으로 허용하는 작업은 상당히 중요합니다. 외부에서 회사/기관 망에 접속하려 할 때, SSH, RDP, FTP와 같은 프로토콜 기반의 채널들이 막혀있는 경우를 보셨을 겁니다.
이들은 직접적인 공격 경로가 될 수 있기에, 해당 프로토콜로 운용되는 포트(ex., ssh: 22
)를 대외적으로 차단하여 외부에서의 침투를 방어할 수 있습니다. 사내망으로 들어가는 게이트웨이에 부착된 방화벽이 이러한 필터링 역할을 수행하는 것이죠.
그러나 웹 서비스에 사용되는 HTTP/HTTPS의 경우, 이야기가 살짝 다른데요. 어떤 웹 서비스를 개발해서 인터넷에 공개했다면, 그것은 본래 외부에 있는 클라이언트들과 통신을 하기 위해 설계된 것입니다. 웹 서비스 운영자가 HTTP를 차단해 버린다면, 당연히 웹 서비스 이용자가 보낸 요청을 받지 못할 것이고 서비스가 제대로 동작할 리가 없겠죠.
그렇다보니 HTTP만큼은 방화벽도 손쉽게 제어하지 못하고 열린 상태로 두게 되는데요. 이 때, 공격자들은 그나마 공격이 수월한 HTTP 채널, 즉 웹 서비스를 타겟으로 설정하는 것입니다. 웹 서비스 취약점, 웹 보안이 강조되는 이유도 이 때문이라고 할 수 있습니다.
웹 취약점이 발생하는 위치
사용자 입력 값 검증 부재
게시판, 댓글, 또는 로그인 화면 등 사이트 어디에나 텍스트를 입력할 수 있는 공간이 있습니다. 해당 영역에 입력된 값들은 웹 서버로 전달되어 분석되고, 이후 요청 작업을 수행하는 데 활용됩니다.
그러나, 간혹 사용자가 전혀 생뚱맞은 입력 값을 주는 경우도 있겠죠. 가령, 알파벳이나 숫자를 요구하였는데 특수 문자(’
, \
등)를 기입하는 시도도 가능할테니까요.
입력 값에 대한 형식, 필터링 되어야 하는 문자, 길이와 같은 제한을 적절히 설정하지 않는다면, 비정상적인 파라미터로 인해 웹 서버 또는 데이터베이스가 웹 개발자의 의도와는 상관 없는 방향으로 동작하게 만들 수 있습니다.
단순히 짧은 문장만 집어넣었는데도 서버를 무단으로 제어하고 데이터 유출이 발생될 수 있는 것입니다. 대표적인 공격 기법으로는 SQL Injection, Code Injection 등이 있습니다.
URL Parameter
공격자들은 관리자 페이지를 비롯한 일반인에게 숨겨진 페이지를 URL로 유추할 수 있습니다. http://사이트주소/admin
이런 식으로 말이죠. 또한, URL 파라미터에 일반적이지 않는 값을 집어넣어 웹 서버 측의 데이터를 무단 열람하거나 제어하는 행위도 가능합니다.
취약한 인증
아래의 케이스들 중 하나라도 해당된다면 웹 서버의 인증 체계가 부실하다고 할 수 있습니다.
- 사이트 URL 또는 referer header에 세션 ID가 노출되어 있는 경우
- 세션 ID를 유추하기 쉽게 설계하거나, 고정 값을 사용하게 하는 경우
- 데이터베이스 암호화가 이뤄지지 않는 경우
웹 해킹 공격 유형
웹 보안 분야에서 가장 경계하고 있는 공격 유형 5가지 입니다.
SQL injection
서버가 데이터베이스에 비정상적인 SQL 쿼리를 요청하도록 유도하여 일반 사용자에게 드러나선 안되는 정보를 노출하거나, 데이터베이스 내 레코드 변조/삭제하는 공격 행위입니다.
Command Injection
원격으로 웹 서버에서 시스템(OS) 명령어를 수행하게 만드는 공격입니다. 이러한 공격을 통해 웹 서버 디렉토리를 뒤져가면서 중요한 정보(관리자 패스워드 등)를 열람하거나 각종 데이터를 손상시킬 수 있습니다.
XSS (cross-site scripting)
html, css, js과 같은 클라이언트 언어로 작성된 스크립트를 웹 서버에 삽입하고, 웹사이트에 접속한 불특정 다수의 사용자가 이러한 악성 스크립트를 수행하게 만드는 공격입니다.
XSS의 공격 대상은 웹 서버보다는 사이트 이용자에 가까우며, 이용자의 쿠키 값 또는 세션 정보를 빼돌리거나 피싱 사이트로의 접근 유도 등 직접적인 피해를 줄 수 있습니다.
CSRF (cross-site request forgery)
사이트 이용자가 전혀 의도하지 않은 요청을 웹 서버로 보내도록 유도하는 공격입니다. 대표적으로 사용자의 로그인 정보를 변경하거나, 악성 링크를 포함한 광고성 게시글을 무단으로 올리는 행위가 가능합니다. 사용자가 이러한 공격이 이뤄지고 있음을 눈치채지 못할 정도로 은밀하게 공격이 가해집니다.
파일 다운로드/업로드 취약점
웹 서버로부터 비정상적인(일반적으로 공개되어선 안되는) 파일을 다운로드 받거나, 반대로 웹 서버에 악성 스크립트 류의 비정상적인 파일을 업로드하는 공격입니다.