보안 설계
- 버퍼 오버플로우공격
- 메모리 영역(Stack, Heap)에 데이터를 저장할 때 버퍼 크기를 초과하는 입력값을 처리하여 발생
- 경로 조작 취약점
- 시스템 정보 유출: 공격자가 입력값 조작으로 보호하는 자원에 임의로 접근해서 자원 수정, 삭제, 정보 누출, 자원 간 충돌로 서비스 장애 유발
- 임의 명령 실행: 사용자가 입력값에 의해 의도하지 않은 시스템 명령어 실행
대응방법
- 경로 문자열 필터링
fileName = fileName.replaceAll("\\.", "")
.replaceAll("/", "")
.replaceAll("\\\\", "");
.
- 경로 조작 문자 (../, \, %00 등) 필터링해서 제거하고, 지정된 경로 내 파일만 접근 허가
- 화이트리스트 기반 명령 실행
- 서버 내부에서 쉘 명령 실행 구조 가지지 않도록 설계, 실행 시 명령어 제한
- SQL 인젝션 방어기법
- 발생원인 : 입력값을 검증하지 않고 동적 쿼리에 직접삽입해서 사용자 입력이 쿼리의 일부로 인식이 됨
- 4주차내용
- 외부 입력값으로 부터 동적생성 sql 쿼리문 실행금지 → Prepared Statement / 바인딩 Query 사용
- 동적으로 생성해야 하는 경우 입력값 필터링 ->검증 라이브러리 또는 ,WAF (Web Application Firewall) 등 보안 장비 활용
- DB 연결 시 최소 권한 계정 사용: 읽기/쓰기/삭제/업데이트만 설정
- 5주차 내용
- 블랙리스트 방식
- SQL 예약어 ,함수명, 세미콜론, 주석 등 특수문자들 블랙리스트로 정의
- 외부 입력값에 블랙리스트 키워드가 존재할 경우 공백으로 치환
- 정교하게 치환해야함 SSELECTLECT 일경우 다시 합쳐져서 키워드 완성됨
- 화이트 리스트 방식
- 허용된 문자 제외하고 모두 허용X 블랙리스트보다 보안성 우수
- 정규식 이용해 패턴화 방식 사용. 번거로움.
- 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에서 값을 읽어 직접 삽입하여 실행
대응방법
- 입력값에 대해 스크립트 공격 가능성 존재하는 문자열 치환
- 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 인코딩 적용 (< → <)
🔸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으로 순환 → 무료 결제 발생