국제웹보안표준기구 OWASP에서는 여러 분야(웹, 데스크톱 앱, 모바일 등)에 대한 열 가지 취약점을 발표하고 있습니다.
https://owasp.org/www-project-top-ten/
웹의 상위 10가지 취약점
시간 흐름에 따라 구분이 세부화/통합, 기준 변경이 되므로 주요하게 등장하는 열가지 웹 취약점에 대해 알아보도록 하겠습니다.
클라이언트의 요청 처리를 위해 파라미터에 특정 코드를 실행할 수 있는 내용이 포함되는 경우가 있습니다. 이런 경우 파라미터를 따로 처리해야하며, 그렇지 않은 경우 삽입 공격에 취약점이 발생합니다.
삽입 공격은 SQL, OS, LDAP(Lightweight Directory Access Protocol) 등 웹을 통해 명령이 전달되는 형태라면 공격이 가능하지만 주로 DB에 접근을 하는 SQL Injection 공격이 일반적으로 수행됩니다.
주로 웹 서버에서 DB로 전송되는 SQL 쿼리에는 아이디, 패스워드 등과 같은 파라미터들이 사용되는데 SQL 삽입 공격은 전송되는 인수에 추가적인 실행을 위한 코드를 삽입하여 공격하는 것을 의미합니다.
인증 및 세션 관리 기능이 제대로 구현되지 않는다면 공격자가 로그인 등의 인증 절차를 무단으로 통과하거나 타인의 인증 정보로 페이지를 접근할 수 있게 됩니다.
대표적인 취약한 인증으로는 패스워드 설정으로 패스워드를 간략하게 설정(ex) 0000, 1234, admin)하는 경우 공격자가 쉽게 관리자 또는 사용자 권한을 획득하여 사용할 수 있게 됩니다.
또한 취약한 세션 관리로는 최초 인증 이후 클라이언트에 인증과 증명 역할을 넘기는 경우가 해당됩니다. 이 경우 클라이언트 측에서 최초 로그인으로 유효한 세션을 연결 한 뒤 인증 정보를 속여 악용이 가능해집니다.
XSS (Cross Site Scription)은 공격자가 작성한 스크립트가 다른 사용자에게 전달되는 것으로, 클라이언트가 서버를 신뢰한다는 특징을 이용한 공격입니다.
XSS는 다음과 같이동작합니다.
취약한 접근 제어는 인증된 사용자가 수행할 수 있는 것에 대한 제한이 제대로 적용되지 않는 것을 의미합니다. 이를 통해 접근 권한이 없는 기능을 사용하거나 데이터를 무단 열람할 수 있게 됩니다.
관리자 페이지가 추측하기 쉬운 URL을 사용하거나, 인증이 필요한 페이지에 대해 인증을 우회하여 접속할 수 있는 경우에 주로 발생하는 취약점입니다. 이를 방지하기 위해서는 권한이 필요한 페이지에 대해 세션 값을 확인하는 검증 로직을 따로 두어야합니다.
또한 웹 상 파일 다운로드 시에도 .., /와 같이 디렉토리 구조를 열 수 있는 문자를 필터링하지 않게되면 공격자가 웹 페이지의 특정한 파일 내용을 다운로드 받을 수 있게 됩니다.
일반적으로 발생하는 보안 설정 오류에는 다음과 같은 것들이 있습니다.
디렉토리 리스팅
디렉토리 리스팅 directory listing은 웹 브라우저에서 웹 서버의 특정 디렉토리를 열면 해당 디렉토리의 파일과 목록이 모두 나열되는 것을 의미합니다.
백업/임시 파일의 존재
웹 서버에 백업 또는 임시 파일을 삭제하지 않고 방치하는 경우가 있는데 이 경우 이 파일들을 통해 로직이나 DB 접속 정보와 같은 정보들이 탈취될 수 있습니다.
주석
웹 프록시를 사용하게되면 일반 사용자도 웹 애플리케이션 로직 코드의 주석을 확인할 수 있게 됩니다. 주석은 대부분의 경우 로직에 대한 설명, 정보 등을 담고 있어서 주석에 정보를 기록할 때는 주의하여야 합니다.
파일 업로드 제한의 부재
웹 서버의 가장 치명적인 취약점으로 클라이언트에서 서버로 임의의 파일들을 보낼 수 있다. 웹 서버에 악의적인 파일을 전송해 웹 서버를 장악하고 침투할 수 있기 때문입니다. 사용자가 파일을 첨부하는 형태가 아니어도 운영용 파일 업로드 코드가 노출되는 경우에도 위험에 노출될 수 있습니다.
리버스 텔넷
리버스 텔넷은 시스템 권한을 획득한 후 해당 시스템에 텔넷과 같이 직접 명령을 입력하고 확인할 수 있는 shell을 획득하는 방법으로, 방화벽을 가진 시스템을 공격하는 데 사용됩니다.
데이터의 중요도에 따라 암호화 로직을 설정하고 데이터 베이스 테이블 단위에서 암호화를 수행해야합니다. 암호화 수준이 낮거나 구조걱인 문제가 있는 경우 데이터가 복호화되거나 위/변조 될 수 있습니다.
공격 방식이 복잡해짐에 따라 보안 솔루션만으로는 공격을 차단하기 어려워지고 있습니다. 이에따라 웹 애플리케이션 레벨에서도 탐지/로깅/응답/차단을 포함하도록 권고 되고 있습니다.
CSRF (Cross Site Request Forgery)는 불특정 다수 사용자를 대상으로 로그인된 사용자가 자신의 의지와는 무관하게 공격자가 의도한 행위들을 하게 만드는 공격이며, 웹 사이트가 사용자의 브라우저를 신뢰하는 점을 이용한 공격입니다.
XSS 공격과 비슷하지만 CSRF 공격은 사용자가 악성 스크립트를 서버에 요청한다는 차이가 있습니다. (XSS는 클라이언트 측에서 악성 스크립트를 실행)
웹 환경이 다양해짐에 따라 다양한 라이브러리, 컴포넌트, 프레임워크, 모듈을 사용하고 있는데 이때 보안에 취약한 컴포넌트 등을 사용하는 경우에 데이터 손실, 서버 장악 등의 문제가 발생할 수 있습니다.
사용하고자 하는 컴포넌트 등의 보안 취약점을 충분히 검토 및 확인하고 사용해야 합니다.
마찬가지로 웹 환경이 다양해짐에 따라 다양한 웹 서비스 간의 연동이 많아지고 이 연동이 주로 API를 통해 이루어집니다. 이 경우에도 API의 보안 취약점 등을 충분히 검토 하고 사용하여야 합니다.
다음 세 가지 보완 방안을 통해 웹 취약점을 막을 수 있습니다.
웹 해킹의 가장 기본적인 형태가 파라미터 조작이며, 이 조작을 위해 특수문자를 포함하게 되어 있습니다. 주요 특수문자와 관련 공격을 정리하면 다음과 같습니다.
XSS 공격에 주로 사용되는 특수문자들
< > & " ? ' /
SQL Injection에 주로 사용되는 특수문자들
' = ; * . .. --
디렉토리 탐색에 사용되는 특수문자
/
파일 업로드 제한, 특수문자 필터링을 적용할 때 주의할 점은 자바스크립트와 같은 CSS (Client Side Script) 기반 언어로 필터링을 수행하면 안됩니다. CSS 기반 언어는 웹 프록시를 통해 웹 브라우저에 전달되므로 이 과정에서 변조될 가능성이 있습니다.
필터링 로직은 ASP, JSP와 같은 SSS (Server Side Script)로 작성해야 합니다.
URL 접근 제한에 실패하지 않기 위해서는 기본적으로 모든 웹 페이지에서 세션에 대한 인증을 수행해야합니다. 모든 페이지에서 일관성 있는 인증 로직을 적용하려면 기업 단위 또는 웹 사이트 단위에서 세션 인증 로직을 표준화하고, 개발 표준을 준수해야합니다.