보안

보안 설계

hjjummy 2025. 4. 25. 01:19

- 버퍼 오버플로우공격

  • 메모리 영역(Stack, Heap)에 데이터를 저장할 때 버퍼 크기를 초과하는 입력값을 처리하여 발생

 

- 경로 조작 취약점

  • 시스템 정보 유출: 공격자가 입력값 조작으로 보호하는 자원에 임의로 접근해서 자원 수정, 삭제, 정보 누출, 자원 간 충돌로 서비스 장애 유발
  • 임의 명령 실행: 사용자가 입력값에 의해 의도하지 않은 시스템 명령어 실행 

 

대응방법

  1. 경로 문자열 필터링
fileName = fileName.replaceAll("\\.", "")
                   .replaceAll("/", "")
                   .replaceAll("\\\\", "");

    . 

  • 경로 조작 문자 (../, \, %00 등) 필터링해서 제거하고, 지정된 경로 내 파일만 접근 허가
  • 화이트리스트 기반 명령 실행
  • 서버 내부에서 쉘 명령 실행 구조 가지지 않도록 설계, 실행 시 명령어 제한

- SQL 인젝션 방어기법

  • 발생원인 : 입력값을 검증하지 않고 동적 쿼리에 직접삽입해서 사용자 입력이 쿼리의 일부로 인식이 됨

 

  • 4주차내용
  • 외부 입력값으로 부터 동적생성 sql 쿼리문 실행금지 → Prepared Statement / 바인딩 Query 사용
  • 동적으로 생성해야 하는 경우 입력값 필터링 ->검증 라이브러리 또는 ,WAF (Web Application Firewall) 등 보안 장비 활용
  • DB 연결 시 최소 권한 계정 사용: 읽기/쓰기/삭제/업데이트만 설정

 

  • 5주차 내용
    1. 블랙리스트 방식
      • SQL 예약어 ,함수명, 세미콜론, 주석 등 특수문자들 블랙리스트로 정의
      • 외부 입력값에 블랙리스트 키워드가 존재할 경우 공백으로 치환
      • 정교하게 치환해야함 SSELECTLECT 일경우 다시 합쳐져서 키워드 완성됨
    2. 화이트 리스트 방식
      • 허용된 문자 제외하고 모두 허용X 블랙리스트보다 보안성 우수
      • 정규식 이용해 패턴화 방식 사용. 번거로움.
    3. Prepared statement 사용
      • 쿼리와 사용자 입력 명확히 분리
      • 쿼리문이 컴파일 된 후 사용자 입력을 바인딩함. 바인딩 시 특수문자 자동 필터링됨
String prepareSQL = "SELECT * FROM USERS WHERE name = ? AND password = ?";
PreparedStatement ps = conn.prepareStatement(prepareSQL);
ps.setString(1, loginName);
ps.setString(2, loginPassword);
ResultSet rs = ps.executeQuery();

- xxs

  • 사용자pc에서 스크립트 실행 -> 정보탈취목적

 

  • 반사형 -> 서버에 스크립트X , 특정인, 피싱메일 
  • 저장형 -> 서버에 스크립트o, 다수/임의 대상, 방명
  • DOM 기반 : 클라이언트 측 자바스크립트가 URL에서 값을 읽어 직접 삽입하여 실행

 

대응방법

  1. 입력값에 대해 스크립트 공격 가능성 존재하는 문자열 치환
  2. JSTL escapeXml="true" 사용

- csrf

  • 서버에서 스크립트 실행 -> 세션을 악용하여  특정 의도 수행 

- 정수형 오버플로우

  • 정수 자료형이 표현할 수 있는 최댓값/최솟값을 초과

🔸  버퍼 오버플로우(Buffer Overflow)

🔹정의

버퍼 오버플로우는 할당된 메모리 영역(스택, 힙 등)을 초과하여 데이터를 저장함으로써, 메모리 상의 중요한 값을 덮어쓰는 취약점

특히 C/C++과 같은 언에서 자주 발생.

🔹공격 시나리오 

char* buffer = malloc(256);
strcpy(buffer, user_input);  // 크기 제한 없음 → BOF 발생

사용자가 너무 긴 문자열을 입력하면 return address 등 중요한 정보가 덮여 공격자 코드로 흐름 전환 가능

🔹피해

  • 악성코드 실행
  • 시스템 제어 권한 탈취
  • 서비스 거부(DoS)

🔹대응 방안 (설계 시 고려사항)

  • 메모리 접근 요청이 허용 범위를 벗어났는지 검증 = 메모리 경계검사 수
  • 취약한 API(strcpy 등) 사용 금지 → strncpy 등 안전한 함수 사용
  • 운영체제 방어기법 활용 : ASLR (주소 공간 배치 무작위화) , StackGuard, DEP (데이터 실행 방지)

🔸SQL 인젝션 방어 기법

🔹정의

외부 입력값을 검증하지 않고 SQL 쿼리에 삽입하면, 공격자가 쿼리 구조를 조작해 데이터를 탈취, 조작하는 공격

🔹공격 시나리오

입력값: ' OR '1'='1' --
SQL문: SELECT * FROM users WHERE id = '' OR '1'='1';

인증 우회, DB 삭제 등 가능

🔹피해

  • 인증 우회
  • 데이터 유출/변조
  • 시스템 파괴

🔹방어 기법

  • 외부 입력값으로 부터 동적생성 sql 쿼리문 실행금지 → Prepared Statement / 바인딩 Query 사용
  • 동적으로 생성해야 하는 경우 입력값 필터링 ->검증 라이브러리 또는 ,WAF (Web Application Firewall) 등 보안 장비 활용
  • DB 연결 시 최소 권한 계정 사용: 읽기/쓰기/삭제/업데이트만 설정

🔸경로 조작 취약점(Path Traversal)

🔹정의

입력값을 통해 ../ 등의 경로 조작 문자열을 포함시켜, 허가되지 않은 파일 접근/수정/삭제 등을 유도하는 취약점.

🔹공격 예시

 
https://site.com/loadImage?filename=../../../etc/passwd

🔹피해

  • 중요 파일 노출
  • 시스템 정보 유출
  • 악성 코드 실행

🔹방어 기법

  • 경로 조작 문자 (../, \, %00 등) 필터링해서 제거하고, 지정된 경로 내 파일만 접근 허가
  • 화이트리스트 기반 명령 실행
  • 서버 내부에서 쉘 명령 실행 구조 가지지 않도록 설계, 실행 시 명령어 제한

🔸XSS (Cross Site Scripting) 

🔹정의

사용자 입력값에 악성 스크립트를 삽입하여 브라우저(응답 페이지)에서 사용자 권한으로 실행되도록 유도하여 사용자 정보 탈취, 세션 가로채기 등 공격 => 사용자  pc에서 스크립트 실행

🔹유형

  • 반사형(Reflective) -> 웹서버에 스크립트 x, 특성 사용자 대상
    • 악성링크 있는 피싱메일 전송 → URL에 악성 스크립트 삽입 →사용자가 클릭하여 악성스크립트 삽입된 요청을 서버에 전송 → 서버가 그대로 반영 → 브라우저에서 실행
http://site.com/page?msg=<script>alert('x')</script>

 

  • 저장형(Stored) -> 웹서버에 스크립트 o
    • 게시판이나 방명록 등 DB에 저장 → 다른 사용자가 접근 시 스크립트 실행

🔹피해

  • 쿠키 탈취, 세션 하이재킹
  • 악성코드 다운로드
  • 내부 요청 위조

🔹방어 기법

  • 입력값 → 필터링(XSS 필터 적용)
  • 출력값 → HTML 인코딩 적용 (< → &lt;)

🔸CSRF (Cross Site Request Forgery)

🔹정의

공격자가 피해자의 인증 세션을 이용해 의도하지 않은 요청을 대신 실행시키는 공격

🔹공격 예시

<iframe src="http://site.com/changePw?newPw=1234"></iframe>

피해자가 로그인 상태에서 위 페이지 방문 → 비밀번호가 공격자가 원하는 값으로 변경됨

🔹피해

  • 비밀번호 변경
  • 결제 요청
  • 계정 삭제 등

 

🔹방어 기법

  • CSRF 토큰 사용: 세션별 난수 생성, 요청 시마다 검증
  • Referer, Origin 헤더 확인
  • 민감 기능은 POST 메서드 사용 + CAPTCHA 적용

🔸정수형 오버플로우(Integer Overflow)

🔹정의

정수 자료형의 최대값을 초과하면 오버플로우가 발생하며, 결과적으로 음수나 예상치 못한 값이 저장됨.

🔹공격 예시

char num1 = 128;         // 결과: -128
unsigned char num2 = 256; // 결과: 0

메모리 크기, 루프 범위, 검증 로직 등이 의도와 다르게 동작함

 

🔹피해

  • 메모리 접근 범위 우회
  • 루프 무한 실행
  • 시스템 다운

🔹대응 방안

  • 자료형 선택 주의 (적절한 크기)
  • 입력값 범위 체크 필수
  • 정수 변환 시 명시적 타입 검사 수행

🔸정리 요약표

항목 정의 공격예시 대응방안
버퍼 오버플로우 메모리 경계 초과 strcpy(buffer, input) 안전 API, ASLR, StackGuard
SQL 인젝션 SQL 쿼리 구조 조작 ' OR '1'='1 PreparedStatement, 필터링
XSS 스크립트 삽입 후 실행 <script> 인코딩, XSS 필터
CSRF 인증 사용자 권한 도용 <iframe> 토큰 사용, Referer 확인
정수 오버플로우 최대값 초과 → 음수 char x = 128; 범위검사, 안전형변환
경로 조작 경로 문자열 조작 ../../../etc/passwd 필터링, 화이트리스트

 

 

개념 비교


구분 버퍼 오버플로우 (Buffer Overflow) 정수형 오버플로우 (Integer Overflow)
정의 메모리 버퍼의 경계를 넘는 데이터 접근 또는 저장 정수 자료형이 표현할 수 있는 최댓값/최솟값을 초과
발생 위치 메모리(버퍼) – 스택 또는 힙 영역 변수 내부 – 정수형 레지스터, 메모리 변수
주요 원인 안전하지 않은 함수(strcpy 등) 또는 입력값 검증 누락 작은 크기의 자료형에 큰 수를 저장할 때 (예: char x = 128)
공격 결과 리턴 주소 조작, 악성코드 실행 등 제어권 탈취 루프 조건 변조, 메모리 크기 계산 실패 등 로직 오류

 

버퍼 오버 플로우: 사용자가 너무 긴 패스워드를 입력 → 스택에 저장된 리턴 주소 덮어씀 → 공격자가 만든 쉘코드 실행

정수형 오버 플로우 : 쇼핑몰 수량 입력 unsigned char = 255, +1 입력 시 0으로 순환 → 무료 결제 발생