Information Technology

웹 주요 취약점 OWASP Top 10 알아보기

coinAA 2021. 11. 1.

 

목차

     

    Open Web Application Security Project : OWASP란?

    국제 웹 보안 표준기구 OWASP는 오픈소스 웹 애플리케이션 보안 프로젝트이다. 주로 웹에 관한 정보 노출, 악성 파일 및 스크립트, 보안 취약점 등을 연구하며, 10대 웹 애플리케이션의 취약점을 발표했다. 

     

    웹의 주요 취약점

    Injection : 인젝션 / 명령어 삽입 취약점

    클라이언트의 요청을 처리하기 위해 전달받은 인수에 특정 명령을 실행하는 코드를 포함시켜 공격하는 방법이다.
    이런 Injection 공격은 SQL, OS, LDAP 등 웹을 통해 명령을 전달하는 어떠한 경우에도 적용될 수 있다. 

    전송받는 인수에 포함된, 특정 명령을 실행하는 코드를 적절히 필터링하지 못하면 삽입 공격에 대한 취약점이 발생하고 명령 삽입 공격은 SQL, OS, LDAP 등 웹으로 명령을 전달하는 모든 경우에 적용 가능하다. 웹 서버에서 데이터베이스로 전송되는 SQL 쿼리에는 아이디, 패스워드, 검색어 등 여러 가지 인수가 사용된다.

    Broken Authentication and Session Management / 인증 및 세션 관리 취약점

    인증이나 세션 기능이 미흡하다면 공격자가 허가되지 않은 여러 서비스에 접근하고 사용할 수 있다.
    가장 대표적인 문제로 패스워드 설정으로서 패스워드를 취약하게 설정한 경우이다. 사용자 데이터를 이용한 인증 취약점의 경우 서버에서 로그인된 사용자를 인증하기 위한 값으로 쿠키와 같은 세션 값을 클라이언트에게 전달하고 이때 공격자는 이 값을 이용해 연결하게 됨으로써 실제 사용자의 요청인지 공격자의 요청인지 구별하기 어렵게 된다. 이런 문제는 최초 인증 후에는 인증과 신분 증명을 위한 역할을 클라이언트에게 위임했기에 발생하는 문제이다. 인증뿐만 아니라 신뢰도의 증명 권한을 클라이언트에게 넘겼다면 얼마든지 더 악용될 수도 있다. 서버가 통제해야 할 기능과 정보를 편의를 위해 클라이언트에게 전달함으로써 위험한 결과를 초래할 수 있다.

    웹의 경우 대부분 전문 개발자가 개발하고 사용자는 이를 단순하게 이용할 뿐 관리자 패스워드를 변경하는 인터페이스가 별도로 만들어져 있지 않아 사용자는 개발자가 처음 설정한 패스워드를 그대로 쓰는 경우가 많다.
    웹에서 Admin/Admin과 같이 취약한 패스워드를 자주 발견할 수 있다.

    사용자 데이터를 이용한 인증(인증 값 동일)

     

    Cross-Site Scripting / XSS취약점

    XSS(Cross-Site Scripting)는 공격자가 작성한 스크립트(Script)가 다른 사용자에게 전달되는 것을 말한다.
    다른 사용자의 웹 브라우저 안에서 적절한 검증 없이 실행되므로 사용자 세션 탈취, 웹 사이트 변조, 악의적인 사이트로 사용자 이동시키거나 할 수 있다. 간단한 예로 알아보자면 사용자들은 웹 브라우저 내에서 검증 없이 해당 스크립트가 수행되므로 많은 문제를 야기할 수 있고 XSS 취약점이 존재하는 서버에 공격자가 스크립트를 작성하여 저장한다.
    해당 웹 서비스를 이용하는 사용자는 자신이 게시글의 글을 읽는 등의 활동을 하며 인지도 하지 못한 채 스크립트 코드에 접근하게 되고 웹 서버는 요청에 의해 코드가 포함된 데이터를 사용자에게 전달하고 시스템에선 전달받은 스크립트를 수행하게 되는 원리이다.

    통상적인 XSS 공격 구조(쿠키)

     

    Broken Access Control / 취약한 접근 제어

    Broken Access Control는 인증된 사용자가 수행할 수 있는 것에 대한 제한을 제대로 적용하지 않은 것을 의미한다.

    공격자는 이를 악용하여 사용자 계정 접근, 중요 파일 보기, 사용자 데이터 수정, 접근 권한 변경 등과 같이 권한 없는 기능을 사용하거나 데이터에 접근할 수 있다. 관리자 페이지가 추측하기 쉬운 URL이거나 인증이 필요한 페이지에 인증을 하지 않고 우회하여 접속할 수 있는 취약점이다.

    인증된 사용자라 할지라도 접근하지 못하는 페이지들이 있는데 접근 불가한 페이지라도 취약한 제어는 사용자가 접근할 수 없어야 하는 페이지도 접근할 수 있게 만드는 것이다. 공격자는 이런 방법을 이용해 다양한 문제를 일으킬 수 있다. 관리자 페이지에 접근을 했는데 URL만 알고 있으면 접근이 가능하거나 관리자가 사용할 수 있는 모든 기능을 일반 사용자도 할 수 있는 등의 취약점이다. 이러만 문제를 막기 위해 세션 값을 확인하는 방안이 필요하고 페이지뿐만 아니라 파일에도 적용해야 한다.
    예시로 유튜브는 10만, 100만, 1000만 등의 구독자를 보유하면 그에 걸맞은 버튼을 기념으로 준다. 지금은 개선되었지만 구독자를 보유하지 않는 사용자가 유튜브 URL 뒤에 /gold 등을 입력하면 골드 버튼을 신청하는 URL 페이지로 넘어가는 경우가 있었다. 이처럼 일반적으로 접근을 제어해야 한 페이지에 일반 사용자들이 접근한 경우이다.
    인증 우회나 접근을 막으려면 웹의 중요 페이지에 세션 값(쿠키)을 확인하는 검증 로직을 입력해 두어야 하고 프로그램 개발 시 표준 인증 로직을 만들어 웹에 존재하는 모든 페이지의 앞부분에 입력해야 한다.

     

    Security Misconfiguration / 보안 설정 오류

    디렉터리 리스팅(Directory Listing)

    웹 브라우저에서 웹 서버의 특정 디렉터리를 열면 관련 파일과 목록이 모두 나열되는 취약점이다. 디렉터리에 접근하게 되면 모든 파일 리스트를 확인할 수 있는 경우가 있다. 관리자가 의도하는 경우도 있지만 대부분 관리자의 인지하지 못하여 발생하는 문제가 대부분이며 대다수이다.

     

    백업 및 임시 파일 존재

    개발 시에 개발자가 백업 파일이나 임시 파일을 삭제하지 않고 있는 그대로 방치함으로써 백업 파일을 통해 웹 애플리케이션의 내부 로직, 데이터베이스 접속 정보 등 내부 정보를 획득할 수도 있다. 

     

    미흡 환 주석 관리

    웹 애플리케이션에서 웹 프록시를 이용하면 일반 사용자도 볼 수 있는 주석에는 웹 애플리케이션 개발 과정, 주요 로직에 대한 설명, 디렉터리 구조, 테스트 소스 정보, 아이디와 패스워드 등이 기록된다. 주석 이와 같이 기재한다면 그 자체가 취약점이 된다.

     

    파일 업로드 제한 부재

    공격자가 웹 서버에 악의적인 파일을 전송한 뒤 원격지에서 실행하면 웹 서버 장악, 내부 침투, 버퍼 오버플로우, 포맷 스트링 등의 공격 수행이 가능하다.
    웹 서버에 어떠한 파일이라도 업로드할 수 있도록 방치하는 것도 공격자에게 공격을 위한 빌미를 제공하는 것이 된다. 악성 파일을 전송하여 서버에서 실행하게 된다면 서부 내부 침투가 가능하게 되고 이런 악성 파일 업로드를 통해 리버스 텔넷 공격 등도 가능해지고 대부분 서버는 텔넷 등의 포트로 서버에 접속하지 못하도록 방화벽을 사용하는데, 인바운드[각주:1]만 신경 쓰게 되고 아웃바운드[각주:2]에 대해선 인식이 미흡하다면 악성 프로그램 업로드로 서버에서 공격자에게 텔넷을 연결하도록 할 수 있다.

     

    • Reverse Telnet : 리버스 텔넷
      • 웹 해킹으로 시스템 권한 획득 후 직접 명령을 입력하고 확인할 수 있는 셸(예-텔넷)을 획득하기 위한 방법으로 방화벽이 있는 시스템을 공격할 때 자주 사용한다.
      • 방화벽 내부에 존재하는 웹 서버는 80번 포트를 이용한 웹 서비스만 제공하면 되므로 외부 인터넷 사용자에게 80번 포트만을 허용한다. 대부분 웹 서버의 텔넷이 열려 있어도 방화벽으로 인해 외부 공격자의 접근 불가능하다.
      • 방화벽의 인바운드 정책에서 80번 포트 외에 필요한 포트만 빼고 다 막아놓지만, 아웃바운드 정책에서는 별다른 필터링을 수행하지 않는 경우가 많다. 이때 웹 서버에서 공격자의 PC로 텔넷 연결을 허용하는 상황을 공격자가 이용하는 것이 리버스 텔넷이다.
    • 리버스 텔넷 공격 순서
    • 웹 서버에서 공격자 PC로 텔넷 접속을 하기 위한 권한 획득을 위해 파일 업로드 공격을 이용, 웹 셸 업로드로 시스템에 명령을 입력할 수 있는 명령 창 얻기 등 순으로 이루어진다.
      1. 명령 창 획득 : 파일 업로드 등으로 웹 브라우저에서 실행 가능한 웹 셸을 웹 서버에 업로드, 공격자가 명령을 입력할 수 있는 명령 창 획득한다.
      2. 리버스 텔넷용 툴 업로드 : 서버 게시판의 파일 업로드 기능을 이용하여 nc(Net Cat)와 같은 리버스 텔넷용 툴 업로드 한다.
      3. 공격자 PC의 리버스 텔넷 데몬 활성화 : 서버에서 리버스 텔넷을 보내면 이를 받아 텔넷을 열 수 있도록 준비한다.
      4. 획득한 명령 창으로 공격자에게 리버스 텔넷을 보내면 리버스 텔넷 창 획득한다.

     

    Sensitive Data Exposur / 민감한 데이터 노출

    웹 사이트 해킹으로 개인 정보가 유출되는 것은 신용카드 번호, 주민등록번호, 인증 신뢰 정보와 같은 민감한 데이터를 보호하지 않는 것이 주요한 원인이다.

    민감한 데이터를 보호하려면 데이터 중요도에 따라 암호화 로직을 사용하고 데이터베이스 테이블 단위에서 암호화를 수행해야 한다. 인터넷 뱅킹과 같이 보안성이 중요한 시스템에서는 웹 트래픽을 암호화하는데 사용하는 암호화 알고 리즘이 약하거나 구조에 문제가 있다면 웹 트래픽이 복호화되거나 위조 또는 변조될 수 있다.

     

    Insufficient Attack Protection / 공격 방어 취약점

    웹 어플리케이션 레벨에서 기본적인 유효성 검사나 침입 탐지, 로깅, 공격 차단등의 로직을 포함해야 한다.

    예전 웹 애플리케이션은 해킹 공격을 탐지(Detect), 방지(Prevent), 대응(Respond)할 수 있는 기능을 갖 추고 있지 않았다. APT 공격이 일반화되면서 보안 솔루션으로 탐지가 어렵자 웹 애플리케이션 수준에서 자동으로 탐지, 로깅, 응답 및 공격 시도 차단을 포함하도록 권고하고 있다.

     

    Cross-Site Request Forgery / CSRF 취약점

    CSRF(Cross Site Request Forgery)는 불특정 다수를 대상으로, 로그인된 사용자가 공격자가 의도한 행위(수정, 삭제, 등록, 송금 등)를 하게 만드는 것을 말한다. XSS 공격과 매우 유사하지만 XSS공격과는 달리 스크립트가 사용자가 아닌 서버에서 수행되도록 하는 구조적 차이가 있다. 

    CSRF 공격이 성공하려면 수정, 삭제, 등록 과정에서 사용자를 구분하는 인숫값이 존재하지 않아야 한다.
    특정 사용자를 구분하는 인수가 있으면 한 사용자에게만 적용되거나 인증 과정을 통해 CSRF 공격을 막을 수 있기 때문이다.

     

    Using Components with Known Vulnerabilities / 취약점이 있는 컴포넌트 사용

    컴포넌트, 라이브러리, 프레임워크 및 다른 소프트웨어 모듈이 다양하게 사용되면서 보안에 취약한 컴포넌트가 악용되면 심각한 데이터 손실, 서버 장악이 가능해진다. 때문에 사용하려는 컴포넌트, 라이브러리의 보안 취약점을 충분히 검토한 후에 사용해야 한다.

     

    Underprotected APIs / 취약한 API

    API를 통해 웹 서비스 상호 간의 연동이 이루어지므로 API 사용시 보안에 취약하지 않은지 충분한 검토가 필요하다.

    1. 외부에서 방화벽 내부로 들어오는 패킷에 대한 정책 [본문으로]
    2. 내부에서 외부로 나가는 패킷에 대한 정책 [본문으로]

    댓글