HTTP 401 & 403 상태코드 우회 방법 완전 정복
웹 애플리케이션 보안 테스트나 정찰을 하다 보면 흔히 마주치는 두 가지 상태코드가 있습니다. 바로 401 Unauthorized와 403 Forbidden입니다. 이 코드들은 단순한 에러 응답처럼 보일 수 있지만, 내부 시스템을 이해하고 우회하는 실마리가 되기도 합니다. 이번 글에서는 HTTP 401, 403 상태코드의 개념부터 이를 우회하는 다양한 기법까지 자세히 정리해보겠습니다.
HTTP 상태코드 401과 403의 의미
401 Unauthorized
401 상태코드는 말 그대로 인증되지 않은 사용자의 요청에 대해 서버가 접근을 허용하지 않을 때 반환됩니다. 표준 명세상 Unauthorized(미승인)이라는 용어를 사용하지만, 실질적으로는 ‘인증 필요’를 의미합니다. 클라이언트 측에서 적절한 인증 정보를 제공하지 않으면 요청이 실패합니다.
403 Forbidden
403 상태코드는 인증 여부와 관계없이 권한이 없는 사용자에게 접근을 거부할 때 사용됩니다. 서버는 클라이언트가 누군지 알고 있지만, 요청한 리소스에 접근할 권한이 없다고 판단합니다. 웹 관리자나 방화벽 설정에 의해 특정 IP, 유저에 대한 접근이 차단되어 있을 수 있습니다.
401과 403 우회(BYPASS) 전략
401 또는 403 응답이 반환되었을 때, 단순히 포기하지 말고 아래와 같은 기법들을 활용해 우회를 시도할 수 있습니다.
HTTP Method 변경
HTTP 요청 메서드는 다양한 방식으로 접근할 수 있도록 구성되어 있습니다. GET, POST, PUT, DELETE, OPTIONS, PATCH, HEAD 등 다양한 메서드를 시도해보면 접근이 허용되는 경우가 존재합니다.
예시:
GET /admindirectory/ HTTP/1.1 POST /admindirectory/ HTTP/1.1 PUT /admindirectory/ HTTP/1.1
때로는 서버에서 특정 메서드만 필터링하고 나머지는 허용하는 경우가 있기 때문에 유용한 테크닉입니다.
URL 인코딩 우회
URL 인코딩을 통해 서버의 필터링을 우회할 수 있습니다. //admin과 같은 경로를 다음과 같이 다양한 인코딩 방식으로 변형합니다.
-
%2fadmin -
%252fadmin(더블 인코딩) -
%ef%bc%8fadmin(유니코드 인코딩)
Path Traversal (경로 이동)
경로 조작을 통해 서버가 허용하지 않는 디렉토리에 접근할 수 있습니다. 다음과 같은 방식으로 우회 시도를 해볼 수 있습니다.
-
/secret/./ -
/secret// -
/.;secret -
/secret.html -
/secret? -
/secret# -
/%2e/secret -
/..%00,/..%01
이 외에도 다양한 변형을 통해 필터 우회를 노려볼 수 있습니다.
대소문자 우회
일부 서버에서는 대소문자를 구분하지 않습니다. 이 경우 /admin 대신 /ADMIN, /AdMiN 등으로 변경하여 우회할 수 있습니다.
또한 API의 버전 정보 변경을 통해도 우회 가능할 수 있습니다.
예:
-
/v3/users_data/1234→ 403 Forbidden -
/v1/users_data/1234→ 200 OK
HTTP 헤더 조작
HTTP 헤더에는 클라이언트의 정보를 담는 다양한 항목이 있습니다. 이 중 일부를 조작하면 서버를 속여 우회가 가능합니다.
사용 가능한 헤더 예시:
-
X-Forwarded-For: 127.0.0.1 -
Referer: http://localhost -
Host: localhost -
X-Real-IP -
X-Original-URL
특히 IP 기반 필터링을 사용하는 서버에서는 X-Forwarded-For 조작만으로도 우회가 가능한 경우가 있습니다.
URL Fragment 삽입
URL의 끝에 #fragment를 삽입하면 일부 서버는 이 fragment 이후를 무시합니다.
예:
-
http://trust.com/admin#fragment→ 접근 허용
또한 X-Rewrite-URL을 사용하는 서버의 경우 다음과 같이 우회가 가능합니다.
GET / HTTP/1.1
X-Rewrite-URL: /admin/
User-Agent 조작
User-Agent를 특정 브라우저나 운영체제로 설정하면 필터링을 우회할 수 있는 경우가 있습니다.
예:
-
User-Agent: Googlebot -
User-Agent: curl/7.68.0
서버는 특정 User-Agent만 허용하도록 구성된 경우가 있으므로 이 방법도 고려해볼 수 있습니다.
프로토콜 변경
HTTP 프로토콜의 버전을 변경하거나, HTTPS → HTTP로 변경하는 방식으로도 우회가 가능할 수 있습니다.
-
https://trust.com→ 403 -
http://trust.com→ 200 OK
JSON 구조 변경 (API 활용 시)
JSON 파라미터를 아래와 같이 변형하면 인증 우회가 가능할 수 있습니다.
-
{"id":111}→ 401 -
{"id":[111]}→ 200 OK -
{"id":{"id":111}}→ 200 OK -
user_id=ATTACKER_ID&user_id=VICTIM_ID→ Parameter Pollution 우회
리뷰를 마치며
401과 403 상태코드는 단순히 접근 불가라는 메시지를 전달하는 것이 아니라, 시스템 보안 정책을 엿볼 수 있는 중요한 단서이기도 합니다. 이러한 상태코드들을 마주했을 때 우회 시도는 해커의 전유물이 아닌 보안 테스터에게도 필수적인 과정입니다. 위에 소개한 다양한 기법들을 조합해 사용하면 웹 보안 점검의 깊이를 한층 더할 수 있습니다.
단, 우회 시도는 반드시 합법적인 테스트 환경에서만 수행되어야 하며, 타인의 시스템에 무단 접근하는 행위는 불법입니다. 항상 윤리적인 해커 정신을 바탕으로 테스트를 진행하시기 바랍니다.

