🎓 정보처리기사

[정보처리기사 - 실기] IX. 소프트웨어 개발 보안 구축 - 소프트웨어 개발 보안 구현

exception_log 2020. 11. 23. 20:57

SW 개발 보안 구현 ⭐⭐⭐

시큐어 코딩 가이드

설계 및 구현 단계에서 해킹 등의 공격을 유발할 가능성이 있는 잠재적인 보안 취약점을 사전에 제거하고 외부 공격으로부터 안전한 소프트웨어를 개발하는 기법

시큐어 코딩 가이드 적용 대상 (입보시 에코캡아)

시큐어 코딩 가이드 적용 대상

입력데이터 검증 및 표현

입력데이터 검증 및 표현

SQL 삽입 공격

- 웹 애플리케이션에서 입력데이터에 대한 유효성 검증을 하지 않을 경우 공격자가 입력 창 및 URL에 SQL 문을 삽입하여 DB로부터 정보를 열람, 조작할 수 있는 취약점 공격 기법

- 매개변수를 받는 PreparedStatement 객체를 상수 문자열로 생성하고 파라미터 부분을 setString 등의 메소드로 설정하여 외부의 입력이 쿼리문의 구조를 바꾸는 것 방지

1. 조치 전
String category = request.getParameter("category");
...
// 1) 외부로부터 입력받은 값을 검증 없이 사용할 경우 안전하지 않음
String sql = "SELECT * FROM board WHERE b_category=" + category + "";

Connection con = db.getConnection();

// 2) 외부로부터 입력받은 값이 처리 없이 쿼리로 수행되어 안전하지 않음
Statement stmt = con.createStatement();
Resultset rs = stmt.executeQuery(sql); 

2. 조치 후
String category = request.getParameter("category");
...
// 1) 외부로부터 입력 받은 값은 안전하지 않을 수 있어 
// PreparedStatement 사용을 위해 ? 문자로 바인딩 변수 사용
String sql = "SELEXT * FROM board WHERE b_category = ?";

Connection con = db.getConnection(); 

// 2) PreparedStatement 사용
PreparedStatement = con.preparedStatement(sql);

// 3) PreparedStatement 객체를 상수 문자열로 생성하고 파라미터 부분을 setString으로 설정하여 안전
pstmt.setString(1, category); 
Resultset rs = pstmt.executeQuery();

XSS (크로스 사이트 스크립트) 공격

웹페이지에 악의적인 스크립트를 포함해 사용자 측에서 실행되게 유도할 수 있는 공격기법

1. 조치 전
// 1) 외부 입력값을 검증 없이 화면에 출력하면 공격 스크립트가 포함된 URL을 생성할 수 있어 안전 X
<% String keyword = request.getParameter("keyword"); &>
검색결과 : ${m.content}
<script type="text/javascript">
	//2) 서버를 거치지 않는 공격스크립트가 포함된 URL을 생성할 수 있어 안전하지 않음
	document.write("keyword : " + <%=keyword%>);
</script>

2. 조치 후
// 1) 입력값에 대하여 스크립트 공격 가능성이 있는 문자열 치환 (중요)
<% String keyword = request.getParameter("keyword"); %>
keyword = keyword.replaceAll("&", "&amp;");
keyword = keyword.replaceAll("<", "&lt;");
keyword = keyword.replaceAll(">", "&gt;");
...
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
...
// 2) JSP에서 출력값에 JSTL의 <c:out>을 사용하여 처리
검색 결과 <c:out value="${m.content}"/>
<script type = "text/javascript">
	document.write("keyword:" <%=Encoder.encodeForJS(Encoder.encodeForHTML(keyword))%>);
</script>

취약한 패스워드 허용 보안 약점

숫자/영문 등 혼합 시 최소 10자 이상 요구

숫자/영문/특수문자 등 혼합 시 최소 8자 이상 요구

변경 주기 설정 (최소 6개월)

암호화 보안 약점 유형

암호화 보안 약점 유형

시간 및 상태

동시 수행을 지원하는 병렬 시스템이나 하나 이상의 프로세스가 동작하는 환경에서 시간 및 상태를 부적절하게 관리하여 발생할 수 있는 취약점

1. 조치 전
public void run() { ... }

2. 조치 후
public void run() { synchronized(SYNC) { ... } }

코드 오류

코드 오류

 

반응형