2) 소프트웨어 개발 보안 구현하기
- 입력 데이터 검증 및 표현
- SQL 삽입(SQL Insertion)
웹 사이트의 입력 값이나 URL에 SQL문을 삽입하여 DB로부터 정보를 열람, 조작, 파괴할 수 있는 보안 약점
-> PreparedStatements 객체를 이용하거나 MyBatis등의 프레임워크를 이용하여 SQL 구문에 입력변수가 정적 바인딩되도록 구현
-> PreparedStatements 예시
String param = request.getParameter("id");
String sql = "select name from board where id = ?"
Connection con = db.getConnection();
PreparedStatement pstmt = con.preparedStatement(sql);
pstmt.setString(1, param);
ResultSet rs = pstmt.executeQuery();
-> MyBatis 예시
<select id = "boardSearch" parameterType = "map" resultType = "BoardDto">
select * from tbl board where table like '% ||#{string}||%' order by pos asc
</seledt>
-> $을 사용할 경우 동적 바인딩 된다. 따라서 #을 이용하여 정적 바인딩되게 한다.
- 경로 조작 및 삽입
입력값 조작을 통해 보호가 필요한 내부 자원에 임의로 접근함
-> 외부 입력값을 자원의 직접적인 식별자로 사용하지 않는 것이 바람직
-> 사용할 경우 입력값이 적정한지 검증
-> 파일명을 호출하는 경우 경로 순회 특수문자를 먼저 제거 처리
String filename = request.getParameter("p");
filename = filename.replaceAll("\.\.", "").replaceAll("/", "").replaceAll("\\\", "");
fis = new FileInputStream("C:/data/" + filename);
-> replaceAll 로 경로 순회 문자 제거
- 크로스사이트 스크립트(XSS)
외부 입력값을 이용하여 웹페이지를 동적으로 구성하는 경우, 웹페이지 사용자의 권한으로 부적절한 스크립트 실행을 유도함
-> 외부 입력값을 통한 스크립트 실행이 불가능하도록 외부 입력값의 입력 경로에서 <>& 등의 특수문자를 &H; > & "로 치환
-> 출력 경로에서 정보를 HTML 인코딩 함으로써 스크립트 실행을 차단
-> 안좋은 예
<% String ID = request.getParameter("id");&>
사용자 : <%=ID%>
-> id에 <script>alert(document.cookie);</script> 와 같은 스크립트 코드가 입력되어 실행 될 수 있으며, 스크립트 내용에 따라 피해자의 쿠키 정보가 외부로 유출 될 수 있음
-> 좋은 예
서블릿에서 출력값에 HTML 인코딩
String cleanData = input.replace("<", "&H").replaceAll(">", ">");
out.println(cleanData);
JSP에서 출력값에 JSTL HTML 인코딩
<textarea name = "content">
${fn : escapeXml(data)}</textarea>
JSP에서 출력값에 JSTL Core 출력 포맷을 사용하여 텍스트로 처리
<textarea name = "content">
<C: out value = ${data}"/></textarea>
잘 만들어진 외부 XSS Filter 외부 라이브러리를 활용하여 출력값에 필터링
Xss Filter = XssFilter.getInstance("lucy-xss-superset.xml");
out.append(filter.doFilter(data));
-> 문자열 치환함수나 JSTL을 이용하여 출력 결과 값을 정적 변수 처리하면 피해자 측에서의 스크립트 코드 실행이 불가능
- 운영체제 명령어 삽입
입력값 조작을 통해 의도하지 않은 운영체제 명령어가 실행됨
-> 불가피하게 사용할 경우 명령어 목록을 미리 생성하고 외부 입력값을 통해 선택하도록 구현
- 위험한 형식 파일 업로드
Web Shell 파일등과 같은 실행 가능한 스크립트 파일을 서버로 업로드 가능하고 외부에서 웹브라우저를 통해 업로드 파일에 접근하여 실행할 수 있는 경우, 시스템의 제어권이 탈취될 수 있음
-> 허용된 확장자만 업로드를 허용하고 업로드된 파일을 저장할 때는 파일명과 확장자를 추적 불가능한 임의의 문자열로 변경
-> 저장 경로를 외부에서 직접 접근이 불가능하도록 Web Document Root 외부에 저장하여야 하며 파일이 실행되지 않도록 실행 속성 제거
-> 시스템에 대한 가용성 공격에 대응하고자 할 경우 업로드 되는 파일의 개수, 크기 제한을 추가로 구현
-> 좋은 예
String fileName = multi.getFilesystemName("filename");
if(fileName != null) {
String fileExt = FileName.substring(fileName.laastIndexOf(".")+1).toLowerCase();
if(!"gif".equals(fileExt)&&!"jpg".equals(fileExt)&&"png".equals(fileExt)){
alertMessage("업로드 불가능한 파일입니다.");
return;
}
}
Thumbnail.create(savePath+"/"+fileName.savePath+"/"+fileName, 150);
-> 업로드 파일의 확장자 검사
- 신뢰되지 않은 URL로 자동 접속 연결
-> 외부 입력값을 검증 없이 자동연결 URL주소로 사용하도록 구현된 경우, 입력값 조작을 통해 위험한 URL로 접속되어 피싱 등의 피해를 유발
-> 자동 연결할 URL 주소는 허용목록 (White List) 으로 등록
- 정수형 오버플로우
외부 입력값을 동적 메모리 할당에 사용하는 경우, 변수값이 적절한 범위내에 존재하는 값인지 확인해야함
String tmp = request.getParameter("slf_msg_param_num");
tmp = StringUtil.isNullTrim(tmp);
if(tmp.equals("0")) {
msg_str = PropertyUtil.getValue(msg_id);
} else {
try{
int param_ct = Integer.parseInt(tmp);
if(param_ct<0){
throw new Exception();
}
String strArr = new String[param_ct];
} catch(Exception e) {
msg_str = "잘못된 입력(접근)입니다.";
}
}
- 보안기능 결정에 사용되는 부적절한 입력값
인증이나 권한관리와 같은 보안 기능이 쿠키, 환경변수, 히든 필드 등 외부 입력값을 기반으로 하여 수행되는 경우 프로그램의 보안기능을 우회할 수 있는 보안 약점
-> 사용자의 세션 정보 등 중요정보는 서버에 저장
-> 보안 확인 절차 및 페이지 포워드 등 후속 처리 절차 또한 서버에서 수행
price - 1000;
quantity = request.getParameter("quantity");
total = quantity*Float.parseFloat(price);
-> 사용자로부터 입력 받을 필요없는 정보에 대해 서버 보유정보 이용 x, 외부 입력 x
- 메모리 버퍼 오버플로우
연속된 메모리 공간을 사용하는 프로그램에서 할당된 메모리 범위를 넘어선 위치에 자료를 읽거나 쓰게됨
-> 공격자가 프로그램을 통제할 수 있는 권한을 획득하게 됨
-> gets(), strcpy(), strcat() 대신 fgets(), strcpy_s(), strcat_s() 등의 함수 사용이 바람직
char buffer[5];
fgets(buffer, sizeof(buffer), stdin);
'전공 > 정보처리기사 실기' 카테고리의 다른 글
정보처리기사 실기 - 9. 프로그래밍 언어 활용(1) /기본문법/변수명명법/절차적언어 (0) | 2021.05.04 |
---|---|
정보처리기사 실기 - 8. 소프트웨어 개발 보안 구축(3) /보안기능/에러처리/모바일앱/보안테스트 (0) | 2021.05.03 |
정보처리기사 실기 - 8. 소프트웨어 개발 보안 구축(1) /보안요구사항/보안고려사항 (0) | 2021.05.02 |
정보처리기사 실기 - 7. SQL 응용(4) /프로시저/트리거 (0) | 2021.04.30 |
정보처리기사 실기 - 7. SQL 응용(3) /절차형SQL (0) | 2021.04.30 |