자격/SW보안약점진단원
구현단계 보안약점 제거 기준-크로스사이트 요청 위조
Ignatius Heo
2023. 7. 4. 05:09
작성일: 230704
※ 본 게시글은 학습 목적으로 행정안전부·KISA의 소프트웨어 보안약점 진단 가이드, 소프트웨어 개발보안 가이드를 참고하여 작성하였습니다.
정리 내용: 소프트웨어 보안약점 진단 가이드(272~275p)
구분 | - 입력데이터 검증 및 표현 |
설계단계 | - 웹 기반 중요 기능 수행 요청 유효성 검증 https://cryptocurrencyclub.tistory.com/94 |
개요 | 특정 웹사이트에 대해서 사용자가 인지하지 못한 상황에서 사용자의 의도와는 무관하게 공격자가 의도한 행위(수정, 삭제, 등록 등)를 요청하게 하는 공격을 말한다. 웹 응용프로그램이 사용자로부터 받은 요청에 대해서 사용자가 의도한 대로 작성되고 전송된 것인지 확인하지 않는 경우 발생 가능하고 특히 해당 사용자가 관리자인 경우 사용자 권한관리, 게시물 삭제, 사용자 등록 등 관리자 권한으로만 수행 가능한 기능을 공격자의 의도대로 실행시킬 수 있게 된다. 공격자는 사용자가 인증한 세션이 특정 동작을 수행하여도 계속 유지되어 정상적인 요청과 비정상적인 요청을 구분하지 못하는 점을 악용한다. 웹 응용프로그램에 요청을 전달할 경우, 해당 요청의 적법성을 입증하기 위하여 전달되는 값이 고정되어 있고 이러한 자료가 GET 방식으로 전달된다면 공격자가 이를 쉽게 알아내어 원하는 요청을 보냄으로써 위험한 작업을 요청할 수 있게 된다. |
진단 세부사항 (설계단계) |
① 시스템으로 전송되는 모든 요청에 대해 정상적인 사용자의 유효한 요청인지, 아닌지 판별할 수 있도록 확인하는 절차가 있는지 확인한다. ㅇ 데이터 처리 요청(request)에 대한 정상적인 절차에 따른 요청인지를 검증하는 기능의 설계 여부 확인 → CSRF 토큰 사용 → CAPTCHA 이용 ㅇ 요청 유효성 점검 기능이 안전하게 적용되도록 설계되어 있는지 확인 → 모든 데이터 처리 요청에 적용 → 각 데이터를 처리하는 기능에서 적용 ㅇ 주요 기능에 대해 재인증/재인가 처리 방법과 모듈 설계 여부 확인 ㅇ 데이터 처리를 요청하는 주요기능이 자동화된 스크립트나 프로그램을 이용한 자동 요청을 식별하여 요청이 차단되는지를 점검할 수 있는 테스트 계획의 수립 여부 확인 |
보안대책 (구현단계) |
입력화면 폼 작성시 GET 방식보다는 POST 방식을 사용하고 입력화면 폼과 해당 입력을 처리하는 프로그램 사이에 토큰을 사용하여, 공격자의 직접적인 URL 사용이 동작하지 않도록 처리한다. 특히 중요한 기능에 대해서는 사용자 세션검증과 더불어 재인증을 유도한다. |
진단방법 (구현단계) |
① 사용자 권한변경, 신규정보 등록 등 주요 기능을 확인하고, ② 해당 기능 수행시 권한확인 절차 존재 여부 확인한다. 권한확인 절차가 없거나 권한 확인 방법이 세션쿠키, 사용자 IP, SSL 인증과 같이 자동 제출되는 자격증명에 의존하는 경우 취약하다. |
다. 코드예제
ㅇ 안전
// 입력화면이 요청되었을 때, 임의의 토큰을 생성한 후 세션에 저장한다.
1:session.setAttribute("SESSION_CSRF_TOKEN", UUID.randomUUID().toString());
// 입력화면에 임의의 토큰을 HIDDEN 필드항목의 값으로 설정해 서버로 전달되도록 한다.
2:<input type="hidden" name="param_csrf_token" value="${SESSION_CSRF_TOKEN}" />
// 요청 파라미터와 세션에 저장된 토큰을 비교해서 일치하는 경우에만 요청을 처리한다.
3:String pToken = request.getParameter("param_csrf_token");
4:String sToken = (String)session.getAttribute("SESSION_CSRF_TOKEN");
5:if (pToken != null && pToken.equals(sToken) {
// 일치하는 토큰이 존재하는 경우 -> 정상 처리
6: ......
7:} else {
// 토큰이 없거나 값이 일치하지 않는 경우 -> 오류 메시지 출력
8: ......
9:}
ㅇ 내용
1. CSRF 토큰 생성 후 hidden 필드에 삽입하여 사용자가 중요기능 실행 요청 시 토큰값 비교 후 사용자가 맞다면 기능을 실행하는 걸로 보임.
ㅇ 안전
1: @using (Html.BeginForm("PostTest","Home",FormMethod.Post,null))
2: {
3: //AntiForgeryToken()을 이용해 크로스사이트 요청 위조를 방지
4: @Html.AntiForgeryToken()
5: <input type="submit" value="Html PsBk Click" />
6: }
끝.