TIL#142 웹 해킹 보안

Dasom·2021년 3월 28일
0

database

목록 보기
9/15

웹 해킹

웹사이트의 취약점을 공격하는 기술적 위협으로 웹페이지를 통하여 권한이 없는 시스템에 접근하거나 데이터 유출 및 파괴와 같은 행위를 말한다.

SQL Injection

악의적인 사용자가 보안상의 취약점을 이용하여, 임의의 SQL문을 주입하고 실행되게 하여 데이터베이스가 비정상적인 동작을 하도록 조작하는 행위이다. 간단하고 적용하기 쉬운 공격이지만 성공할 경우 큰 피해를 입힐 수도 있는 공격이다.

$ SELECT * FROM users WHERE username='USERNAME' AND password='PASSWORD'
이런 SQL 구문이 있다고 가정하였을 때 악의적인 사용자가 해당 구문의 입력값에 대한 검증이 없음을 확인하고 임의로 'USERNAME' 부분에 USERNAME OR 1=1 -- 라는 SQL 구문을 주입한다. 그렇게 되면 OR 1=1 구문을 이용해 WHERE 절을 모두 참으로 만들고 -- 를 넣어줘서 뒷부분의 구문을 모두 주석처리하게 된다.
결론적으로 users 테이블의 모든 정보를 조회하게 되면서 가장 먼저 만들어진 계정에 로그인하게 된다. 보통 관리자 계정을 제일 처음 만들기 때문에 관리자 계정에 로그인할 수 있게 되고 관리자의 권한을 이용해 또 다른 2차 피해를 발생시키게 된다.

Union based SQL Injection

SQL에서 Union 은 두 개의 쿼리문에 대한 결과를 통합해서 하나의 테이블로 보여준다.
$ SELECT * FROM board WHERE title LIKE '%INPUT1%' OR contents '%INPUT2'
이런 SQL 구문의 %INPUT1 부분에 UNION SELECT null, username, password FROM users -- 라는 구문을 넣어주게 되면 두 쿼리문이 합쳐져서 하나의 테이블로 보여지게 된다. 성공하게 되면 사용자의 개인정보가 게시글과 함께 화면에 보여진다. 이 공격 역시 입력값에 대한 검증이 없을 때 발생한다.

이외에도 다양한 공격 방법이 있다.

  • Blind SQL Injection
    • 쿼리 결과의 참/거짓 정보를 보고 원하는 정보가 존재하는지 추론할 수 있다. 자동화 스크립트를 통해 단기간 내에 정보를 알아낼 수 있다.
  • Error based SQL Injection
    • 여러가지 SQL 공격 기법중 가장 많이 쓰이고 대중적인 공격 기법이다. 일부러 SQL 에러를 발생시켜서 원하는 정보를 취득하는 공격 기법이다. 에러가 발생하면 데이터베이스에 대한 정보를 단편적으로 얻을 수 있게 되기 때문에 에러메세지가 노출되지 않도록 조심해야 한다.

대응 방안

  • SQL 에서 특별한 의미를 가지는 문자를 이스케이프한다. ex) \n, \t, |, /, &, --, # 등
  • 사용자의 입력 값에 대한 검증을 한다. 블랙리스트 기반으로 검증하게 되면 수많은 차단리스트를 등록해야 하고, 하나라도 빠지면 공격에 성공하기 때문에 화이트리스트 기반으로 검증해야 한다.
  • error message 를 노출하지 않게 한다. 데이터베이스 에러가 그대로 화면에 나타난다면 테이블명이나 컬럼명 등이 노출될 수 있기 때문에 오류 발생시 사용자에게 보여줄 페이지를 제작하거나 메세지박스를 띄우도록 해야 한다.

Cross-Site Scription (XSS)

웹페이지에 악성 자바스크립트를 삽입하는 공격이다. 대부분 사용자가 글을 쓰고 읽을 수 있는 게시판에 많이 발생하지만, 사용자의 입력값을 웹페이지에 보여주는 곳에서도 발생한다.

Stored(or Persistent) XSS

해커는 XSS 취약점이 있는 곳을 파악하고 악성 스크립트를 삽입한다. 삽입된 스크립트는 데이터베이스에 저장이 되고, 저장된 악성스크립트가 있는 게시글을 열람한 사용자들은 악성스크립트가 작동하면서 쿠키를 탈취당하거나, 다른 사이트로 리다이렉션 되는 공격을 받게 된다. 한번의 공격으로 수많은 피해를 입힐 수 있다는 점이 특징이다.

Reflected XSS

사용자에게 입력 받은 값을 서버에서 되돌려 주는 곳에서 발생한다. 보통 Reflected XSS는 공격자가 악의적인 스크립트와 함께 URL을 사용자에게 누르도록 유도하고, URL을 누른 사용자는 악의적인 스크립트가 실행되면서 공격을 당한다.

DOM based XSS

악의적인 스크립트가 포함된 URL을 사용자가 요청하게 되어 브라우저를 해석하는 단계에 발생하는 공격이다. 클라이언트 쪽 코드가 원래 의도와는 다르게 실행된다. 다른 XSS 공격과는 다르게 서버측에서 탐지가 어렵다.

대응방안

  • 사용자가 입력한 값에 대한 검증과 사용자가 입력한 값을 그대로 출력할 때 검증이 필요하다. XSS Cheat Sheet에 대한 필터목록을 만들어 모든 Cheat Sheet 에 대한 대응이 가능하도록 해야 한다. 직접 테스트하여 스크립트가 실행되는지 모의해킹을 해보는 것도 좋은 방법이다.
  • Anti XSS 라이브러리를 사용하면 손쉽게 방어할 수 있다.
  • 웹 방화벽을 사용한다.

CSRF Attack

Cross-Site Request Forgery 라고 한다. 공격자가 서비스 사용자를 이용하여 요청을 보내는 공격이다.
예를 들어 네이버 로그인과 똑같은 화면을 제공하는 피싱 사이트가 있다면 사용자는 피싱사이트인 것을 모르고 아이디, 비밀번호를 입력하고 로그인을 누를 것이다. 피싱 사이트는 진짜 네이버 로그인 URL에 요청을 하고 만약 CSRF 취약점이 있다면 성공/실패 Response가 온다. 이것을 이용하여 해커는 계정정보를 저장하고 진짜 사이트로 이동시킨 후 모른척 한다면 사용자는 해킹당했다는 사실조차 모를 수 있다.
간단한 공격이지만 매우 치명적인 공격이다.

대응 방안

  • Referer Check
    • HTTP Referer를 확인하여 허용된 Referer의 요청만 허락하도록 설정하는 방법이다. HTTP 변조를 통해 쉽게 뚫을 수 있기 때문에 추천하지 않는 방법이다.
  • CSRF Token
    • 모든 요청에 토큰을 발급하여 서버에서 검증하는 방법이다. 발급된 토큰을 서버로 전달하지 않으면 요청이 허락되지 않기 때문에 효과적이다.
  • CAPTCHA
    • 사람이 요청한 것이 맞는지 검증하는 방법이지만 CSRF 공격에도 효과적이다.

Command Injection

쉘을 실행시키는 로직을 이용한 공격으로 시스템 권한이 탈취되는 것이나 마찬가지이기 때문에 매우 치명적이다.
각 언어마다 쉘 명령을 실행시키는 함수가 존재한다. 자바에는 System.runtime() 이나 Runtime.exec(), 파이썬에는 exec(), os.system() 등이 있다.
서버의 명령을 실행하는 함수는 되도록이면 사용하지 말아야 하고, 사용하더라도 서버에 영향을 끼칠 수 있는 명령어는 사용이 불가능하도록 해야 한다. 사용해야 한다면 |, &, ;, >, < 같은 문자는 필터링해야 한다.

File Upload Attack

공격 스크립트가 담긴 파일을 서버로 업로드하는 공격이다. 해커가 개발 언어에 따른 공격스크립트를 업로드하는데 성공하고 해당 파일을 브라우저로 접근할 수 있다면 Command Injection처럼 WebShell 접근이 가능해진다.

대응 방안

  • 확장자와 파일타입을 검사하여 허락된 타입만 저장한다.
  • 해커가 파일을 찾을 수 없도록 업로드 파일의 이름과 확장자를 난수화하여 저장한다.
  • 특수 문자가 포함된 경우 업로드를 막는다.
  • 서버 자체를 죽이기 위해 대용량 파일을 계속해서 보낼 수도 있기 때문에 파일 크기도 제한한다.

JavaScript Injection

브라우저에서 자바스크립트를 삽입시키는 공격이다. 브라우저에서 제공하는 Console을 통해 조작이 가능하기 때문에 만약 클라이언트 사이드에 민감한 데이터를 넣어놨다면 해당 공격을 통해 탈취가 가능하다. 또한 데이터가 아니라도 클라이언트에서 로직을 결정하는 경우 함수 변조도 가능하기 때문에 왠만하면 서버에서 결정하도록 해야 한다.

대응 방안

  • 클라이언트에는 민감한 데이터를 절대 Plain 하게 넣지 않는다.
  • 데이터 유효성 검사가 필요한 경우 서버에서 처리하도록 한다.

DDoS

Distributed Denial of Service 라고 한다. 이름 그대로 분산된 시스템을 이용하여 서버에 비정상적으로 많은 트래픽을 보내 마비시키는 공격이다. 몰래 심어놓은 좀비 PC를 이용할 수도 있고 본인이 사용할 수 있는 PC를 이용할 수도 있다. 많은 트래픽이 발생하면 서비스에 부하가 생겨 느려지거나 서버가 죽을 수 있다. 제일 단순하지만 제일 막기 힘든 공격이다.

대응 방안

  • 확장 가능한 분산 시스템을 설계한다.
  • 공격 IP를 필터링한다.
  • 서비스 지역 외의 IP를 막는다.
  • DDoS를 막아주는 전문 업체의 솔루션을 구매한다.

Dictionary Attack

미리 데이터베이스에 등록해놓은 수많은 문자열을 암호로 대입하는 공격으로 브루트 포스의 일종이다. 이 공격을 막기 위해서는 의미가 있는 간단한 단어는 비밀번호로 등록하지 못하게 막는 것이 좋다. 또한 Account Lockout Policy를 도입하여 몇 회 이상 로그인에 실패할 경우 계정을 잠그거나 OTP같은 2-factor 인증을 도입할 수 있다.

Rainbow Table

평문을 해시 함수로 만든 문자열을 모두 저장시켜 놓은 표를 말한다. 주로 계정 데이터 탈취 후에 원문을 알아내기 위해 사용한다.
인증&인가

대응 방안

  • salt
  • key-stretching
  • PBKDF2, BCrypt 등의 암호화 알고리즘 사용




참고사이트
참고사이트

profile
개발자꿈나무🌲

0개의 댓글