Notice
Recent Posts
Recent Comments
Link
IgnatiusHeo
구현단계 보안약점 제거 기준-HTTP 응답분할 본문
작성일: 230704
※ 본 게시글은 학습 목적으로 행정안전부·KISA의 소프트웨어 보안약점 진단 가이드, 소프트웨어 개발보안 가이드를 참고하여 작성하였습니다.
정리 내용: 소프트웨어 보안약점 진단 가이드(284~289p)
구분 | - 입력데이터 검증 및 표현 |
설계단계 | - HTTP 프로토콜 유효성 검증 https://cryptocurrencyclub.tistory.com/95 |
개요 | HTTP 요청에 들어 있는 파라미터(Parameter)가 HTTP 응답헤더에 포함되어 사용자에게 다시 전달될 때, 입력값에 CR(Carriage Return)이나 LF(Line Feed)와 같은 개행문자가 존재하면 HTTP응답이 2개 이상으로 분리될 수 있다. 이 경우 공격자는 개행문자를 이용하여 첫 번째 응답을 종료시키고, 두 번째 응답에 악의적인 코드를 주입하여 XSS 및 캐시 훼손(Cache Poisoning) 공격 등을 수행 할 수 있다. |
진단 세부사항 (설계단계) |
① 외부입력값을 쿠키 및 HTTP 헤더정보로 사용하는 경우, HTTP 응답분할 취약점을 가지지 않도록 필터링해서 사용해야 한다. 외부 입력값이 쿠키 또는 HTTP 헤더에 포함되는 경우, 사용자 입력값을 필터링하도록 설계하고 있는지 확인한다. ㅇ 응답헤더에 값을 쓰는 기능이 식별되고, 입력값에 포함된 개행문자를 필터링 하는 기능이 설계되어 있는지 확인 → 함수 예: setHeader, addCookie, sendRedirect 등 → 개행문자: CR(\r) LF(\n) ㅇ 개행문자에 대한 필터링 적용방법에 따라 안전하게 적용되었는지 확인 → 필터컴포넌트를 이용하여 공통적용하는 경우: 입력값이 헤더에 포함되는 모든 기능에 안전하게 적용되었는지 확인 → 각 기능에서 필터기능을 사용하는 경우: 코딩규칙을 개발 가이드에 적용하고 있는지 확인 ㅇ 응답분할이 발생 가능한 입력값을 사용하여 응답분할이 발생되는지 점검할 수 있는 테스트 계획 수립 여부 확인 → 입력값 예: CR(\r) LF(\n) ② 외부입력값이 페이지 이동(리다이렉트, 포워드)을 위한 URL로 사용되어야 하는 경우, 해당값은 시스템에서 허용된 URL 목록의 선택자로 사용되도록 해야 하며, 페이지가 이동할 URL을 사전에 정의하는지 확인한다. ㅇ 시스템에서 이동이 허용된 도메인이나 주소 목록의 정의 여부 확인 ㅇ 페이지 이동 기능 설계에, 미리 정의한 허용 목록을 이용한 입력값을 검증하는 방법과 모듈의 설계 여부 확인 ㅇ 외부 입력값을 조작하여 의도된 페이지로 리다이렉트 되는지 점검할 수 있는 테스트 계획의 수립 여부 확인 → 테스트 값 예: 임의 URL 주소 |
보안대책 (구현단계) |
요청 파라미터의 값을 HTTP응답헤더(예를 들어, Set-Cookie 등)에 포함시킬 경우 CR, LF와 같은 개행문자를 제거한다. |
진단방법 (구현단계) |
① Response 헤더에 변수가 사용되는 것을 확인하고, ② 변수가 외부 입력값인지 확인한 후, 개행문자(\r, \n) 제거를 위한 필터링 또는 검증절차가 있는지 확인한다. 외부 입력값에 대한 필터링 절차가 없다면 취약하다. |
다. 코드예제
ㅇ 분석
//외부로부터 입력받은 값을 검증 없이 사용할 경우 안전하지 않다.
1: String lastLogin = request.getParameter("last_login");
2: if (lastLogin == null || "".equals(lastLogin)) {
3: return;
4: }
// 쿠키는 Set-Cookie 응답헤더로 전달되므로 개행문자열 포함 여부 검증이 필요
5: Cookie c = new Cookie("LASTLOGIN", lastLogin);
6: c.setMaxAge(1000);
7: c.setSecure(true);
8: response.addCookie(c);
9: response.setContentType("text/html");
ㅇ 내용
1. lastLogin값에 대한 입력값 검증 없이 쿠키에 삽입함.
ㅇ 수정
1: String lastLogin = request.getParameter("last_login");
2: if (lastLogin == null || "".equals(lastLogin)) {
3: return;
4: }
// 외부 입력값에서 개행문자(\r\n)를 제거한 후 쿠키의 값으로 설정
5: lastLogin = lastLogin.replaceAll("[\\r\\n]", "");
6: Cookie c = new Cookie("LASTLOGIN", lastLogin);
7: c.setMaxAge(1000);
8: c.setSecure(true);
9: response.addCookie(c);
ㅇ 내용
1. 개행문자 제거 후 쿠키값에 삽입함. 근데 setSecure만 해도 안전한가?
ㅇ 분석
//외부 입력값을 검증 없이 사용하는 것은 안전하지 않다.
1: string usrInput = Request.QueryString["ID"];
2: Response.AddHeader("foo", "bar" + usrInput);
ㅇ 내용
1. usrInput 미검증 후 헤더에 삽입 (응답 분리 가능성 있음)
ㅇ 수정
1:string usrInput = Request.QueryString["ID"];
//개행문자를 제거 한 이후에 사용해야 합니다.
2:string validatedInput = usrInput.Replace("\n", "").Replace("\r","");
3:Response.AddHeader("foo", "bar" + validatedInput);
ㅇ 내용
끝.
'자격 > SW보안약점진단원' 카테고리의 다른 글
구현단계 보안약점 제거 기준-보안기능 결정에 사용되는 부적절한 입력값 (0) | 2023.07.04 |
---|---|
구현단계 보안약점 제거 기준-정수형 오버플로우 (0) | 2023.07.04 |
구현단계 보안약점 제거 기준-서버사이드 요청 위조 (0) | 2023.07.04 |
구현단계 보안약점 제거 기준-크로스사이트 요청 위조 (0) | 2023.07.04 |
구현단계 보안약점 제거 기준-LDAP 삽입 (0) | 2023.07.04 |