콘텐츠로 이동

PV: 13. 프로세스 검증 누락

분류: Web Application(웹)

중요도: 상


개요

점검 내용

서비스 제공에 필요한 사용자 입력 및 실행단계의 흐름에 대한 검증의 적절성 여부 점검

점검 목적

서버 사이드에서 적절한 검증을 통해 비정상적인 입력 및 프로세스 흐름으로 허용되지 않은 웹 애플리케이션 내 발생할 수 있는 논리적 오류를 차단하기 위함

보안 위협

웹 애플리케이션 내 프로세스 또는 기능에 대한 접근 제어 및 검증이 미흡할 경우, 비정상적인 논리 오류를 유발하여, 중요 페이지에 대한 URL 직접 접근, 가격 변조 등의 다양한 행위가 가능하며 서비스 제공에 불이익이 발생할 수 있음

참고

소스코드 및 취약점 점검 필요

점검 대상 및 판단 기준

대상

웹 애플리케이션 소스코드

판단 기준

✅ 양호: 프로세스에 대한 검증이 존재하며, 악의적인 행위(URL 직접 접근, Javascript 로직 변조 등)를 통하여 논리 오류가 발생하지 않는 경우

❌ 취약: 프로세스에 대한 검증이 미흡하여, 논리 오류를 통한 의도된 기능이 왜곡되거나 보안 취약점이 노출되는 경우

조치 방법

프로세스 검증이 필요한 경우 각 프로세스에 대한 체크 로직 구현

조치 시 영향

일반적인 경우 영향 없음

점검 및 조치 사례

점검 방법

Step 1) 웹 사이트 내 기능들의 권한 종류 및 프로세스의 흐름을 파악하고 각 프로세스의 통제를 우회 및 악용 가능성 여부 점검(권한 상승, 민감 정보 획득, 가격 변조 등)

[ 내부 페이지 URL 직접 접근 시도 ]

비 로그인 상태로 URL 직접 접근을 통해 내부 사용자 관리 페이지로 접근할 수 있는지 확인하는 예시

[ 프록시 도구를 이용한 가격 변조 시도 ]

가격 정보에 대한 검증이 미흡하여, 파라미터 변조를 통해 변조된 가격으로 상품 구매 가능 여부 확인

조치 방법

  1. 모든 비즈니스 로직에서 예상된 프로세스 흐름을 검토하여, 중간 단계를 생략하거나 우회할 수 없도록 플로우 제어 로직을 추가하여, 사용자가 단계별로 진행했는지 검증하도록 구현
  2. 인증이 필요한 주요 정보 페이지에 접근 요청자의 권한을 검증하는 로직을 구현하고 임의로 수정할 수 없도록 서버 사이드에서 구현된 프로세스를 사용(세션 기반 접근 통제, 토큰 기반 접근 통제, Referer 검증 등)

Java

세션을 확인하여 비인가자의 접근을 통제하는 로직의 추가 예시

세션을 통한 비인가자 접근 통제 로직

public class SessionConfig implements WebMvcConfigurer {
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new SessionInterceptor())
                .addPathPatterns("/home", "/board/**")
                .excludePathPatterns("/login", "/register", "/error");
    }
    //비공개 페이지와 공개용 페이지 정의
}

public class SessionInterceptor implements HandlerInterceptor {
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        if (request.getSession().getAttribute("user") == null) {
            response.sendRedirect("/login");
            return false;
        }
        //보호된 페이지 접근 시 요청을 가로채, preHandle 메서드를 호출하여 세션을 검증
        return true;
    }
}

ASP.NET

Page_Load : ASP.NET Web Form에서 제공하는 이벤트 핸들러. 페이지 생명주기의 일부로써, 페이지의 로드 시마다 자동으로 호출. ASP.NET 런타임은 페이지 클래스에서 Page_Load라는 이름의 메서드를 찾아 자동으로 이동하며, 페이지가 로드될 때 실행해야 하는 초기화 코드를 넣는데 주로 사용

Page_Load 메서드를 통한 세션 검증 로직

protected void Page_Load(object sender, EventArgs e) {
    if (Session["UserName"] == null) {
         //세션 내 UserName 키값이 존재하지 않으면 접근권한 없음
         Response.Redirect("~/Login.aspx");
    }
}

어트리뷰트 : 코드의 메타데이터를 나타내는데 사용되는 선언적 태그. 클래스, 메서드, 속성, 이벤트, 필드 등과 같은 다양한 프로그래밍 요소에 추가 정보를 제공. [Authorize] 어트리뷰트의 경우, 컨트롤러나 액션 메서드에 대한 접근을 인증된 사용자로 제한하는 기능을 담당함

[Authorize] 어트리뷰트를 통한 특정 페이지 접근 정책 설정 예시

//설정 파일(Program.cs) 내 사용자 정의 권한 정책 생성
builder.Services.AddAuthorization(options => {
    options.AddPolicy("AdminOnly", policy => policy.RequireClaim("Auth", "admin"));
});

//로그인 컨트롤러에서 auth값 클레임 추가
[HttpPost]
public async Task<IActionResult> Login(string username, string password) {
    var user = _context.Users.FirstOrDefault(u => u.Username == username);
    if (user != null) {
        var result = _passwordHasher.VerifyHashedPassword(user, user.Password, password);
         if (result == PasswordVerificationResult.Success) {
             var claims = new List<Claim> {
                 new Claim(ClaimTypes.Name, username),
                 new Claim("FullName", user.Name),
                 new Claim("Auth", user.Auth)
             };
         }
    }
}

//권한 제어 페이지 컨트롤러 내 [Authorize] 어트리뷰 사용
[Authorize(Policy = "AdminOnly")]
public class AdminController : Controller {
    public IActionResult Index() {
        return View();
    }
}

PHP

세션 변수 내 플로우 제어 값 설정 로직

session_start();
if ($step_completed) {
    // ...
}