슈개's IT/SW개발보안

[SW개발보안] 개발보안 기타 정리 내역1

슈개 2021. 1. 23. 10:16
반응형

[SW개발보안] 개발보안 기타 정리 내역1

 

 

 

암호 알고리즘 및 키 길이 이용 안내서(2018.12)

https://seed.kisa.or.kr/kisa/Board/38/detailView.do


 

사용자 하드디스크에 저장된 쿠키를 통한 정보 노출

쿠키의 지속시간, 유효기간을 필요 이상으로 길게 설정했을 때 발생

길게 설정되면 파일 형태로 저장

 

저장소(storage)

https://www.w3schools.com/html/html5_webstorage.asp

  • session storage

  • local storage 

 

Input Autocomplete

https://www.w3schools.com/tags/att_input_autocomplete.asp

 

명시적 예외 v 런타임 예외

명시적 예외 = 구문 오류 => 컴파일이 불가

String code = null;

if (code.equals("abc")) { … } ⇐ 널포인트역참조

 

런타임 예외 = 실행 시점에 결정되는 값으로 인해 발생하는 오류

String code = request.getParameter("code");

if (code.equals("abc")) { … } ⇐ 실행 시 request.getParameter("code") 널을 

                                  반환하면 널 포인트 역참조가 발생

 

세션ID

  • 세션ID 고정 ⇒ 인증 전과 인증 후에 동일한 세션 ID를 사용(유지) ⇒ 방어를 위해서는 인증 전후 세션 ID를 다르게 설정(부여)

  • 세션ID 훔치기 ⇒ 스니핑, XSS 와 같은 공격을 이용해서 세션ID를 탈취 ⇒ HTTPS와 같은 보안 통신, XSS 방어 등을 통해서 공격을 완화

  • 세션ID 추측 ⇒ 세션ID 생성 규칙이 단순하여 추측이 가능한 경우 ⇒ 세션ID 생성 규칙을 알 수 없도록 한다. = 서버가 제공하는 세션ID를 사용한다. 

 

잘못된 세션에 의한 데이터 정보노출

@Controller

@RequestMapping("/board")

public class BoardController {

 

@Resource(name = "boardService")

private BoardService service;

 

private int currentPage = 1;  ⇐ Controller에 멤버 변수를 정의

private int showArticleLimit = 10; 

private int showPageLimit = 10; 

private int startArticleNum = 0;

private int endArticleNum = 0;

private int totalNum = 0;

 

@RequestMapping("/list.do")

public ModelAndView boardList(HttpServletRequest request, HttpServletResponse response) {

 

String type = null;

String keyword = null;

 

if (request.getParameter("page") == null || 

                request.getParameter("page").trim().isEmpty() ||

    request.getParameter("page").equals("0")) {

currentPage = 1;

} else {

currentPage = Integer.parseInt(request.getParameter("page"));

}

:


 

JSP ----> Java ----> class 

 

선언부     ⇒ <%!   String name;    %> ⇒ 멤버변수로 선언

스크립틀릿 ⇒ <%    String name;    %> ⇒ _jspService() 메서드의 지역변수로 선언


 

설계 문서 리뷰

 

 

다운로드 시 파일의 위변조를 검증할 수 있도록 업로드 시 해쉬값을 저장하는 컬럼을 추가

 

Blacklist 방식 → Whitelist 방식으로 PNG, JPG, GIF 확장자만 업로드 가능하도록 제한


 

 

제시하고 있는 안전한 함수의 예가 잘못되었음

Bannded Function에 안전하지 않은 함수로 분류된 것들임

 

 

 

솔트 값은 암호화해서 별도 공간에 저장

 

svn과 같은 형상 관리 서버를 통해서 관리하는 것은 잘못된 방식

 

 

다운로드 기능을 JSP 코드로 구현

 

<%@page language="java" pageEncoding="UTF-8"%><%@page import="java.io.*"%><%

String fileName = request.getParameter("P");

     // #1 #2에서 널 포인터 역참조가 발생하는 것을 방어

if (fileName==null || "".equals(fileName)) fileName = "dummy.txt";

BufferedInputStream bis = null;

BufferedOutputStream bos = null;

FileInputStream fis = null;

try {

     // #2 (#3에서 fileName 응답헤더의 값으로 설정) 

     // HTTP 응답분할이 발행하는 것을 방어

     fileName = fileName.replaceAll("\\n", "").replaceAll("\\r", "");

     // #3  

     response.setHeader("Content-Disposition", attachment;filename="+fileName+";");

  :

     byte[] buffer = new byte[1024];

     // #4 fileName이 파일의 식별자로 사용

     // 경로조작 문자열 포함 여부를 확인하지 않고 사용 ⇒ 경로조작 및 자원삽입 발생

     fis = new FileInputStream("C:/datas/" + fileName);

     bis = new BufferedInputStream(fis);

     bos = new BufferedOutputStream(response.getOutputStream());

     int read;

     while((read = bis.read(buffer, 0, 1024)) != -1) {

         bos.write(buffer,0,read);

     }

}

catch(Exception e) { ... } ⇐ 예외처리가 잘못될 수 있고

finally { ... } ⇐ 자원해제가 잘못될 수 있음

%>



경로조작 및 자원삽입

 

정규식 특수문자

https://developer.mozilla.org/ko/docs/Web/JavaScript/Guide/%EC%A0%95%EA%B7%9C%EC%8B%9D

\s ⇒ 스페이스, 탭, 폼피드, 줄 바꿈 문자등을 포함한 하나의 공백 문자에 대응됩니다. 

\w ⇒ 밑줄 문자를 포함한 영숫자 문자에 대응됩니다. [A-Za-z0-9_] 와 동일합니다



크로스 사이트 요청 위조 방어 대책 (POST 방식 사용)

<form method="GET" … >

:

:

</form>



%1$te

~~ 

첫번째 파라미터를 날짜시간형식으로 처리

 

e ⇒ 일자

Y ⇒ 년도

m ⇒ 월



2020-04-03 did not matched … 14rd of some month

 

2020-04-03____%1$tY-%1$tm-%1$te____ 

2020-04-03____2018-10-14____ did not matched … 14rd of some month

              ~~~~~~~~~~ ⇐ 코드 내부에서 가지고 있는 값이 입력된 포맷 문자열을 

                            이용해서 노출

 

반응형