Clean & Blue 자세히보기

전공/정보처리기사 실기

정보처리기사 실기 - 8. 소프트웨어 개발 보안 구축(2) /입력데이터검증

_청렴 2021. 5. 3. 12:01
반응형

NCS 정보처리기사

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; &gt; &amp; &quot;로 치환

-> 출력 경로에서 정보를 HTML 인코딩 함으로써 스크립트 실행을 차단

 

-> 안좋은 예

<% String ID = request.getParameter("id");&>
사용자 : <%=ID%>

 -> id에 <script>alert(document.cookie);</script> 와 같은 스크립트 코드가 입력되어 실행 될 수 있으며, 스크립트 내용에 따라 피해자의 쿠키 정보가 외부로 유출 될 수 있음

 

-> 좋은 예

서블릿에서 출력값에 HTML 인코딩

String cleanData = input.replace("<", "&H").replaceAll(">", "&gt");
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);

 

 

정보처리기사 실기 - 8. 소프트웨어 개발 보안 구축(3) /보안기능/에러처리/모바일앱/보안테스트

- 보안기능 - 인증 및 비밀번호 관련 보안 약점 적절한 인증 없는 중요 기능 허용 반복된 인증 시도 제한 기능 부제 취약한 비밀번호 허용 - 권한 관리 관련 보안 약점 부적절한 인가 중요한 자원

aapslie94.tistory.com