[2025-07-15] SSRF

🦥 본문

정의

Server Side Request Forgery. 공격자가 조작한 요청을 통해 서버가 공격자가 지정한 주소로 HTTP 요청을 보내도록 유도하는 공격

동작 흐름

image.png

image.png

예시

  • 이용자가 입력한 URL에 요청을 보내는 경우

    어떤 이미지 업로드 기능이 URL을 입력 받아 서버가 이미지를 대신 가져오는 구조

      GET /fetch?url=http://localhost:8000/admin 
    

    위와 같은 URL을 보내어 서버 내부망을 접근하여 내부 리소스를 간접적으로 조회할 수 있다.

  • 웹 서비스의 요청이 URL에 이용자의 입력값이 포함되는 경우.
    • ../ 같은 방식으로 다른 내부망 API를 사용할 수 있다.
    • #을 통해 주석 처리하는 방식도 사용할 수 있다

         def user_search():
        	user_name = request.args.get("user_name", "")
        	user_type = "public"
        	response = requests.get(f"{INTERNAL_API}/user/search?user_name={user_name}&user_type={user_type}")
      

      위의 코드에서 public 권한만 사용할 수 있는 것처럼 보이지만 secret&user_type=private#를 보내 user_type을 private 권한으로 변경할 수 있다.

  • 웹 서비스의 요청 Body에 이용자의 입력값이 포함되는 경우
    • &를 통해 파라미터를 추가하여 기존의 값을 덮어씌울 수 있다.

        session["idx"] = "guest"
        data = f"title={title}&body={body}&user={session['idx']}
      

      위의 코드에서 title에 title&user=admin 을 넣으면 guest가 덮어씌워져서 admin으로 작동하게 된다.

대응 방안

  1. 최소 권한 원칙 적용 : 서버 혹은 클라우드 서비스 별 권한을 최소 권한으로 설정하여 피해 최소화 → Mitigation
  2. 로그 및 모니터링 강화 : 인바운드/아웃바운드 트래픽에 대한 모니터링 강화 및 내부망 workload 간 트래픽 감사
  3. 입력값 필터링 : SSRF를 시도하려는 변조된 트래픽을 막기 위한 입력값 필터링이 WAS(웹 어플리케이션 서버) 단에서 수행되어야만 함

Categories:

Updated:

Leave a comment