⚡ 웹 보안 공격 (이론)


📌 웹 해킹

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

굉장히 다양한 공격 기법이 존재하기 때문에 기초적인 것은 알아두는 것이 좋다고 하여 공부하기 시작했다.

⭐ SQL Injection

🔷 서버에서 실행되는 SQL을 악의적으로 이용하는 공격

  • 기존 SQL에 악의적인 SQL을 삽입한다.
  • 데이터 탈취, 삭제 등이 가능하다.

SQL Injection 사례

🔷 SQL Injection 방어

  1. SQL에서 특별한 의미를 가지는 문자(\n, \t, |, /, &, # , ...)를 이스케이프한다.
  2. 준비된 선언을 사용한다.
    • Placeholder를 담은 SQL을 먼저 DB에 보낸 후 Placeholder에 해당하는 입력 값을 DB에 보내는 방식

근데 요즘은 라이브러리나 프레임워크에서 아주 잘 막아준다고 한다.

🔷 SQL Injection 심화

  1. Error based SQL Injection
    • 일부러 SQL 에러를 발생시켜 원하는 정보를 취득하는 공격 기법
    • 쿼리문 추측, DB명, 테이블명 등을 취득할 수 있다.
  2. Blind SQL Injection
    • Query 결과의 참/거짓을 보고 원하는 정보가 존재하는지 알 수 있다.
    • DB, Table 명을 알 수 있다.
    • SQLMap이라는 자동화된 툴을 이용하기도 한다.
  3. Union SQL Injection
    • Union 명령을 이용하여 정보를 취득한다.

⭐ XSS(Cross-Site Scripting)

🔷 웹 페이지에 악성 스크립트를 삽입하는 공격

  • 사이트 이용자 정보를 탈취 할 수 있다.

XSS 사례

🔷 XSS 방어

  • HTML 필터링을 한 후 DB에 저장한다. ex) <, >, script, html, head, meta, ...

    💡 만약을 위해 프론트엔드에서도 필터링한다.

🔷 XSS 심화

  • 위의 사례는 Stored XSS이며 그 외에 Reflected XSS와 DOM Based XSS가 존재한다.
  1. Reflected XSS
    • 검색어 등을 보여주는 곳에 스크립트를 심는 공격
    • URL을 사용자에게 누르게 만들면 공격 성공
  2. DOM Based XSS
    • DOM에 악의적인 스크립트를 심는 공격
    • 브라우저가 해석하는 단계에서 발생되는 공격

⭐ CSRF Attack (Cross-Site Request Forgery Attack)

🔷 공격자가 사용자를 이용하여 웹 사이트에 요청을 보내는 공격

CSRF Attack 사례

🔷 CSRF Attack 방어

  1. Referrer Check
    • 허용한 도메인만 요청 허락하도록 설정
  2. CSRF Token
    • 모든 요청에 토큰을 발급하여 서버에서 검증
  3. CAPTCHA
    • 사람이 요청한 것이 맞는지 검증

⭐ Command Injection

🔷 애플리케이션에서 사용되는 시스템 명령에 악의적인 명령어를 삽입하는 공격 (WebShell Attack)

  • 서버 root 권한을 취득할 수 있다.

Command Injection 사례

🔷 Command Injection 방어

  1. 가급적 시스템 함수는 사용하지 않는다.
  2. 민감한 문자를 필터링한다. ex) |, &, ...

⭐ File Upload Attack

🔷 악성 스크립트 파일을 업로드하는 공격

  • 업로드 후 파일 위치를 찾아 실행시키면 공격 성공

    💡 요즘은 거의 나타나지 않는다고 한다.

File Upload Attack 사례

🔷 File Upload Attack 방어

  1. 확장자 / 파일 타입 검사
  2. 업로드 파일을 난수화하여 저장
  3. 특수 문자가 포함된 경우 업로드 금지

⭐ JavaScript Injection

🔷 Client-Side에서 JavaScript를 삽입시키는 공격

  • 크롬 console 등을 통해 조작 가능하다.
  • Client-Side에 민감한 데이터를 넣을 경우 탈취 가능

    💡 개발자 도구에서 콘솔로 유저정보를 띄워버리는 공격이라고 생각하면 된다.

🔷 JavaScript Injection 방어

  1. Client-Side엔 민감한 정보를 절대 넣지 않는다.
  2. 데이터 유효성 검사가 필요한 경우 서버와 통신한다.

    ❗ 중요한 데이터는 Client에서만 검사하면 안된다!

⭐ DDos(Distributed Denial of Service)

🔷 서버에 비정상적으로 많은 트래픽을 보내는 공격

  • 서비스가 마비되고 많은 비용이 소모된다.

    개인적으로 뉴스나 여기저기서 많이 들어본 공격 기법이다.

DDos 사례

🔷 DDos 방어

제일 단순한데 제일 막기 어렵다.

  1. 확장 가능한 서비스 구조 설계
  2. IP 필터링
  3. Rate limit
  4. 솔루션 구매

⭐ Dictionary Attack

🔷 미리 사전에 등록해놓은 문자열을 암호로 대입하는 공격

  • Brute Force의 일종

    💡 Brute Force Attack
    무차별 대입 공격, 특정한 암호를 풀기 위해 가능한 모든 값을 대입하는 것을 의미한다. 대부분의 암호화 방식은 이론적으로 무차별 대입 공격에 대해 안전하지 못하며, 충분한 시간이 존재한다면 암호화된 정보를 해독할 수 있다.

Dictionary Attack 사례

🔷 Dictionary Attack 방어

  1. 의미가 있는 문자열(apple, banana...)은 암호로 등록 못하도록 설정
  2. Account Lockout Policy
  3. 2-factor 인증

⭐ Rainbow Table

🔷 해시 함수를 이용한 평문을 모두 저장시켜 놓은 표

  • 계정 탈취 후 암호 원문을 알아내기 위해 사용

Rainbow Table 사례

🔷 Rainbow Table 방어

😭 이미 계정이 털린 후겠지만 암호라도 지켜야하지 않겠는가...

  1. Salt 사용
  2. Key Stretching
  3. PBKDF2, Bcrypt 등의 암호화 알고리즘 사용

다음에는 보안 정책들에 대해 간단하게 알아보자.

사례 제공: 프로그래머스

profile
Hodie mihi, Cras tibi

0개의 댓글